写一个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;
}
}