android呼叫js方法
阿新 • • 發佈:2018-12-21
WebViewAcy給到
import android.content.Intent; import android.graphics.Bitmap; import android.net.http.SslError; import android.os.Build; import android.text.TextUtils; import android.view.View; import android.webkit.ConsoleMessage; import android.webkit.JavascriptInterface; import android.webkit.JsResult; import android.webkit.SslErrorHandler; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class WebViewActivity extends BaseActivity { public WebView mWebView; public WebSettings mWebSettings; public String title, res;//res傳遞解密url public TextView mTextView; public ImageView mImageView; public LoadingWindow loadingWindow;//載入dia @Override protected int getLayoutResId() { return R.layout.activity_webview; } @Override protected void initView() { setColor(); StatusBarLightMode(); mWebView = getView(R.id.mWebView); loadingWindow = new LoadingWindow(WebViewActivity.this, mWebView); title = getIntent().getStringExtra("title"); mTextView = getView(R.id.center_TV); mTextView.setText(title); mImageView = getView(R.id.back_IMG); mImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); res = getIntent().getStringExtra("res"); mWebSettings = mWebView.getSettings(); mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true); /** * Webview在安卓5.0之前預設允許其載入混合網路協議內容 * 在安卓5.0之後,預設不允許載入http與https混合內容,需要設定webview允許其載入混合網路協議內容 */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } mWebSettings = mWebView.getSettings(); mWebSettings.setSaveFormData(false); // 是否儲存產生的資料 mWebSettings.setDomStorageEnabled(true); mWebSettings.setAllowFileAccess(true); mWebSettings.setAllowFileAccessFromFileURLs(false); mWebSettings.setAllowUniversalAccessFromFileURLs(false); mWebSettings.setJavaScriptEnabled(true); // 是否啟用JAVA指令碼 mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true); mWebSettings.setSupportZoom(true); mWebSettings.setBuiltInZoomControls(true); // 是否支援縮放 mWebSettings.setDisplayZoomControls(false); mWebSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); mWebSettings.setUseWideViewPort(true); mWebSettings.setLoadWithOverviewMode(true); mWebView.setWebChromeClient(new WebViewActivity.MyWebChromeClient()); mWebView.requestFocusFromTouch(); //java回撥js程式碼,不要忘了@JavascriptInterface這個註解,不然點選事件不起作用 mWebView.addJavascriptInterface(new JsCallJavaObj() { @JavascriptInterface @Override public void toMyFragment() { Intent login = new Intent(WebViewActivity.this, MainActivity.class); login.putExtra("type", 3); startActivity(login); finish(); } }, "app"); mWebView.setWebChromeClient(new WebChromeClient());//這行最好不要丟掉 //該方法解決的問題是開啟瀏覽器不呼叫系統瀏覽器,直接用webview開啟 mWebView.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView mView, String url) { mView.loadUrl(url); return true; } @JavascriptInterface @Override public void onPageStarted(WebView view, String u, Bitmap favicon) { super.onPageStarted(view, u, favicon); loadingWindow.show(); } @JavascriptInterface @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); //攔截上海銀行回撥url //if (url.contains("returnurl/payreturn")) { //注入一段js程式碼 String jsCode = "javascript: (function(){ " + "var btn=document.getElementById('regist_n_submit');" + "btn.onclick=function(){window.app.toMyFragment();} " + "})()"; view.loadUrl(jsCode); //} loadingWindow.dismiss(); } @JavascriptInterface @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { // super.onReceivedSslError(view, handler, error);//注意這個存在重定向url super方法中存在 預設不安全導致空白頁面 handler.proceed(); // handleMessage(Message msg); 其他處理 } }); if (!TextUtils.isEmpty(res)) { mWebView.loadUrl(res); } } // 解決html alert和conse打印不出來的問題 private class MyWebChromeClient extends WebChromeClient { @Override public boolean onConsoleMessage(ConsoleMessage cm) { MsgUtil.e("test", cm.message() + " -- From line " + cm.lineNumber() + " of " + cm.sourceId()); return true; } @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Toast.makeText(WebViewActivity.this, message, Toast.LENGTH_SHORT).show(); result.confirm(); //result.cancel(); return false; } } private interface JsCallJavaObj { void toMyFragment(); } }
WebView呼叫setWebChromeClient 的幾個方法注意的寫在下面
1、Java回撥js程式碼,不要忘了@JavascriptInterface這個註解,不然點選事件不起作用
2、在onPageFinished中呼叫JS的單擊事件以及跳轉應用的頁面
3、onReceivedSslError方法中要注意的是 註釋super(),裡面對於重定向 安全頁面 預設為不安全、
以上就是解決Android呼叫JS的一些方法。程式碼塊中的基本都給到了,拿去就可以用。
紙上得來終覺淺,書到用時方恨少。