android 与javascript 交互

准备(前提)条件

  1. android app 中有使用到webview
  2. webview 加载本地或者网络端的html

对于Android调用JS代码的方法有:

  1. 通过WebView的loadUrl()
  2. 通过WebView的evaluateJavascript()

代码展示

        // 设置与Js交互的权限
        mWebView.getSettings().setJavaScriptEnabled(true);
        // 无参数 
        mWebView.loadUrl("javascript:javacalljs()");
        // 有参数
        mWebView.loadUrl("javascript:javacalljswith('http://blog.csdn.net/Leejizhou')");
        // 只需要将第一种方法的loadUrl()换成下面该方法即可
        mWebView.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                //此处为 js 返回的结果
            }
        });

对于JS调用Android代码的方法有:

  1. 通过WebView的addJavascriptInterface()进行对象映射
  2. 通过 WebViewClient 的shouldOverrideUrlLoading()方法回调拦截 url、onPageFinished 在加载完后注入其他代码
  3. 通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

代码展示

        // 给js 提供访问android 的接口
        mWebView.addJavascriptInterface(MainActivity.this, "android");
        // shouldOverrideUrlLoading()方法回调拦截 url 等
        mWebView.setWebViewClient(new MyWebViewClient());
        // 重写OnJsAlert 之类的方法
        mWebView.setWebChromeClient(new MyWebChromeClient());

js 调用android 代码示例:

<input type="button" value="点击调用java代码" onclick="window.android.startFunction()"/>

拦截回调url 注入代码等

    class MyWebViewClient extends WebViewClient {
        boolean loadingFinished;
        boolean redirect;

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            String url = request.getUrl().toString();
            Log.d(TAG, "shouldOverrideUrlLoading: rul: " + url);
            if (!loadingFinished) {
                redirect = true;
            }

            loadingFinished = false;
            // mWebView.loadUrl("https:www.bing.com");
            mWebView.loadUrl(request.getUrl().toString());
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.d(TAG, "onPageStarted: ");
            super.onPageStarted(view, url, favicon);
            loadingFinished = false;
            //SHOW LOADING IF IT ISNT ALREADY VISIBLE
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            Log.d(TAG, "onPageFinished: ");
            if (!redirect) {
                loadingFinished = true;
            }

            if (loadingFinished && !redirect) {
                //HIDE LOADING IT HAS FINISHED
                imgReset();
// mWebView.loadUrl("javascript:" + "window.alert('Js injection success')");
                Log.d(TAG, "onPageFinished: alert");
            } else {
                redirect = false;
            }
        }
    }

方法回调拦截JS对话框

    class MyWebChromeClient extends WebChromeClient {
        @Override
        public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
            AlertDialog.Builder b = new AlertDialog.Builder(MainActivity.this);
            b.setTitle("Alert");
            b.setMessage(message);
            b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    result.confirm();
                }
            });
            b.setCancelable(false);
            b.create().show();
            return true;
        }
    }
Comments
Write a Comment