WebView是個大坑,需求是希望點擊一個視頻鏈接跳轉到網頁上播放視頻,然後點擊全屏能自動橫屏。。。查了很多東西,最後直接上代碼吧,註釋都在,直接看吧,使用也很簡單,直接把URL傳到這個Activity就行了,如果你的網站的視頻是flash播放的話,會出現空白的情況,無法播放。。。所以必須是H5的。。
package com.gogosu.gogosuandroid.ui.strategy;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import com.gogosu.gogosuandroid.R;
import com.gogosu.gogosuandroid.model.Constant.IntentConstant;
public class WebVideoActivity extends Activity {
private WebView webView;
private String url;
/** 視頻全屏參數 */
protected static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
private View customView;
private FrameLayout fullscreenContainer;
private WebChromeClient.CustomViewCallback customViewCallback;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
url = getIntent().getStringExtra(IntentConstant.VIDEO_PLAY_LINK);//傳進來視頻鏈接
setContentView(R.layout.activity_full_screen);
webView = (WebView) findViewById(R.id.webview);
initWebView();
}
@Override
protected void onStop() {
super.onStop();
webView.reload();
}
@Override
protected void onResume() {
super.onResume();
webView.onResume();
webView.resumeTimers();
}
/** 展示網頁界面 **/
public void initWebView() {
WebChromeClient wvcc = new WebChromeClient();
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setUseWideViewPort(true); // 關鍵點
webSettings.setAllowFileAccess(true); // 允許訪問文件
webSettings.setSupportZoom(true); // 支持縮放
webSettings.setLoadWithOverviewMode(true);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 不加載緩存內容
webView.setWebChromeClient(wvcc);
WebViewClient wvc = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
webView.loadUrl(url);
return true;
}
};
webView.setWebViewClient(wvc);
webView.setWebChromeClient(new WebChromeClient() {
/*** 視頻播放相關的方法 **/
@Override
public View getVideoLoadingProgressView() {
FrameLayout frameLayout = new FrameLayout(WebVideoActivity.this);
frameLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
return frameLayout;
}
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
showCustomView(view, callback);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//播放時橫屏幕,如果需要改變橫豎屏,只需該參數就行了
@Override
public void onHideCustomView() {
hideCustomView();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//不播放時豎屏
}
});
// 加載Web地址
webView.loadUrl(url);
}
/** 視頻播放全屏 **/
private void showCustomView(View view, WebChromeClient.CustomViewCallback callback) {
// if a view already exists then immediately terminate the new one
if (customView != null) {
callback.onCustomViewHidden();
return;
}
WebVideoActivity.this.getWindow().getDecorView();
FrameLayout decor = (FrameLayout) getWindow().getDecorView();
fullscreenContainer = new FullscreenHolder(this);
fullscreenContainer.addView(view, COVER_SCREEN_PARAMS);
decor.addView(fullscreenContainer, COVER_SCREEN_PARAMS);
customView = view;
setStatusBarVisibility(false);
customViewCallback = callback;
}
/** 隱藏視頻全屏 */
private void hideCustomView() {
if (customView == null) {
return;
}
setStatusBarVisibility(true);
FrameLayout decor = (FrameLayout) getWindow().getDecorView();
decor.removeView(fullscreenContainer);
fullscreenContainer = null;
customView = null;
customViewCallback.onCustomViewHidden();
webView.setVisibility(View.VISIBLE);
}
/** 全屏容器界面 */
static class FullscreenHolder extends FrameLayout {
public FullscreenHolder(Context ctx) {
super(ctx);
setBackgroundColor(ctx.getResources().getColor(android.R.color.black));
}
@Override
public boolean onTouchEvent(MotionEvent evt) {
return true;
}
}
private void setStatusBarVisibility(boolean visible) {
int flag = visible ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setFlags(flag, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
/** 回退鍵 事件處理 優先級:視頻播放全屏-網頁回退-關閉頁面 */
if (customView != null) {
hideCustomView();
} else if (webView.canGoBack()) {
webView.goBack();
} else {
finish();
}
return true;
default:
return super.onKeyUp(keyCode, event);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
webView.stopLoading();
webView.setWebChromeClient(null);
webView.setWebViewClient(null);
webView = null;
}
}