成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

WebView實(shí)現(xiàn)全屏播放的一種方法

red_bricks / 3800人閱讀

摘要:今天來(lái)介紹一種簡(jiǎn)單易行粗暴的方式來(lái)實(shí)現(xiàn)的視頻全屏播放。通過(guò)在一些主流視頻網(wǎng)站上的測(cè)試,在愛(ài)奇藝,土豆,芒果,等可正常全屏,在騰訊,樂(lè)視,等網(wǎng)站仍然無(wú)法全屏。經(jīng)測(cè)試,騰訊和沒(méi)有問(wèn)題了,樂(lè)視和仍然不可以全屏,即使已經(jīng)找到了全屏按鈕的標(biāo)識(shí)。

  用過(guò)WebView的開(kāi)發(fā)者們肯定都知道這里面的坑數(shù)不勝數(shù),加載緩慢,內(nèi)存泄露,文件選擇......沒(méi)錯(cuò),全屏播放視頻,這又是一個(gè)大坑。一個(gè)沒(méi)有修飾過(guò)的原生WebView幾乎不可能在某一個(gè)主流視頻網(wǎng)站實(shí)現(xiàn)全屏播放,倘若在客戶端自己實(shí)現(xiàn)簡(jiǎn)單的播放器,鏈接拿過(guò)來(lái),擺個(gè)VideoView,想怎么全屏怎么全屏,放在WebView上,一切就悲劇了,大多數(shù)情況下點(diǎn)擊全屏按鈕是沒(méi)有反應(yīng)的,或者無(wú)法實(shí)現(xiàn)橫屏全屏。今天來(lái)介紹一種簡(jiǎn)單易行粗暴的方式來(lái)實(shí)現(xiàn)WebView的視頻全屏播放。

  當(dāng)你無(wú)從下手的時(shí)候,照例先看一下官方文檔,很多常見(jiàn)的問(wèn)題官方文檔都給我們提供思路。你會(huì)發(fā)現(xiàn)下面這樣一段話,

  應(yīng)用如果需要支持HTML5的video標(biāo)簽,必須打開(kāi)硬件加速。我們只需要在Application標(biāo)簽或者相應(yīng)Activity標(biāo)簽下添加android:hardwareAccelerated="true"即可。接著為了支持全屏,需要重寫WebChromeClientonShowCustomView()onHideCustomView()方法,這兩個(gè)方法缺一不可。先來(lái)看一下onShowCustomView():

  當(dāng)前頁(yè)面進(jìn)入全屏模式的時(shí)候會(huì)調(diào)用這個(gè)方法,并且返回了兩個(gè)參數(shù)。第一個(gè)是我們要在全屏模式時(shí)顯示的View,第二個(gè)是一個(gè)CustomViewCallBack接口,可以調(diào)用這個(gè)接口請(qǐng)求關(guān)閉全屏模式。再看一下onHideCustomView()方法:

  通知應(yīng)用當(dāng)前頁(yè)面已經(jīng)關(guān)閉全屏模式,我們需要做的操作是隱藏之前onSHowCustomView()方法中取到的View。了解這兩個(gè)方法之后,我們就可以進(jìn)行一些操作來(lái)實(shí)現(xiàn)簡(jiǎn)單的全屏播放了。布局文件中我們?cè)黾右粋€(gè)和WebView同層級(jí)的Framelayout,如下所示:

    

    

  在Activity中實(shí)現(xiàn)自定義的WebChromeClient,在onShowCustomView中橫屏,隱藏WebView,并將得到的View添加到FrameLayout中顯示。在onHideCustomView中隱藏View,顯示W(wǎng)ebView,并豎屏,代碼如下:

` private class CustomWebViewChromeClient extends WebChromeClient{

    @Override
    public void onShowCustomView(View view, CustomViewCallback callback) {
        fullScreen();
        mWebView.setVisibility(View.GONE);
        mVideoContainer.setVisibility(View.VISIBLE);
        mVideoContainer.addView(view);
        mCallBack=callback;
        super.onShowCustomView(view, callback);
    }

    @Override
    public void onHideCustomView() {
        fullScreen();
        if (mCallBack!=null){
            mCallBack.onCustomViewHidden();
        }
        mWebView.setVisibility(View.VISIBLE);
        mVideoContainer.removeAllViews();
        mVideoContainer.setVisibility(View.GONE);
        super.onHideCustomView();
    }
}

private void fullScreen() {
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}`

  最后別忘記處理屏幕旋轉(zhuǎn),否則橫豎屏切換會(huì)重新走一遍生命周期。通過(guò)在一些主流視頻網(wǎng)站上的測(cè)試,在愛(ài)奇藝,土豆,芒果TV,PPTV等可正常全屏,在騰訊,樂(lè)視,BiliBili,Acfun等網(wǎng)站仍然無(wú)法全屏。通過(guò)日志我們可以發(fā)現(xiàn),根本沒(méi)有回調(diào)onShowCustomView這個(gè)方法,所以沒(méi)有執(zhí)行相應(yīng)代碼。原因暫時(shí)還不得而知,有小伙伴了解的可以溝通一下。那么如何得到用戶點(diǎn)擊全屏按鈕的事件呢,既然是一個(gè)html頁(yè)面,java語(yǔ)言可以操作的東西就不多了,JavaScript就可以大顯身手了。通過(guò)向頁(yè)面注入一些js語(yǔ)句我們可以做很多事情,只需要知道全屏按鈕的Class標(biāo)識(shí),就可以通過(guò)js,當(dāng)用戶點(diǎn)擊全屏按鈕的時(shí)候調(diào)用我們本地方法,具體代碼如下:

"javascript:document.getElementsByClassName("" + tag + "")[0].addEventListener("click",function(){onClick.fullscreen();return false;});"

  tag是Class標(biāo)識(shí),onClick.fullscreen()是我自己本地定義的方法。那么如何注入這段js代碼呢?我們只需要重寫WebClient的onPageFinished()方法,如下所示:

private class CustomWebClient extends WebViewClient{

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        String js=TagUtils.getJs(url);
        view.loadUrl(js);
    }
}

private class JsObject{

    @JavascriptInterface
    public void fullscreen(){
        //監(jiān)聽(tīng)到用戶點(diǎn)擊全屏按鈕
       fullScreen();
    }
}

mWebView.addJavascriptInterface(new JsObject(),"onClick");

  這樣就可以實(shí)現(xiàn)上述幾個(gè)網(wǎng)站的全屏播放了。
經(jīng)測(cè)試,騰訊和BiliBili沒(méi)有問(wèn)題了,樂(lè)視和Acfun仍然不可以全屏,即使已經(jīng)找到了全屏按鈕的Class標(biāo)識(shí)。哪位大仙可以提供一個(gè)解釋。
下面給出一些我收集的幾個(gè)視頻網(wǎng)站的全屏按鈕Class標(biāo)識(shí):

public static String getTagByUrl(String url) {
    if (url.contains("qq")) {
        return "tvp_fullscreen_button"; // http://m.v.qq.com
    } else if (url.contains("youku")) {
        return "x-zoomin";              // http://www.youku.com
    } else if (url.contains("bilibili")) {
        return "icon-widescreen";       // http://www.bilibili.com/mobile/index.html
    } else if (url.contains("acfun")) {
        return "controller-btn-fullscreen"; //http://m.acfun.tv   無(wú)效
    } else if (url.contains("le")) {
        return "hv_ico_screen";         // http://m.le.com  無(wú)效
    }
    return "";
}

  總結(jié)一下,正如文章題目所說(shuō),實(shí)現(xiàn)WebView全屏播放的一種方式,而且肯定不是主流的一種方式,僅僅只是一種比較簡(jiǎn)單的方式。通過(guò)反編譯一些瀏覽器應(yīng)用的apk,大多數(shù)是通過(guò)js獲取到當(dāng)前頁(yè)面視頻的鏈接,用自定義的播放器來(lái)播放,這樣使得播放界面可以自定義,用戶體驗(yàn)更好,當(dāng)然,我也想過(guò)這種方法,可是已經(jīng)跪在起點(diǎn),如何獲得當(dāng)前頁(yè)面視頻的播放地址。研究過(guò)的同學(xué)可以和我交流交流,不勝感激。

有任何疑問(wèn),歡迎加群討論:261386924

  

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/11011.html

相關(guān)文章

  • WebView實(shí)現(xiàn)全屏播放一種方法

    摘要:今天來(lái)介紹一種簡(jiǎn)單易行粗暴的方式來(lái)實(shí)現(xiàn)的視頻全屏播放。通過(guò)在一些主流視頻網(wǎng)站上的測(cè)試,在愛(ài)奇藝,土豆,芒果,等可正常全屏,在騰訊,樂(lè)視,等網(wǎng)站仍然無(wú)法全屏。經(jīng)測(cè)試,騰訊和沒(méi)有問(wèn)題了,樂(lè)視和仍然不可以全屏,即使已經(jīng)找到了全屏按鈕的標(biāo)識(shí)。   用過(guò)WebView的開(kāi)發(fā)者們肯定都知道這里面的坑數(shù)不勝數(shù),加載緩慢,內(nèi)存泄露,文件選擇......沒(méi)錯(cuò),全屏播放視頻,這又是一個(gè)大坑。一個(gè)沒(méi)有修飾過(guò)...

    baoxl 評(píng)論0 收藏0
  • html5--移動(dòng)端視頻video的android兼容,去除播放控件、全屏

    摘要:但在下,多數(shù)機(jī)子是不顯示視頻畫面的,要不就是顯示一個(gè)黑色的還不是全屏的播放控件,即使及加個(gè)封面也不濟(jì)于是。因?yàn)槲⑿诺牟シ牌魇敲撾x結(jié)構(gòu)的,也不會(huì)響應(yīng)等事件。 android下html5的視頻播放一直是前端兼容的重災(zāi)區(qū),各種體驗(yàn)差,被詬病已久。但之前的故宮穿越H5,和吳亦凡入伍H5,利用的視頻技術(shù),貌似又給人一種新面貌。 前段時(shí)間做某項(xiàng)目,恰好也是一個(gè)類似視頻全屏的,下面跟大家分享下經(jīng)歷的...

    Zhuxy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<