1. 程式人生 > >Android上面做Flash播放器

Android上面做Flash播放器

有這樣一個需求,做一個flash視訊播放器。

Android2.2之後才支援安裝Flash外掛並在WebView播放Flash視訊,初步想法是給Activity設定一個全屏的WebView,然後傳入一個Flash地址。後來發現了一些問題,慢慢才理清。

一、 直接呼叫webView.loadUrl並傳入Flash地址,在我的定製機器上面,有時會出現白屏(無聲音無影象)。

二、 把Flash地址包裝到一個HTML頁面中,再呼叫webView.loadData傳入這個頁面資料。這個在2.X上面沒有問題可以執行,但是FrameLayoutRelativeLayout都不能把我想新增的LOGO放到螢幕的左上角,而是把

LOGO蓋在了Flash播放器的下面。最後,只好在HTML頁面裡面的embed標籤前面加了一個<br/>換行符來解決。還有就是在2.3上執行正常,到了3.2上面會導致程序崩潰。所以這個也不是通用解決方案。

三、 直接呼叫系統瀏覽器,把flash地址扔進去。這個簡單暴力,但確實能把問題丟擲去。

Intent intent2 = new Intent(Intent.ACTION_VIEW, Uri.parse(flash_url));

startActivity(intent2);

另外,開啟硬體加速前發現100%白屏,開啟後就好多了。

不管是程式重啟還是白屏,都是針對特定機器而言,最重要的還是多記下來幾個方案。

參考網址:

各瀏覽器下使用 OBJECT 元素和 EMBED 元素嵌入 Flash 存在差異

http://www.w3help.org/zh-cn/causes/HO8001

Android WebView使用

http://trinea.iteye.com/blog/1152557

補充於:2011.11.17

無論是使用哪種方式載入Flash,開始播放之前會有一個閃屏的現象,經歷分析和查詢資料,是因為flash外掛生一個SurfaceView加入到WebView當中,然後在這個SurfaceView中繪製內容,而這個SurfaceView的背景是白色的,在正式繪製出內容之前,會先顯示白屏了。

我試著覆蓋WebView.drawChild方法看能不能監聽到什麼時候開始繪製,但這個方法根本不會呼叫。也就是說,flash外掛生成的根本就沒有生成SurfaceView,或者雖然生成但沒有加入到WebView的中去。


參考資料:
Screen blinking when using a webview with flash
http://stackoverflow.com/questions/5095977/screen-blinking-when-using-a-webview-with-flash
Android瀏覽器外掛技術的應用研究
http://www.docin.com/p-238856627.html

補充於:2011.11.18

Flash外掛的packageName是com.adobe.flashplayer,Service名字是com.adobe.flashplayer.FlashPaintSurface
可以通過這些資訊來檢測是否安裝了Flash外掛:

PackageManager pm = getPackageManager();
		List<PackageInfo> infoList = pm
				.getInstalledPackages(PackageManager.GET_SERVICES);
		PackageInfo flashInfo = null;
		for (PackageInfo info : infoList) {
			if ("com.adobe.flashplayer".equals(info.packageName)) {
				flashInfo = info;
				System.out.println("name" + flashInfo.versionName);
			}
		}
		if (flashInfo == null) {

			return;
		}

另外,可以還可以檢測出使用者安裝的Flash的版本號:
private boolean isFlashPluginOut(PackageInfo flashInfo) {
		String v1 = flashInfo.versionName.replace(".", "");
		String v2 = "10.3.185.21".replace(".", "");
		return v1.compareTo(v2) < 0;
	}

如果版本過低可以定向到Market:
private void gotoMarket() {
		Intent installIntent = new Intent("android.intent.action.VIEW");
		installIntent.setData(Uri
				.parse("market://details?id=com.adobe.flashplayer"));
		startActivity(installIntent);
	}

參考網址:
呼叫market搜尋軟體
http://bashenmail.iteye.com/blog/603764