Android之WebView案例分析
来源:互联网 发布:linux 路由metric 编辑:程序博客网 时间:2024/06/06 01:57
WebView案例分析
WebView(网络视图)能加载显示网页,可以将其视为一个浏览器。它使用了WebKit渲染引擎加载显示网页。
<uses-permission android:name="android.permission.INTERNET" />
调用WebView的loadUrl()方法,设置WevView要显示的网页:
互联网用:webView.loadUrl("http://www.baidu.com");
本地文件用:webView.loadUrl("file:///android_asset/index.html"); 本地文件存放在:assets文件中
其中以优酷网为特殊:在android 4.4 平台webview 的 chorme内核无法解析<a href=”http://xxx” target=”video”> 视频链接</a> 像这个标签 中 target=”video”就是当前版本无法解析的问题,我们应该怎么去解决这个问题呢?来分析一下,我们之前遇到的超链接都是target=”_blank” 或者”_self” 那么我们是不是应该考虑将target 更改为_self 呢。来尝试一下
这是我们的js代码,那只需要我们调用一下这段js代码就可以将target=”video”更改为target=”_self”.WebView的 loadUrl 就可以直接调用js代码只要在js代码的字符串前添加javascript: 就可以了。这样就帮助了chorme 内核将我们知道他们无法解析的属性给提前解析了。
案例2去除youku 搜库button提交form表单拦截事件 onsubmit
接下来我们就应该考虑怎么去查找当前网页的有效播放地址
案例2这个获取视频其实是不太规范的,一般的视频网站都会在正片前有广告对不对,那广告你还告诉用户说来体验体验我们的播放器吧,用户一看,我靠让我体验广告来了,说不定分分钟卸载了。那我们来看看怎么去过滤广告
总体步骤就变成在获取视频的时候看一下这个视频的长度,如果视频长度过短,就说明这个视频可能就是一个广告,那像这样的话,我们就需要重新去获取视频
本文版权归传智播客Android培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Android培训学院
首发:http://www.itcast.cn/android/
WebView(网络视图)能加载显示网页,可以将其视为一个浏览器。它使用了WebKit渲染引擎加载显示网页。
mWebView = new WebView(this);
setContentView(mWebView);
需要在AndroidManifest.xml文件中添加权限,否则会出现Web page not available错误。setContentView(mWebView);
<uses-permission android:name="android.permission.INTERNET" />
调用WebView的loadUrl()方法,设置WevView要显示的网页:
互联网用:webView.loadUrl("http://www.baidu.com");
本地文件用:webView.loadUrl("file:///android_asset/index.html"); 本地文件存放在:assets文件中
1.1. 在WebView中如何让JS与Java安全地互相调用
可参考文章http://www.pedant.cn/2014/07/04/webview-js-java-interface-research/1.2. JS与Java的互调
1.2.1. Java调用JS
案例1以加载视频聚合类网站为例 类似优酷/乐视网/凤凰网其中以优酷网为特殊:在android 4.4 平台webview 的 chorme内核无法解析<a href=”http://xxx” target=”video”> 视频链接</a> 像这个标签 中 target=”video”就是当前版本无法解析的问题,我们应该怎么去解决这个问题呢?来分析一下,我们之前遇到的超链接都是target=”_blank” 或者”_self” 那么我们是不是应该考虑将target 更改为_self 呢。来尝试一下
var ahrefs = document.getElementsByTagName('a');
if( ahrefs != undefined ) {
for(i = 0 ; i<ahrefs.length;i++ ){
if( ahrefs[i].target == 'video'){
ahrefs[i].target = '_self';}
}
}
if( ahrefs != undefined ) {
for(i = 0 ; i<ahrefs.length;i++ ){
if( ahrefs[i].target == 'video'){
ahrefs[i].target = '_self';}
}
}
这是我们的js代码,那只需要我们调用一下这段js代码就可以将target=”video”更改为target=”_self”.WebView的 loadUrl 就可以直接调用js代码只要在js代码的字符串前添加javascript: 就可以了。这样就帮助了chorme 内核将我们知道他们无法解析的属性给提前解析了。
案例2去除youku 搜库button提交form表单拦截事件 onsubmit
mWebView.loadUrl("javascript: var fromSearch = document.getElementById('mheader_search3');"
+ "if( fromSearch != undefined ) { fromSearch.target='_self' ; fromSearch.onsubmit = ''; }");
+ "if( fromSearch != undefined ) { fromSearch.target='_self' ; fromSearch.onsubmit = ''; }");
1.2.2. JS调用Java
案例1类似移动端手机迅雷在当前网页查找可用视频地址,查到以后提示用户使用体验更佳的播放器进行播放 settings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JavaInterface(), "java");
JavaInterface 为js 调用java代码的接口mWebView.addJavascriptInterface(new JavaInterface(), "java");
public class JavaInterface{
public void showVideoTips(String videoUrl){
//这里我们弹出一个dialog 提示用户
}
public void isADUrl(String videoUrl){
//记录当前时候是广告地址
}}
public void showVideoTips(String videoUrl){
//这里我们弹出一个dialog 提示用户
}
public void isADUrl(String videoUrl){
//记录当前时候是广告地址
}}
接下来我们就应该考虑怎么去查找当前网页的有效播放地址
mWebView.loadUrl("javascript:
var vs = document.getElementsByTagName('video');"
+ "if(vs == undefined) {return;}
var v = vs[0];
if(v != undefined){
var vurl = v.src;
window.java.showVideoTips(vurl);
}else{
window.java.showVideoTips(''); } ");
var vs = document.getElementsByTagName('video');"
+ "if(vs == undefined) {return;}
var v = vs[0];
if(v != undefined){
var vurl = v.src;
window.java.showVideoTips(vurl);
}else{
window.java.showVideoTips(''); } ");
案例2这个获取视频其实是不太规范的,一般的视频网站都会在正片前有广告对不对,那广告你还告诉用户说来体验体验我们的播放器吧,用户一看,我靠让我体验广告来了,说不定分分钟卸载了。那我们来看看怎么去过滤广告
String js = "javascript: var v=document.getElementsByTagName('video')[0]; if(v!=undefined){
var vurl = v.src;
if(v.duration == 1|| v.duration > " + webSiteAD.len+ "){ window.LetvFish.getPlayUrl(vurl);
}else{
Window.java.isADUrl(vurl);
}
}else{
window.java.showVideoTips(''); } ";
mWebView.loadUrl(js);
var vurl = v.src;
if(v.duration == 1|| v.duration > " + webSiteAD.len+ "){ window.LetvFish.getPlayUrl(vurl);
}else{
Window.java.isADUrl(vurl);
}
}else{
window.java.showVideoTips(''); } ";
mWebView.loadUrl(js);
总体步骤就变成在获取视频的时候看一下这个视频的长度,如果视频长度过短,就说明这个视频可能就是一个广告,那像这样的话,我们就需要重新去获取视频
1.3. WebView中userAgent的妙用
1.3.1. 模拟桌面版浏览器
mWebView.setUserAgent(“Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36”);
设置过后userAgent再次访问效果就变成了桌面版页面了1.3.2. 取消WebView与默认APP之间的跳转
凤凰网修改 useragent 中 Linux 字符 防止凤凰网判断 useragent 后视图启动自己app 造成跳转失败。因为并不是所有的网页都会跳转到自己的APP,所以我们要记录一下默认的userAgent,然后在不需要更改userAgent的时候还原 //更改凤凰网userAgent防止到app的跳转
WebSettings setting = mWebView.getSettings();
String user_agent = setting.getUserAgentString();
setting.setUserAgentString(user_agent.replace("Linux", ""));
// 保存 useragent 凤凰网访问需要特殊处理 useragent 非凤凰网还原useragent
if (defaultUserAgent == null) {
defaultUserAgent = mWebView.getSettings().getUserAgentString();
}
//在不需要更改useragent的时候还原
if (defaultUserAgent != null) { WebView.getSettings().setUserAgentString(defaultUserAgent);
}
WebSettings setting = mWebView.getSettings();
String user_agent = setting.getUserAgentString();
setting.setUserAgentString(user_agent.replace("Linux", ""));
// 保存 useragent 凤凰网访问需要特殊处理 useragent 非凤凰网还原useragent
if (defaultUserAgent == null) {
defaultUserAgent = mWebView.getSettings().getUserAgentString();
}
//在不需要更改useragent的时候还原
if (defaultUserAgent != null) { WebView.getSettings().setUserAgentString(defaultUserAgent);
}
本文版权归传智播客Android培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Android培训学院
首发:http://www.itcast.cn/android/
0 0
- Android之WebView案例分析
- Android学习笔记之ProgressBar案例分析
- Android基础之Intent Flag案例分析
- Android基础之LaunchMode案例分析
- Android WebView缓存分析
- Android WebView缓存分析
- Weex Android SDK源码分析之Module(webview)
- Android webview使用漏洞案例解析
- android ftp案例分析
- Android 性能分析案例
- android ANR 案例分析
- android ANR 案例分析
- Android 性能分析案例
- Android 性能分析案例
- Android 性能分析案例
- Android 性能分析案例
- Android 性能分析案例
- Android 性能分析案例
- Android之多次解绑抛出异常原因
- nil、Nil、NULL、NSNull的区别
- 创建高性能的索引
- 端口
- Oracle 中count(1) 和count(*) 的区别
- Android之WebView案例分析
- 分布式服务框架 Zookeeper -- 管理分布式环境中的数据
- ios-文件写入地址
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- android_json教程
- 求同与求异思维
- 下载网络图片
- oracle转db2出现的问题
- Android之java线程池总结