Android用Webview播放優酷視訊全屏問題
阿新 • • 發佈:2019-02-12
在播放優酷視訊, 點選全屏的時候, 會黑屏, 而不顯示需要全屏的view
試過各種方法, 發現有一些細節需要注意:
1. demo的Manifest Activity需要設定為: 全屏, 橫屏
<activity android:name="com.demo.flashplay.ActFlashPlay"
android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"
android:screenOrientation="landscape" />
注意: 此處如果不設定為 橫屏 點選全屏也會失敗的
有的說播放flash是需要在Activity新增硬體加速的屬性, 這個demo是在程式判斷, 所以沒有新增
2. 新增許可權:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
3. 退出視訊播放會出現視訊還沒停止的問題:
@Override public void onPause() {// 繼承自Activity super.onPause(); mWebView.onPause(); } @Override public void onResume() {// 繼承自Activity super.onResume(); mWebView.onResume(); }
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { mWebView.loadData("", "text/html; charset=UTF-8", null); finish(); return true; } return super.onKeyDown(keyCode, event); }
當按下返回時, 設定Webview載入空
程式碼:
xml檔案: act_flashplay.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/fullscreen_custom_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
<FrameLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/webview_player"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none" />
</FrameLayout >
</FrameLayout>
java檔案: ActFlashPlay.java
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebSettings.PluginState;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import com.example.myalldemo.R;
public class ActFlashPlay extends Activity {
private FrameLayout mFullscreenContainer;
private FrameLayout mContentView;
private View mCustomView = null;
private WebView mWebView;
private String s = "<html><head><meta charset=\"utf-8\" /><title>swf</title></head><body>"
+ "<embed src=\"http://player.youku.com/player.php/sid/XMzcyMzY2NTY4/v.swf\" bgcolor=\"#000000\""
+ " width=\"80%\" height=\"80%\" align=\"middle\" allowScriptAccess=\"always\""
+ " allowFullScreen=\"true\" wmode=\"transparent\" "
+ "type=\"application/x-shockwave-flash\"> </embed></body></html>";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_flashplay);
initViews();
initWebView();
if (getPhoneAndroidSDK() >= 14) {// 4.0 需開啟硬體加速
getWindow().setFlags(0x1000000, 0x1000000);
}
mWebView.loadData(s, "text/html; charset=UTF-8", null);
// mWebView.loadUrl("file:///android_asset/1234.html");
}
private void initViews() {
mFullscreenContainer = (FrameLayout) findViewById(R.id.fullscreen_custom_content);
mContentView = (FrameLayout) findViewById(R.id.main_content);
mWebView = (WebView) findViewById(R.id.webview_player);
}
private void initWebView() {
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setPluginState(PluginState.ON);
// settings.setPluginsEnabled(true);
settings.setAllowFileAccess(true);
settings.setLoadWithOverviewMode(true);
mWebView.setWebChromeClient(new MyWebChromeClient());
mWebView.setWebViewClient(new MyWebViewClient());
}
class MyWebChromeClient extends WebChromeClient {
private CustomViewCallback mCustomViewCallback;
private int mOriginalOrientation = 1;
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
// TODO Auto-generated method stub
onShowCustomView(view, mOriginalOrientation, callback);
super.onShowCustomView(view, callback);
}
public void onShowCustomView(View view, int requestedOrientation,
WebChromeClient.CustomViewCallback callback) {
if (mCustomView != null) {
callback.onCustomViewHidden();
return;
}
if (getPhoneAndroidSDK() >= 14) {
mFullscreenContainer.addView(view);
mCustomView = view;
mCustomViewCallback = callback;
mOriginalOrientation = getRequestedOrientation();
mContentView.setVisibility(View.INVISIBLE);
mFullscreenContainer.setVisibility(View.VISIBLE);
mFullscreenContainer.bringToFront();
setRequestedOrientation(mOriginalOrientation);
}
}
public void onHideCustomView() {
mContentView.setVisibility(View.VISIBLE);
if (mCustomView == null) {
return;
}
mCustomView.setVisibility(View.GONE);
mFullscreenContainer.removeView(mCustomView);
mCustomView = null;
mFullscreenContainer.setVisibility(View.GONE);
try {
mCustomViewCallback.onCustomViewHidden();
} catch (Exception e) {
}
// Show the content view.
setRequestedOrientation(mOriginalOrientation);
}
}
class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, url);
}
}
public static int getPhoneAndroidSDK() {
// TODO Auto-generated method stub
int version = 0;
try {
version = Integer.valueOf(android.os.Build.VERSION.SDK);
} catch (NumberFormatException e) {
e.printStackTrace();
}
return version;
}
@Override
public void onPause() {// 繼承自Activity
super.onPause();
mWebView.onPause();
}
@Override
public void onResume() {// 繼承自Activity
super.onResume();
mWebView.onResume();
}
}
注: demo中的方法是loadUrl, load的是asset資料夾下的1234.html, 可以播放視訊, 同樣的,上面程式碼中用loadData也是可以的
大家可以試一試, 有什麼問題可以一起討論