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中的参数值
下面为代码:
使用此WebViewClient的代码为;
待拦截的HTML的代码:
下面为整个MainActivity的源码:
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;
}
}
}
相关文章推荐
- Drawable简介之-------shape
- ubuntu14的unity desktop显示异常
- iOS计步器功能实现之CoreMotion如何读取数据(二)
- android开发_短信smsManager的导包问题
- Happy Number
- vitamio视频框架-导入方法
- 【iOS】更新 CocoaPods 后 Podfile 报错
- 教你如何在 Android 使用多线程下载文件
- android源码解析(三十)-->触摸事件分发流程
- iOS-OC中使用KVC转换JSON数据(笔记)
- Android项目笔记二:用户自定义保存路径+文件列表显示+权限显示
- iOS学习- 05 Tab Bar Controller
- iOS中self.xxx 和 _xxx 下划线的区别
- 一个三年Android开发的总结 - Android应用的反编译
- Android Studio Gradle "" project refresh failed
- 使用Intent在Activity与Fragment之间传递数据中存在的返回键错乱问题
- 在 Unity 中怎样创建 UI
- Android OpenGL ES2.0编程教程系列之响应触摸事件(六)
- Android Error:Error converting bytecode to dex: Cause: com.android.dex.DexException: Multiple dex fi
- android color