android 与javascript 交互
准备(前提)条件
- android app 中有使用到webview
- webview 加载本地或者网络端的html
对于Android调用JS代码的方法有:
- 通过WebView的loadUrl()
- 通过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代码的方法有:
- 通过WebView的addJavascriptInterface()进行对象映射
- 通过 WebViewClient 的shouldOverrideUrlLoading()方法回调拦截 url、onPageFinished 在加载完后注入其他代码
- 通过 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; } }