問題描述:
在專案中,會有在webview嵌入的網頁中播放視頻的需求,本來以為Android的WebView應該是默認支持視頻播放的,不會有太大的問題,但是經過測驗后,發現兩個大問題:
- 有些手機無法正常播放視頻,出現白屏或者只有聲音沒有畫面等,還有不能對視頻進行操作(比如播放、暫停、自動播放等)
- 視頻無法全屏播放
視頻在webview中正常播放:
這個只需要在對應的Activity中加入android:hardwareAccelerated="true"即可,如果不加的話,會在部分手機上出現白屏或有聲音無畫面等問題,還有不能對視頻進行操作(比如播放、暫停、自動播放等),
application和activity可直接在 AndroidManifest.xml 中添加該屬性:
// 在application中
<application android:hardwareAccelerated ="true">
// 在activity中
<activity android:hardwareAccelerated="true" >
也可在代碼中設定:
// 在代碼中
getWindow.setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
注意:一定不要忘記加網路權限!
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
橫豎屏播放:
webview加載視頻網頁的時候會遇到無法橫屏的問題,此問題需要自己重新定義設定webview里面橫豎屏布局,需要重寫WebView的 WebChromeClient 的 onShowCustomView() 和 onHideCustomView() 方法就可以了,大概思路是:在 onShowCustomView() 中隱藏 WebView,并將得到的 View 添加到 FrameLayout 中顯示,同時切換回橫屏,在 onHideCustomView() 中隱藏 View,顯示 WebView,同時切換回豎屏,具體代碼如下:
private WebView web_show;
private WebSettings mWebSettings;
/**
* 視頻全屏引數
*/
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 savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webvideo);
web_show = findViewById(R.id.web_show);
initWebView();
}
/**
* 展示網頁界面
**/
private void initWebView() {
mWebSettings = web_show.getSettings();
mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);//設定js可以直接打開視窗,如window.open(),默認為false
mWebSettings.setJavaScriptEnabled(true);//是否允許JavaScript腳本運行,默認為false,設定true時,會提醒可能造成XSS漏洞
mWebSettings.setSupportZoom(true);//是否可以縮放,默認true
mWebSettings.setBuiltInZoomControls(true);//是否顯示縮放按鈕,默認false
mWebSettings.setUseWideViewPort(true);//設定此屬性,可任意比例縮放,大視圖模式
mWebSettings.setLoadWithOverviewMode(true);//和setUseWideViewPort(true)一起解決網頁自適應問題
mWebSettings.setAppCacheEnabled(true);//是否使用快取
mWebSettings.setDomStorageEnabled(true);//開啟本地DOM存盤
mWebSettings.setLoadsImagesAutomatically(true); // 加載圖片
mWebSettings.setMediaPlaybackRequiresUserGesture(false);//播放音頻,多媒體需要用戶手動?設定為false為可自動播放
mWebSettings.setAllowFileAccess(true); // 允許訪問檔案
web_show.loadUrl("http://liveshare.huya.com/iframe/swissski");
//設定不用系統瀏覽器打開,直接顯示在當前Webview
web_show.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
web_show.setWebChromeClient(new WebChromeClient() {
/*** 視頻播放相關的方法 **/
@Override
public View getVideoLoadingProgressView() {
FrameLayout frameLayout = new FrameLayout(HelloActivity.this);
frameLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
return frameLayout;
}
@SuppressLint("SourceLockedOrientationActivity")
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
showCustomView(view, callback);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//播放時橫螢屏,如果需要改變橫豎屏,只需該引數就行了
}
@SuppressLint("SourceLockedOrientationActivity")
@Override
public void onHideCustomView() {
hideCustomView();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//不播放時豎屏
}
});
}
/**
* 視頻播放全屏
**/
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;
}
this.getWindow().getDecorView();
FrameLayout decor = (FrameLayout) getWindow().getDecorView();
fullscreenContainer = new FullscreenHolder(HelloActivity.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();
web_show.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
protected void onDestroy() {
super.onDestroy();
web_show.stopLoading();
web_show.setWebChromeClient(null);
web_show.setWebViewClient(null);
web_show = null;
}
代碼來源:https://blog.csdn.net/qq_35568796/article/details/85052103?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/242909.html
標籤:其他
