教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Android培訓實戰(zhàn)教程之WebView案例分析

更新時間:2015年12月28日14時25分 來源:傳智播客Android培訓學院 瀏覽次數(shù):

WebView案例分析
WebView(網(wǎng)絡視圖)能加載顯示網(wǎng)頁,可以將其視為一個瀏覽器。它使用了WebKit渲染引擎加載顯示網(wǎng)頁。
        mWebView = new WebView(this);
        setContentView(mWebView);
需要在AndroidManifest.xml文件中添加權(quán)限,否則會出現(xiàn)Web page not available錯誤。
  <uses-permission android:name="android.permission.INTERNET" />
調(diào)用WebView的loadUrl()方法,設置WevView要顯示的網(wǎng)頁:
  互聯(lián)網(wǎng)用:webView.loadUrl("http://www.baidu.com"); 
  本地文件用:webView.loadUrl("file:///android_asset/index.html"); 本地文件存放在:assets文件中

1.1. 在WebView中如何讓JS與Java安全地互相調(diào)用

可參考文章http://www.pedant.cn/2014/07/04/webview-js-java-interface-research/

1.2. JS與Java的互調(diào)

1.2.1. Java調(diào)用JS

案例1以加載視頻聚合類網(wǎng)站為例 類似優(yōu)酷/樂視網(wǎng)/鳳凰網(wǎng)
其中以優(yōu)酷網(wǎng)為特殊:在android 4.4 平臺webview 的 chorme內(nèi)核無法解析<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';}
}
}
 
這是我們的js代碼,那只需要我們調(diào)用一下這段js代碼就可以將target=”video”更改為target=”_self”.WebView的 loadUrl 就可以直接調(diào)用js代碼只要在js代碼的字符串前添加javascript:  就可以了。這樣就幫助了chorme 內(nèi)核將我們知道他們無法解析的屬性給提前解析了。
案例2去除youku 搜庫button提交form表單攔截事件 onsubmit
   mWebView.loadUrl("javascript: var fromSearch = document.getElementById('mheader_search3');"
                        + "if( fromSearch != undefined ) { fromSearch.target='_self' ; fromSearch.onsubmit = '';  }");

1.2.2. JS調(diào)用Java

案例1類似移動端手機迅雷在當前網(wǎng)頁查找可用視頻地址,查到以后提示用戶使用體驗更佳的播放器進行播放
  settings.setJavaScriptEnabled(true);
  mWebView.addJavascriptInterface(new JavaInterface(), "java");
JavaInterface 為js 調(diào)用java代碼的接口
 public class JavaInterface{
  public void showVideoTips(String videoUrl){
    //這里我們彈出一個dialog 提示用戶
}
public void isADUrl(String videoUrl){
 //記錄當前時候是廣告地址
}}
 
接下來我們就應該考慮怎么去查找當前網(wǎng)頁的有效播放地址
   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(''); }                                                  ");
                   
 
 
案例2這個獲取視頻其實是不太規(guī)范的,一般的視頻網(wǎng)站都會在正片前有廣告對不對,那廣告你還告訴用戶說來體驗體驗我們的播放器吧,用戶一看,我靠讓我體驗廣告來了,說不定分分鐘卸載了。那我們來看看怎么去過濾廣告
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);
 
 
總體步驟就變成在獲取視頻的時候看一下這個視頻的長度,如果視頻長度過短,就說明這個視頻可能就是一個廣告,那像這樣的話,我們就需要重新去獲取視頻

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之間的跳轉(zhuǎn)

 鳳凰網(wǎng)修改 useragent 中 Linux 字符 防止鳳凰網(wǎng)判斷 useragent 后視圖啟動自己app 造成跳轉(zhuǎn)失敗。因為并不是所有的網(wǎng)頁都會跳轉(zhuǎn)到自己的APP,所以我們要記錄一下默認的userAgent,然后在不需要更改userAgent的時候還原
 //更改鳳凰網(wǎng)userAgent防止到app的跳轉(zhuǎn)
 WebSettings setting = mWebView.getSettings();
 String user_agent = setting.getUserAgentString();
 setting.setUserAgentString(user_agent.replace("Linux", ""));
 
 
// 保存 useragent 鳳凰網(wǎng)訪問需要特殊處理 useragent 非鳳凰網(wǎng)還原useragent
 if (defaultUserAgent == null) {
      defaultUserAgent = mWebView.getSettings().getUserAgentString();
  }
 
//在不需要更改useragent的時候還原
 if (defaultUserAgent != null) {                            WebView.getSettings().setUserAgentString(defaultUserAgent);
 }
 
 
本文版權(quán)歸傳智播客Android培訓學院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Android培訓學院
首發(fā):http://oisangadgets.com/android/
0 分享到:
和我們在線交談!