webView全屏播放的问题

来源:互联网 发布:淘宝商品被删除怎么办 编辑:程序博客网 时间:2024/05/23 15:34

上篇讲到webview加载视频的问题,这篇文章讲讲webView全屏播放的问题


首先,贴activity在mainfast 中的声明:
        <activity
            android:name=".ui.offersInfo.OffersInfoActivity"
            android:configChanges="orientation|keyboardHidden"
            android:hardwareAccelerated="true"/>


需要注意的是 
android:configChanges="orientation|keyboardHidden"
是防止横竖屏是界面重建的,
android:hardwareAccelerated="true"
是硬件加速。


以下贴出 mainActivity 中的代码:
public class OffersInfoActivity extends BaseActivity{


    @BindView(R.id.wv)
    WebView mWebView;
    @BindView(R.id.video_fullView)
    FrameLayout mVideoFullView;// 全屏时视频加载view
    @BindView(R.id.receive)
    AppCompatButton receive;
    private View mCustomView;
    private WebChromeClient.CustomViewCallback mCustomViewCallback;
    private MyWebChromeClient mWebchromeclient;


    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_offers_info) 
        ButterKnife.bind(this);
        initViews();
        initData();
        setListener();
    }
   @Override
    public int getContentViewId() {
        return R.layout.activity_offers_info;
    }




    @Override
    protected void initViews() {
       
        WebSettings webSettings = mWebView.getSettings();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
        webSettings.setDefaultTextEncodingName("utf-8") ;//这句话去掉也没事。。只是设置了编码格式
        webSettings.setJavaScriptEnabled(true);  //这句话必须保留。。不解释
        webSettings.setDomStorageEnabled(true);//这句话必须保留。。否则无法播放优酷视频网页。。其他的可以
        //重写一下,实现全屏播放
        mWebchromeclient=new MyWebChromeClient();
        mWebView.setWebChromeClient(mWebchromeclient);
        mWebView.setWebViewClient(new WebViewClient(){//不写的话自动跳到默认浏览器了。。跳出APP了。。怎么能不写?
            public boolean shouldOverrideUrlLoading(WebView view, String url) {//这个方法必须重写。否则会出现优酷视频周末无法播放。周一-周五可以播放的问题
                if(url.startsWith("intent")||url.startsWith("youku")){
                    return true;
                }else{
                    return super.shouldOverrideUrlLoading(view, url);
                }
            }
        });
        //加载html文件内容,注 s 为 String类型
        mWebView.loadDataWithBaseURL(null, s, "text/html", "utf-8", null);


    }


    @Override
    protected void initData() {


    }


    @Override
    protected void setListener() {


    }




    @Override
    protected void onDestroy() {
        if (mWebView != null) {
            mWebView.destroy();
        }
        super.onDestroy();
    }


    
    @Override
    protected void onResume() {
        super.onResume();
        mWebView.onResume();
        mWebView.resumeTimers();
        //设置为横屏
        if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    }


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


    @OnClick({R.id.title_back, R.id.title_right, R.id.receive})
    public void onViewClicked(View view) {


        ViewsUtils.preventViewMultipleClick(view, 1000);


        switch (view.getId()) {
            case R.id.title_back:
                if (inCustomView()) {
                    hideCustomView();
                    return;
                } else {
                    mWebView.loadUrl("about:blank");
                    AppActivityManager.getInstance().finishActivity();
                }
                break;
            case R.id.title_right://分享
                dialog.show();
                break;
            case R.id.receive:
                mPresenter.onReceive();
                break;
        }
    }


    
    /**判断是否是全屏**/
    public boolean inCustomView() {
        return (mCustomView != null);
    }


    /**全屏时按返加键执行退出全屏方法**/
    public void hideCustomView() {
        mWebchromeclient.onHideCustomView();
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (inCustomView()) {
                hideCustomView();
                return true;
            } else {
                mWebView.loadUrl("about:blank");
                AppActivityManager.getInstance().finishActivity();
            }
        }
        return false;
    }


    private class MyWebChromeClient extends WebChromeClient {
        // 播放网络视频时全屏会被调用的方法
        @Override
        public void onShowCustomView(View view, CustomViewCallback callback) {
//            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            mWebView.setVisibility(View.INVISIBLE);
            // 如果一个视图已经存在,那么立刻终止并新建一个
            if (mCustomView != null) {
                callback.onCustomViewHidden();
                return;
            }
            mVideoFullView.addView(view);
            mCustomView = view;
            mCustomViewCallback = callback;
            mVideoFullView.setVisibility(View.VISIBLE);
        }


        // 视频播放退出全屏会被调用的
        @Override
        public void onHideCustomView() {
            if (mCustomView == null){// 不是全屏播放状态
                return;
            }
//            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            mCustomView.setVisibility(View.GONE);
            mVideoFullView.removeView(mCustomView);
            mCustomView = null;
            mVideoFullView.setVisibility(View.GONE);
            mCustomViewCallback.onCustomViewHidden();
            mWebView.setVisibility(View.VISIBLE);
        }
    }
}


注意,以上只是截取部分activity中需要全屏展示的webview加载视频的主要代码,复制到项目中时需要稍作修改,其实需要全屏加载,只涉及到
        mWebchromeclient=new MyWebChromeClient();
        mWebView.setWebChromeClient(mWebchromeclient);
的处理,MyWebChromeClient 继承自 WebChromeClient ,里面需要重写 
onShowCustomView

onHideCustomView
方法,然后在这两个方法中对Webview和 mVideoFullView 进行处理。


最后,贴出 activity_layout.xml  的代码:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/color_ffffff"
    android:orientation="vertical"
    tools:context="com.inm.ui.offersInfo.OffersInfoActivity">


    <FrameLayout
        android:id="@+id/video_fullView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone" >
    </FrameLayout>


    <WebView


        android:id="@+id/wv"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_0"
        android:layout_weight="1">




    </WebView>


以上即是对webView的全屏处理,注意,我代码中注释掉了 MyWebChromeClient 类中关于设置横竖屏的代码,也就是说我的webView全屏是在竖屏情况下的,若大家需要在实现全屏的情况下是横屏,则需要在它的基础上继续研究。




0 0
原创粉丝点击