一、设置webview
// 开启JavaScript支持
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new PhoneJavaScript(), "android");
自己定义的类
public final class PhoneJavaScript {
//一定也要加上这个注解,否则没有用
@JavascriptInterface
public void getPhone(String phone) {
if (!TextUtils.isEmpty(phone) && phone.length() == 11) {
//获取到手机号完成剩下的步骤
}
}
}
二、代码
- 获取html
webView.loadUrl("javascript:window.android.getHtml(document.getElementsByTagName('html')[0].value);");
- 获取body
webView.loadUrl("javascript:window.android.getBody(document.body.innerHTML);");
- 获取input
webView.loadUrl("javascript:window.android.getPhone(document.querySelector('input[type=\"tel\"]').value);");
- 获取input
webView.loadUrl("javascript: var inputs = document.getElementsByTagName('input');" +
"for(var i=0;i<inputs.length;i++){" +
" if(inputs[i].getAttribute('type')=='text' || inputs[i].getAttribute('type')=='tel'|| inputs[i].getAttribute('type')=='number'){" +
" window.android.getPhone(inputs[i].value);" +
" }" +
"}");
三、踩坑注意
1、loadUrl时报错的解决方案
runOnUiThread(new Runnable() {
@Override
public void run() {
webView.loadUrl("javascript:window........");
}
});
2、获取不到解析结果
- 检查接收方法是否唯一
- 检查设置是否正确
四、完整代码
public class MainActivity extends AppCompatActivity {
private WebView webView;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWebView();
}
private void initWebView() {
webView = (WebView) findViewById(R.id.web);
// 开启JavaScript支持
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new PhoneJavaScript(), "android");
webView.loadUrl("http://www.renren.com/");
// 给WebView设置监听
webView.setWebViewClient(new WebViewClient() {
//跳转连接
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 所有连接强制在当前WeiView加载,不跳服务器
webView.loadUrl(url);
return true;
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
runOnUiThread(new Runnable() {
@Override
public void run() {
webView.loadUrl("javascript: var inputs = document.getElementsByTagName('input');" +
"for(var i=0;i<inputs.length;i++){" +
" if(inputs[i].getAttribute('type')=='text' || inputs[i].getAttribute('type')=='tel'|| inputs[i].getAttribute('type')=='number'){" +
" window.android.getPhone(inputs[i].value);" +
" }" +
"}");
}
});
return super.shouldInterceptRequest(view, url);
}
//加载结束
@Override
public void onPageFinished(WebView view, String url) {
// 获取页面内容
webView.loadUrl("javascript:window.android.getHtml(document.getElementsByTagName('html')[0].value);");
super.onPageFinished(view, url);
}
});
}
public final class PhoneJavaScript {
//一定也要加上这个注解,否则没有用
@JavascriptInterface
public void getPhone(String phone) {
Log.e(TAG, "phone==" + phone);
if (!TextUtils.isEmpty(phone) && phone.length() == 11) {
//获取到手机号完成剩下的步骤
}
}
@JavascriptInterface
public void getHtml(String html) {
Log.e(TAG, "html==" + html);
}
}
}