WebView 播放https 视频 无法播放 显示一片白色的问题

布局文件如下:

<?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:id="@+id/framelayout"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent" >  

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

代码如下:

public class VideoActivity extends BaseActivity {


     private FrameLayout frameLayout = null;  
     private WebView webView = null;  
     private WebChromeClient chromeClient = null;  
     private View myView = null;  
     private WebChromeClient.CustomViewCallback myCallBack = null; 
     private View customView;
     private FrameLayout videolayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video);
        initView();
        webView.getSettings().setJavaScriptEnabled(true);  

        //解决webview显示不全的问题
        webView.getSettings().setUseWideViewPort(true);   
        webView.getSettings().setLoadWithOverviewMode(true); 

        webView.setWebViewClient(new MyWebviewCient());  

        chromeClient = new MyChromeClient();  

        webView.setWebChromeClient(chromeClient );  
        webView.setVisibility(View.VISIBLE);

        HttpsTrustManager.allowAllSSL();
        webView.setScrollBarStyle(0);// 滚动条风格,为0就是不给滚动条留空间,滚动条覆盖在网页上

        //webView.getSettings().setLoadsImagesAutomatically(true);// 设置可以自动加载图片

        webView.getSettings().setAppCacheEnabled(true);// 应用可以有缓存
     // 设置可以支持缩放 
       // webView.getSettings().setSupportZoom(true); 
        // 设置出现缩放工具 
//        webView.getSettings().setBuiltInZoomControls(true);
//        webView.getSettings().setLoadWithOverviewMode(true);
      //自动打开窗口  
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);  
        // 没有的话会黑屏 支持插件  

        webView.setHorizontalScrollBarEnabled(false);//禁止水平滚动
        webView.setVerticalScrollBarEnabled(true);//允许垂直滚动
        // 为图片添加放大缩小功能
        //webview.getSettings().setUseWideViewPort(true);
        //自适应屏幕
        //webView.getSettings().setDomStorageEnabled(true);// 设置可以使用localStorage

        webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);// 优先使用缓存

        webView.getSettings().setAppCacheMaxSize(10 * 1024 * 1024);// 缓存最多可以有10M

        webView.getSettings().setAllowFileAccess(true);// 可以读取文件缓存(manifest生效)

        webView.getSettings().setPluginState(PluginState.ON);
        webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);

        // 加速WebView加载的方法

        webView.getSettings().setRenderPriority(RenderPriority.HIGH); // 提高渲染的优先级

       // webView.getSettings().setPluginState(true);
        webView.loadUrl(getString(R.string.videourl));  

        if(savedInstanceState != null){  
            webView.restoreState(savedInstanceState);  
        }  
    }

    private void initView() {
        // TODO Auto-generated method stub
        webView = (WebView) findViewById(R.id.webview);
        frameLayout = (FrameLayout)findViewById(R.id.framelayout);  
        videolayout = (FrameLayout)findViewById(R.id.fl_video);  
    }


     long timeSpace = 0;
     @Override  
       public boolean onKeyDown(int keyCode, KeyEvent event) {  
           if (System.currentTimeMillis() - timeSpace > 2000) {  
               timeSpace =  System.currentTimeMillis();  
               if(chromeClient != null){
                   chromeClient.onHideCustomView();
               }
               Toast.makeText(this, "再按一次退出视频播放界面", Toast.LENGTH_SHORT).show();  
           }  
           else {  

               finish();  
           }  
           return true;  
       }  

        @Override  
        protected void onSaveInstanceState(Bundle outState) {  
            // TODO Auto-generated method stub  
            webView.saveState(outState);  
        }  
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        AnimationUtil.setLayout(R.anim.deflaut, R.anim.slide_right_out);
        super.onPause();
        webView.onPause();
        webView.pauseTimers();
    }

     public void addJavaScriptMap(Object obj, String objName){  
            webView.addJavascriptInterface(obj, objName);  
        }  

        public class MyWebviewCient extends WebViewClient{  
            @Override  
            public WebResourceResponse shouldInterceptRequest(WebView view,  
                    String url) {  
                WebResourceResponse response = null;  
                response = super.shouldInterceptRequest(view, url);  
                Logger.e(TAG, "shouldInterceptRequest");
                return response;  
            }  

           @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            // TODO Auto-generated method stub
            handler.proceed();
            Logger.e(TAG, "onReceivedSslError");
        }

            @Override  
            public void onPageFinished(WebView view, String url) {  
                // TODO Auto-generated method stub  
                super.onPageFinished(view, url);  
                Logger.e(TAG, "onPageFinished");

            }  

        }  

     @Override
        protected void onResume() {
            super.onResume();
            super.onResume();
            webView.onResume();
            webView.resumeTimers();

            /**
             * 设置为横屏
             */
            if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
        }



        @Override
        protected void onDestroy() {
            super.onDestroy();
            super.onDestroy();
            //video_fullView.removeAllViews();
            webView.loadUrl("about:blank");
            webView.stopLoading();
            webView.setWebChromeClient(null);
            webView.setWebViewClient(null);
            webView.destroy();
            webView = null;
        }

        public class MyChromeClient extends WebChromeClient{  
            // 一个回调接口使用的主机应用程序通知当前页面的自定义视图已被撤职  
            CustomViewCallback customViewCallback;  
            int mOriginalOrientation ;
            // 进入全屏的时候  
            @Override  
            public void onShowCustomView(View view, CustomViewCallback callback) {  
                if (customView != null) {  
                    callback.onCustomViewHidden();  
                    return;  
                }  
                customView = view;  
                customViewCallback = callback;  
                mOriginalOrientation = getRequestedOrientation();  
                webView.setVisibility(View.GONE);  
                videolayout.addView(customView);  
                videolayout.setVisibility(View.VISIBLE);  
                videolayout.bringToFront();  
                //设置横屏  
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
                //设置全屏  
                setFullScreen();
            }  
            // 退出全屏的时候  
            @Override  
            public void onHideCustomView() {  
                if (customView == null) {  
                    return;  
                }  
                videolayout.removeView(customView);  
                customView = null;  
                videolayout.setVisibility(View.GONE);  
                try {  
                    customViewCallback.onCustomViewHidden();  
                } catch (Exception e) {  
                }  
                // 设置竖屏  
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
                quitFullScreen(); 
                // 设置WebView可见  
                webView.setVisibility(View.VISIBLE);  
            }  

            @Override  
            public void onProgressChanged(WebView view, int newProgress) {  
                super.onProgressChanged(view, newProgress);  
            }  
        }  

        private void setFullScreen() {  
            // 设置全屏的相关属性,获取当前的屏幕状态,然后设置全屏  
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);  
            // 全屏下的状态码:1098974464  
            // 窗口下的状态吗:1098973440  
        }  

        /** 
         * 退出全屏 
         */  
        private void quitFullScreen() {  
            // 声明当前屏幕状态的参数并获取  
            final WindowManager.LayoutParams attrs = getWindow().getAttributes();  
            attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);  
            getWindow().setAttributes(attrs);  
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);  
        }  


}

主要是因为需要信任https 链接,需要在Activity中调用 HttpsTrustManager.allowAllSSL();

这个类的代码如下:

public class HttpsTrustManager implements X509TrustManager {
    private static TrustManager[] trustManagers;
    private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[]{};

@Override
public void checkClientTrusted(
        X509Certificate[] x509Certificates, String s)
        throws java.security.cert.CertificateException {
}

@Override
public void checkServerTrusted(
        X509Certificate[] x509Certificates, String s)
        throws java.security.cert.CertificateException {
}

public boolean isClientTrusted(X509Certificate[] chain) {
    return true;
}

public boolean isServerTrusted(X509Certificate[] chain) {
    return true;
}

@Override
public X509Certificate[] getAcceptedIssuers() {
    return _AcceptedIssuers;
}

public static void allowAllSSL() {
    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {

        @Override
        public boolean verify(String arg0, SSLSession arg1) {
            return true;
        }

    });

    SSLContext context = null;
    if (trustManagers == null) {
        trustManagers = new TrustManager[]{new HttpsTrustManager()};
    }

    try {
        context = SSLContext.getInstance("TLS");
        context.init(null, trustManagers, new SecureRandom());
    } catch (NoSuchAlgorithmException | KeyManagementException e) {
        e.printStackTrace();
    }

    HttpsURLConnection.setDefaultSSLSocketFactory(context != null ? context.getSocketFactory() : null);
}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值