1. 程式人生 > >android5.0以上webview無法播放騰訊等視訊

android5.0以上webview無法播放騰訊等視訊

最近一直在做瀏覽器專案,遇到某些手機線上無法播放騰訊視訊,搞得我很鬱悶,網上查了很多資料,大部分都說開了硬體加速就可以了,可是硬體加速早開了,也沒用。繼續找啊找啊,又看到說是http和https重定向問題,然後又試了下面的方法:

mWebView.setWebViewClient(newWebViewClient(){  
         @Override  
          public boolean shouldOverrideUrlLoading(WebView view, String url) {  
                 if( url.startsWith("http:"
) || url.startsWith("https:") ) { return false; } try{ Intent intent =new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity( intent ); }catch(Exception e){} return
true; }

還是沒有用啊,再仔細看一下我的處理,已經包含了上面的處理,就算改了也沒有用,糾結的很,然後再繼續百度,還找了很久很久,忽然讓我看到了一個評論,具體是說:又要新版本安全提升,需要新增下面的程式碼就行了…:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
getSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}

驚喜的我趕緊去試了下,咦?居然有效哦。然後我就在糾結這是什麼原因,然後在百度了一下,說這可能涉及到Android5.0 WebView中Http和Https混合的問題,下面分析一下前因後果。

原因:

從Android5.0開始,WebView預設不支援同時載入Https和Http混合模式。
知識儲備:
從Android5.0以後,當一個安全的站點(https)去載入一個非安全的站點(http)時,需要配置Webview載入內容的混合模式,一共有如下三種模式:
1. MIXED_CONTENT_NEVER_ALLOW:Webview不允許一個安全的站點(https)去載入非安全的站點內容(http),比如,https網頁內容的圖片是http連結。強烈建議App使用這種模式,因為這樣更安全。
2. MIXED_CONTENT_ALWAYS_ALLOW:在這種模式下,WebView是可以在一個安全的站點(Https)里加載非安全的站點內容(Http),這是WebView最不安全的操作模式,儘可能地不要使用這種模式。
3. MIXED_CONTENT_COMPATIBILITY_MODE:在這種模式下,當涉及到混合式內容時,WebView會嘗試去相容最新Web瀏覽器的風格。一些不安全的內容(Http)能被載入到一個安全的站點上(Https),而其他型別的內容將會被阻塞。這些內容的型別是被允許載入還是被阻塞可能會隨著版本的不同而改變,並沒有明確的定義。這種模式主要用於在App裡面不能控制內容的渲染,但是又希望在一個安全的環境下執行。
分析:
在Android5.0以下,預設是採用的MIXED_CONTENT_ALWAYS_ALLOW模式,即總是允許WebView同時載入Https和Http;而從Android5.0開始,預設用MIXED_CONTENT_NEVER_ALLOW模式,即總是不允許WebView同時載入Https和Http。雖然官網給出的建議是,為了安全考慮,使用MIXED_CONTENT_NEVER_ALLOW模式,但是在實際引用中,當我們的伺服器已經升級到Https,但是一些頁面的資源是第三方的,我們不能要求第三方也都升級到Https,所以我們只能根據系統版本,用程式碼去設定載入模式為MIXED_CONTENT_ALWAYS_ALLOW。

解決方法:

在webview載入頁面之前,設定載入模式為MIXED_CONTENT_ALWAYS_ALLOW,最好做一下版本判斷。