1. 程式人生 > >Android用Webview播放優酷視訊全屏問題

Android用Webview播放優酷視訊全屏問題

在播放優酷視訊, 點選全屏的時候, 會黑屏, 而不顯示需要全屏的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也是可以的

大家可以試一試, 有什麼問題可以一起討論