Android webview详解及js交互(js调用android代码)

1. Android:最全面的 Webview 详解

2. Android:你要的WebView与 JS 交互方式 都在这里了

3. 你不知道的 Android WebView 使用漏洞

4. javascriptinterface与java交互在android4.2以下版本的解决方案


简记

1. WebSettings类

//声明WebSettings子类
WebSettings webSettings = webView.getSettings();

//如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
webSettings.setJavaScriptEnabled(true);  

//支持插件
webSettings.setPluginsEnabled(true); 

//设置自适应屏幕,两者合用
webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小 
webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

//缩放操作
webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件

//其他细节操作
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存 
webSettings.setAllowFileAccess(true); //设置可以访问文件 
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口 
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式

2. WebViewClient类和WebChromeClient类的区别

 WebViewClient类: 处理各种通知 & 请求事件

 WebChromeClient类: 辅助 WebView 处理 Javascript 的对话框,网站图标,网站标题等等。

        webView.loadUrl("http://www.baidu.com");  
        //覆盖WebView默认通过第三方或者是系统浏览器打开网页的行为,使得网页可以在WebView中打开  
        webView.setWebViewClient(new WebViewClient(){  
            @Override  
            public boolean shouldOverrideUrlLoading(WebView view, String url) {  
                //返回值是true的时候是控制网页在WebView中去打开,如果为false调用系统浏览器或第三方浏览器打开  
                view.loadUrl(url);  
                return true;  
            }  
        });  
        //设置WebChromeClient类
        mWebview.setWebChromeClient(new WebChromeClient() {
            //获取网站标题
            @Override
            public void onReceivedTitle(WebView view, String title) {
                System.out.println("标题在这里");
                mtitle.setText(title);
            }
            //获取加载进度
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress < 100) {
                    String progress = newProgress + "%";
                    loading.setText(progress);
                } else if (newProgress == 100) {
                    String progress = newProgress + "%";
                    loading.setText(progress);
                }
            }
        });

3. JS交互

对于Android调用JS代码的方法有2种: 
1. 通过WebView的loadUrl() 
2. 通过WebView的evaluateJavascript()

对于JS调用Android代码的方法有3种: 
1. 通过WebView的addJavascriptInterface()进行对象映射 
2. 通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url 
3. 通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

    wv = (WebView) findViewById(R.id.webView1);
    wv.getSettings().setJavaScriptEnabled(true); ///------- 设置javascript 可用
    wv.addJavascriptInterface(new JavaScriptInterface(this), "JSInterface"); // 设置js接口  第一个参数事件接口实例,第二个是实例在js中的别名,这个在js中会用到
    wv.loadUrl("file:///android_asset/test.html");
    

    public class JavaScriptInterface {
        Context mContext;
        JavaScriptInterface(Context c) {
            mContext = c;
        }
        //Google 在Android 4.2 版本中规定对被调用的函数以 @JavascriptInterface进行注解从而避免漏洞攻击
        @JavascriptInterface
        public void changeActivity() {
            Intent i = new Intent(MainActivity.this, NextActivity.class);
            startActivity(i);
            finish();
        }
    }




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值