布局文件如下:
<?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);
}
}