Android WebView實(shí)踐總結(jié)(二)WebView全屏播放

我接著上一篇的總結(jié)繼續(xù)寫(xiě)藻肄,上一篇已經(jīng)可以正常加載網(wǎng)頁(yè)并且做基本控制,不過(guò)我發(fā)現(xiàn)一個(gè)問(wèn)題,播放網(wǎng)頁(yè)視頻的時(shí)候無(wú)法進(jìn)入全屏模式進(jìn)行視頻播放或舞,體驗(yàn)極差,原來(lái)這里是我們自己需要手動(dòng)對(duì)全屏模式進(jìn)行處理的蒙幻。這篇主要寫(xiě)WwebView實(shí)現(xiàn)全屏播放映凳,還有記錄一下在處理全屏播放時(shí)候遇到的一個(gè)問(wèn)題。

1.思考

播放視頻的時(shí)候點(diǎn)擊全屏圖標(biāo)點(diǎn)擊后木有反應(yīng)邮破,但其實(shí)是觸發(fā)了WebChromeClient類中onShowCustomView(View view, CustomViewCallback callback)事件的诈豌,注意這個(gè)方法里面的兩個(gè)參數(shù)viewcallbackview就是傳過(guò)來(lái)的視頻播放的視圖內(nèi)容抒和,callback回調(diào)接口看源代碼可知里面有一個(gè)方法onCustomViewHidden()注釋給的解釋是(Invoked when the host application dismisses the)矫渔,意思是視圖關(guān)閉的時(shí)候調(diào)用這個(gè)onCustomViewHidden()方法,退出全屏的時(shí)候會(huì)回調(diào) onHideCustomView()無(wú)參數(shù)方法摧莽,得出結(jié)論:簡(jiǎn)單的來(lái)說(shuō)就是進(jìn)入全屏模式的時(shí)候把onShowCustomView方法中的View添加到一個(gè)容器中顯示出來(lái)蚌斩,退出全屏模式時(shí)在onHideCustomView方法中把視圖從容器remove掉就OK了,順便處理一下橫豎屏切換范嘱。

  /**
     * A callback interface used by the host application to notify
     * the current page that its custom view has been dismissed.
     */
    public interface CustomViewCallback {
        /**
         * Invoked when the host application dismisses the
         * custom view.
         */
        public void onCustomViewHidden();
    }

2.開(kāi)啟硬件加速

為什么要開(kāi)啟硬件加速八蜕拧?因?yàn)椴婚_(kāi)啟的話會(huì)有視頻無(wú)法正常播放的問(wèn)題丑蛤,還有就是瀏覽網(wǎng)頁(yè)的時(shí)候更流暢叠聋。
在application節(jié)點(diǎn)中添加android:supportsRtl="true"在activity中添加android:hardwareAccelerated="true",在application添加表示整個(gè)應(yīng)用程序開(kāi)啟,在activity添加表示當(dāng)前頁(yè)面開(kāi)啟受裹。

    <application
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:hardwareAccelerated="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

3.網(wǎng)頁(yè)全屏模式切換回調(diào)處理

layout布局中添加FrameLayout作為全屏模式的視圖容器碌补;

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.allyn.webview.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.v4.widget.ContentLoadingProgressBar
            android:id="@+id/pro_schedule"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            android:layout_width="match_parent"
            android:layout_height="3dp"
            android:max="100"
            android:progress="0"
            android:visibility="visible" />

        <com.allyn.webview.MyWebView
            android:id="@+id/webview"
            android:layout_width="match_parent"
            android:layout_height="500dp" />
    </LinearLayout>

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

全屏模式切換回調(diào)處理

        mWebView.setWebChromeClient(new WebChromeClient() {
            //視圖View
            private View mCustomView;
            // 一個(gè)回調(diào)接口使用的主機(jī)應(yīng)用程序通知當(dāng)前頁(yè)面的自定義視圖已被撤職
            private CustomViewCallback mCustomViewCallback;

            //網(wǎng)頁(yè)進(jìn)入全屏模式監(jiān)聽(tīng)
            @Override
            public void onShowCustomView(View view, CustomViewCallback callback) {
                super.onShowCustomView(view, callback);
                mFrameLayout = findViewById(R.id.frameLayout);
                if (mCustomView != null) {
                    callback.onCustomViewHidden();
                    return;
                }
                //賦值虏束,關(guān)閉時(shí)需要調(diào)用
                mCustomView = view;
                // 將video放到FrameLayout中
                mFrameLayout.addView(mCustomView);
                //  退出全屏模式時(shí)釋放需要調(diào)用,這里先賦值
                mCustomViewCallback = callback;
                // 設(shè)置webView隱藏
                mWebView.setVisibility(View.GONE);
                //切換至橫屏
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }

            //網(wǎng)頁(yè)退出全屏模式監(jiān)聽(tīng)
            @Override
            public void onHideCustomView() {
                //顯示豎屏?xí)r候的webview
                mWebView.setVisibility(View.VISIBLE);
                if (mCustomView == null) {
                    return;
                }
                //隱藏
                mCustomView.setVisibility(View.GONE);
                //從當(dāng)前視圖中移除
                mFrameLayout.removeView(mCustomView);
                //釋放自定義視圖
                mCustomViewCallback.onCustomViewHidden();
                mCustomView = null;
                //切換至豎屏
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                super.onHideCustomView();
            }
        });

3.APP橫豎屏切換處理

注意:需要在AndroidManifest.xml文件中的activity節(jié)點(diǎn)下添加 android:configChanges="orientation|screenSize|keyboardHidden"厦章,這么設(shè)置是為了使橫豎屏切換后Activity不會(huì)重新啟動(dòng)镇匀。

    //屏幕旋轉(zhuǎn)監(jiān)聽(tīng)
    @Override
    public void onConfigurationChanged(Configuration config) {
        super.onConfigurationChanged(config);
        switch (config.orientation) {
            //豎屏方向
            case Configuration.ORIENTATION_LANDSCAPE:
                //設(shè)置全屏
                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
                break;
            //橫屏方向
            case Configuration.ORIENTATION_PORTRAIT:
                //關(guān)閉全屏
                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
                break;
        }
    }

到這里全屏播放的功能完成了,效果圖如下:


全屏播放效果圖

4.遇到的一個(gè)問(wèn)題

在優(yōu)酷網(wǎng)上點(diǎn)擊播放視頻的時(shí)候出現(xiàn)了錯(cuò)誤頁(yè)面袜啃,提示:

error.jpg

這個(gè)問(wèn)題是網(wǎng)址使用了外鏈導(dǎo)致的汗侵,需要在shouldOverrideUrlLoading()方法中對(duì)url做處理,判斷url的前綴進(jìn)行本地跳轉(zhuǎn)群发。

 @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //網(wǎng)址處理
                if (url == null) return false;
            //外鏈判斷處理
                try {
                    if (url.startsWith("weixin://") //微信
                            || url.startsWith("alipays://") //支付寶
                            || url.startsWith("mailto://") //郵件
                            || url.startsWith("tel://")//電話
                            || url.startsWith("baiduhaokan://")//百度
                            || url.startsWith("tbopen://")//百度+
                            || url.startsWith("youku://")//優(yōu)酷
                            || url.startsWith("dianping://")//大眾點(diǎn)評(píng)
                        //其他自定義的scheme
                            ) {
                        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                        startActivity(intent);
                        return true;
                    }
                } catch (Exception e) { //防止crash (如果手機(jī)上沒(méi)有安裝處理某個(gè)scheme開(kāi)頭的url的APP, 會(huì)導(dǎo)致crash)
                    return true;//沒(méi)有安裝該app時(shí)晰韵,返回true,表示攔截自定義鏈接熟妓,但不跳轉(zhuǎn)雪猪,避免彈出上面的錯(cuò)誤頁(yè)面
                }
                /**
                 * 可對(duì)指定網(wǎng)址進(jìn)行攔截
                 */
                view.loadUrl(url);
                return true;
            }
問(wèn)題解決.jpg

好了,webview實(shí)踐總結(jié)第二篇到這里寫(xiě)完了起愈,覺(jué)得有用的可以點(diǎn)個(gè)小心心支持一下只恨,(比心手勢(shì).png)

預(yù)告:第三篇寫(xiě)webview的圖片上傳與網(wǎng)頁(yè)長(zhǎng)按處理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抬虽,一起剝皮案震驚了整個(gè)濱河市官觅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斥赋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡纪吮,警方通過(guò)查閱死者的電腦和手機(jī)抗俄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)旗芬,“玉大人,你說(shuō)我怎么就攤上這事⊥渚眨” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵踱阿,是天一觀的道長(zhǎng)管钳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)软舌,這世上最難降的妖魔是什么才漆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮佛点,結(jié)果婚禮上醇滥,老公的妹妹穿的比我還像新娘黎比。我一直安慰自己,他們只是感情好鸳玩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布阅虫。 她就那樣靜靜地躺著,像睡著了一般不跟。 火紅的嫁衣襯著肌膚如雪颓帝。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天躬拢,我揣著相機(jī)與錄音躲履,去河邊找鬼。 笑死聊闯,一個(gè)胖子當(dāng)著我的面吹牛工猜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播菱蔬,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼篷帅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了拴泌?” 一聲冷哼從身側(cè)響起魏身,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚪腐,沒(méi)想到半個(gè)月后箭昵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡回季,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年家制,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泡一。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颤殴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鼻忠,到底是詐尸還是另有隱情涵但,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布帖蔓,位于F島的核電站矮瘟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏塑娇。R本人自食惡果不足惜芥永,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钝吮。 院中可真熱鬧埋涧,春花似錦板辽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至醇坝,卻和暖如春邑跪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呼猪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工画畅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宋距。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓轴踱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親谚赎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淫僻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,981評(píng)論 3 119
  • 生命只有一次不可重復(fù),時(shí)光亦不能倒轉(zhuǎn)給你機(jī)會(huì)后悔闸盔。在這個(gè)飛速發(fā)展的時(shí)代悯辙,很多人都說(shuō)女人開(kāi)始獨(dú)擋半邊天,在這獨(dú)...
    初心表姐閱讀 694評(píng)論 0 0
  • 曾記 詩(shī)酒正年華 感傷不過(guò)是一場(chǎng)無(wú)端而至的秋涼 我陷入沉醉 又疑惑迷惘 離別 不用訴離殤 眼淚不過(guò)是一杯天涯各兩端...
    秋山紗蘭閱讀 214評(píng)論 0 1
  • 人總是為一點(diǎn)點(diǎn)小事而改變自己的心情迎吵,可能那個(gè)事情并不關(guān)系到你躲撰,但總會(huì)聯(lián)系到自己
    早起的小羊閱讀 138評(píng)論 0 0