您的位置:首页 > 移动开发

Android WebView探索 二、Naive拦截Web请求

2016-05-29 16:24 525 查看
上一节说到可以使用<a/>超链接标签来定义相应的协议,当用户点击了此标签之后,客户端能拦截到此事件,然后进行拦截并作出相应的处理:方法是自定义一个WebViewClient,然后给webView设置WebViewClient,这样在点击超链接的时候就能拿到相应的回调。第一节的地址为
Android WebView探索 一、Naive与WebView的互相调用

因为我们可以拦截到整个超链接标签的uri,所以,我们根据以下三个步骤来进行自定义拦截:

 1、判断uri中的协议,如果协议不是http,即超链接不是跳转到另外一网页我们就可以进行拦截。
2、判断其path,根据path来决定需要执行的动作
3、得到uri中的参数值
下面为代码:

private class Client extends WebViewClient {

private static final String PROTOCOL_CUSTOM
4000
= "heng";

private static final String PATH_TOAST = "/toast";

/**
* 是否应该拦截WebView访问新的URL的方法,返回true表示拦截,返回false表示不拦截
*
* @param view
* @param urlString WebView访问的新的String
* @return
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String urlString) {

Uri uri = Uri.parse(urlString);
String scheme = uri.getScheme();

//当其协议等于自定义的协议才会进行拦截,如果不等于,那么不做拦截
if (scheme.equals(PROTOCOL_CUSTOM)) {

String path = uri.getPath();
//得到对应的path,可以根据path知道web想要做出的动作是什么
if (path.equals(PATH_TOAST)){

//知道需要作出的动作后,得到参数值,执行相应的动作
String parameter = uri.getQueryParameter("arg");
Toast.makeText(MainActivity.this,parameter,Toast.LENGTH_SHORT).show();
}

Log.d("Main","拦截成功");
return  true;
}

return false;
}
}


使用此WebViewClient的代码为;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mWebView = (WebView) findViewById(R.id.main_wv);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(this, "naive");

//为WebView设置相应的回调
mWebView.setWebViewClient(new Client());
mWebView.loadUrl("file:///android_asset/demo.html");

}


待拦截的HTML的代码:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">

</head>
<body>
<a href="heng://0.0.0.0/toast?arg=hello web">链接</a>
</body>
</html>


下面为整个MainActivity的源码:

public class MainActivity extends Activity {

private WebView mWebView;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = (WebView) findViewById(R.id.main_wv); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.addJavascriptInterface(this, "naive"); //为WebView设置相应的回调 mWebView.setWebViewClient(new Client()); mWebView.loadUrl("file:///android_asset/demo.html"); }

private class Client extends WebViewClient {

private static final String PROTOCOL_CUSTOM = "heng";

private static final String PATH_TOAST = "/toast";

/**
* 是否应该拦截WebView访问新的URL的方法,返回true表示拦截,返回false表示不拦截
*
* @param view
* @param urlString WebView访问的新的String
* @return
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String urlString) {

Uri uri = Uri.parse(urlString);
String scheme = uri.getScheme();

//当其协议等于自定义的协议才会进行拦截,如果不等于,那么不做拦截
if (scheme.equals(PROTOCOL_CUSTOM)) {

String path = uri.getPath();
//得到对应的path,可以根据path知道web想要做出的动作是什么
if (path.equals(PATH_TOAST)){

//知道需要作出的动作后,得到参数值,执行相应的动作
String parameter = uri.getQueryParameter("arg");
Toast.makeText(MainActivity.this,parameter,Toast.LENGTH_SHORT).show();
}

Log.d("Main","拦截成功");
return true;
}

return false;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: