Android WebViewClient與H5 Web網頁互動
阿新 • • 發佈:2019-01-07
寫一個web.html測試網頁放到res/assets下:
<html>
<body>
<a href="sms:13800138000">傳送簡訊</a>
<br>
<a href="tel:13800138000">撥打電話</a>
</body>
</html>
Java程式碼:
package zhangphil.book; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.KeyEvent; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends AppCompatActivity { private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = findViewById(R.id.webview); mWebView.loadUrl("file:///android_asset/web.html"); WebSettings mWebSettings = mWebView.getSettings(); //啟用JavaScript mWebSettings.setJavaScriptEnabled(true); mWebSettings.setUseWideViewPort(true); mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true); mWebView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { System.out.println("onPageStarted->" + url); super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { System.out.println("onPageFinished->" + url); super.onPageFinished(view, url); } @Override public void onLoadResource(WebView view, String url) { System.out.println("onLoadResource->" + url); super.onLoadResource(view, url); } @Override public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { System.out.println("使用者點選了返回鍵"); } return super.shouldOverrideKeyEvent(view, event); } //返回true,所要載入的url連結將轉交給宿主應用程式處理。 //返回false,所要載入的url連結將由當前的WebView處理。 @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); return protocolConvert(url); } //返回true,所要載入的url連結將轉交給宿主應用程式處理。 //返回false,所要載入的url連結將由當前的WebView處理。 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return protocolConvert(url); } }); } //協議轉換。 private boolean protocolConvert(String url) { boolean bool = false; if (url.startsWith("http:") || url.startsWith("https:")) { bool = false; } /** * 解析非標準化的url連結,如以“sms:”或“tel:”開頭的連結。 */ if (url.startsWith("sms:")) { //傳送簡訊。 Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(url)); startActivity(intent); bool = true; } if (url.startsWith("tel:")) { //撥打電話。 Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url)); startActivity(intent); bool = true; } if (url.startsWith("my_protocol:")) { //開發者自己定義的路由協議,由開發者複雜維護跳轉路由。 bool = true; } return bool; } }