WebView 支持 Html5 video 進(jìn)行全屏播放

本篇目錄

背景

webView播放視頻時(shí)候挫剑,會(huì)遇到一些問題否淤,比如無法全屏播放視頻等。解決方案有以下兩種涯塔,這里著重介紹第二種解決方案鹤啡。

  1. 實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)視頻播放器來播放網(wǎng)絡(luò)視頻(建議利用開源框架);
  2. 自定義WebView實(shí)現(xiàn)利用H5的Video標(biāo)簽來播放視頻蹲嚣,可以解決基本的視頻播放需求递瑰,但是一些效果難以實(shí)現(xiàn);

手機(jī)中HTML5網(wǎng)頁上點(diǎn)全屏后的效果隙畜。



一抖部、啟動(dòng)硬件加速;

需要在AndroidManifest.xml文件中聲明需要使用HardwareAccelerate议惰。務(wù)必強(qiáng)制打開硬件加速慎颗,否則只有聲音沒有畫面,因?yàn)樵贏ndroid 5的部分rom上默認(rèn)關(guān)閉硬件加速的言询,此時(shí)需要強(qiáng)制打開硬件加速俯萎。
方式一:聲明整個(gè)應(yīng)用都需要加速:

< application ... android:hardwareAccelerated ="true">

方式二:在Activity中聲明:

<activity ... android:hardwareAccelerated="true" >

硬件加速配置好后,添加android:configChanges配置
webView所在的Activity添加如下配置运杭,不添加無法全屏播放夫啊。

...
android:configChanges="orientation|screenSize|keyboardHidden"
...

權(quán)限記得添加

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

二、webView控件所在的xml文件內(nèi)容

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mFrameLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:id="@+id/mWebView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>

三辆憔、Activity中初始化webView

1.去掉標(biāo)題撇眯,否則可能導(dǎo)致無法全屏;
2.初始布局中的兩個(gè)控件虱咧;
3.webView一些簡單初始化和配置熊榛,根據(jù)需求靈活修改;

class MyActivity extends Activity {
    ...
    private FrameLayout mFrameLayout;
    private WebView mWebView;
    private InsideWebChromeClient mInsideWebChromeClient;
    //private JavascriptInterface javascriptInterface;
    private String URL = "改成自己需要測試的H5網(wǎng)頁";

    @Override
    protected void onCreate(Bundle saveInstanceState) {
        // 1
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // 2
        mFrameLayout = (FrameLayout) findViewById(R.id.mFrameLayout);
        mWebView = (WebView) findViewById(R.id.mWebView);
        // 3
        initWebView();
        mWebView.loadUrl(URL);
    }

    private void initWebView() {
        WebSettings settings = mWebView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
        settings.setPluginState(WebSettings.PluginState.ON);
        //settings.setPluginsEnabled(true);
        settings.setAllowFileAccess(true);
        settings.setLoadWithOverviewMode(true);
        settings.setUseWideViewPort(true);
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        settings.setCacheMode(WebSettings.LOAD_DEFAULT);
        mInsideWebChromeClient = new InsideWebChromeClient();
        InsideWebViewClient mInsideWebViewClient = new InsideWebViewClient();
        //javascriptInterface = new JavascriptInterface();
        //mWebView.addJavascriptInterface(javascriptInterface, "java2js_laole918");
        mWebView.setWebChromeClient(mInsideWebChromeClient);
        mWebView.setWebViewClient(mInsideWebViewClient);
    }
}

四腕巡、自定義WebChromeClient

步驟三種mInsideWebChromeClient = new InsideWebChromeClient();初始化的是自定義的WebChromeClient類玄坦,這里就開始創(chuàng)建該類

思路:在onShowCustomView方法中,講獲取到的view放到當(dāng)前Activity的最上方绘沉,在onHideCustomView中营搅,將之前的view隱藏或者刪除,將原來被覆蓋的webview放回來梆砸。并結(jié)束播放转质。

public Class MyActivity extends Activity {
    ...
    private class InsideWebChromeClient extends WebChromeClient {
        private View mCustomView;
        private CustomViewCallback mCustomViewCallback;

        @Override
        public void onShowCustomView(View view, CustomViewCallback callback) {
            super.onShowCustomView(view, callback);
            if (mCustomView != null) {
                callback.onCustomViewHidden();
                return;
            }
            mCustomView = view;
            mFrameLayout.addView(mCustomView);
            mCustomViewCallback = callback;
            mWebView.setVisibility(View.GONE);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }

        public void onHideCustomView() {
            mWebView.setVisibility(View.VISIBLE);
            if (mCustomView == null) {
                return;
            }
            mCustomView.setVisibility(View.GONE);
            mFrameLayout.removeView(mCustomView);
            mCustomViewCallback.onCustomViewHidden();
            mCustomView = null;
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            super.onHideCustomView();
        }
    }   
    ...
}

五、自定義WebViewClient,在Activity內(nèi)部類帖世。

重寫WebViewClientonPageFinished()方法中可以注入JS語句休蟹。按需求添加沸枯。

...
   private class InsideWebViewClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            // TODO Auto-generated method stub
            view.loadUrl(url);
            return true;
        }
        
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            //mWebView.loadUrl(javascript);
        }

    }
...

六、在Activity中復(fù)寫onConfigurationChanged方法

...
@Override
public void onConfigurationChanged(Configuration config) {
    super.onConfigurationChanged(config);
    switch (config.orientation) {
        case Configuration.ORIENTATION_LANDSCAPE:
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            break;
        case Configuration.ORIENTATION_PORTRAIT:
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
            break;
    }
}

七赂弓、Activity聲明周期內(nèi)webView的操作

...
@Override
public void onPause() {
    super.onPause();
    mWebView.onPause();
}

@Override
public void onResume() {
    super.onResume();
    mWebView.onResume();
}

@Override
public void onBackPressed() {
    if (mWebView.canGoBack()) {
        mWebView.goBack();
        return;
    }
    super.onBackPressed();
}

@Override
public void onDestroy() {
    mWebView.destroy();
    super.onDestroy();
}
...

思路:在onShowCustomView方法中绑榴,講獲取到的view放到當(dāng)前Activity的最上方,在onHideCustomView中盈魁,將之前的view隱藏或者刪除翔怎,將原來被覆蓋的webview放回來。并結(jié)束播放杨耙。


八赤套、沒有正確全屏可能的原因

點(diǎn)擊全屏按鈕后,寬度拉寬了珊膜,高度也高了容握,但是可以上下滑動(dòng),看起來像是一個(gè)橫屏的網(wǎng)頁车柠,這是偽全屏剔氏。


1.檢查AndroidManifest.xml清單文件,WebView控件所在的Activity配置信息是否添加android:configChanges或者是否orientation,screenSize,keyboardHidden寫全了竹祷。我之前就是忘記寫了個(gè)screenSize參數(shù)谈跛,點(diǎn)擊視頻全屏按鈕后,是一個(gè)偽全屏塑陵。還可以上下滑動(dòng)呢币旧。

## 犯錯(cuò)的錯(cuò)誤寫成了如下:
android:configChanges="orientation|keyboardHidden" -->
## 正確的寫法:
android:configChanges="orientation|screenSize|keyboardHidden"

2.檢查Activity的主題是否NoActionBar了。


小技巧:html5測試的URL獲取

打開搜狐猿妈,播放一個(gè)視頻吹菱,查看源代碼,查找以下代碼彭则,url就是html5鳍刷。

<meta name="mobile-agent" content="format=html5;url=http://m.tv.sohu.com/20140508/n399272261.shtml">

最后

不懂得可以簡書私信我,我會(huì)在第一時(shí)間回復(fù)俯抖。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末输瓜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子芬萍,更是在濱河造成了極大的恐慌尤揣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柬祠,死亡現(xiàn)場離奇詭異北戏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)漫蛔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門嗜愈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旧蛾,“玉大人,你說我怎么就攤上這事蠕嫁∠翘欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵剃毒,是天一觀的道長病袄。 經(jīng)常有香客問我,道長赘阀,這世上最難降的妖魔是什么益缠? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮纤壁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捺信。我一直安慰自己酌媒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布迄靠。 她就那樣靜靜地躺著秒咨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掌挚。 梳的紋絲不亂的頭發(fā)上雨席,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音吠式,去河邊找鬼陡厘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛特占,可吹牛的內(nèi)容都是我干的糙置。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼是目,長吁一口氣:“原來是場噩夢啊……” “哼谤饭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起懊纳,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤揉抵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嗤疯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冤今,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年茂缚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辟汰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片列敲。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖帖汞,靈堂內(nèi)的尸體忽然破棺而出戴而,到底是詐尸還是另有隱情,我是刑警寧澤翩蘸,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布所意,位于F島的核電站,受9級特大地震影響催首,放射性物質(zhì)發(fā)生泄漏扶踊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一郎任、第九天 我趴在偏房一處隱蔽的房頂上張望秧耗。 院中可真熱鬧,春花似錦舶治、人聲如沸分井。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尺锚。三九已至,卻和暖如春惜浅,著一層夾襖步出監(jiān)牢的瞬間瘫辩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工坛悉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伐厌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓裸影,卻偏偏與公主長得像弧械,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子空民,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評論 25 707
  • WebView·開車指南 目錄 WebView簡介 WebView基本使用 WebView常用方法 WebSett...
    南城的人閱讀 4,749評論 0 19
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫刃唐、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • WebView·開車指南 2016-08-31BugDev 北京市東城區(qū)首席Bug布道師開山之作界轩,一整月交通事故血...
    53c021c38a1d閱讀 829評論 0 1
  • 不知道什么原因画饥,也許是白居易的《憶江南》,也是是戴望舒的《雨巷》浊猾,也許是魯迅的《社戲》抖甘,一直覺得江南水鄉(xiāng)有...
    日未央閱讀 212評論 0 2