WebView播放Swf文件


    这个是在给儿子写播放器时用到的一些代码,基本上都是网上找的,现在也找不到出处了。在这很感谢这些热心网友的分享。

我在这记一下步骤,省得以后用时又不记得了。

Swf文件要先在Abode官网中安装好播放插件,再利用WebView控件在网页中进行播放。

1.  下载官网的播放插件。

      可以利用下面代码检查当前是否有安装。

  

  //检查浏览器是否支持swf
  private boolean check() {
		PackageManager pm = getPackageManager();
		List<PackageInfo> infoList = pm
				.getInstalledPackages(PackageManager.GET_SERVICES);
		for (PackageInfo info : infoList) {
			if ("com.adobe.flashplayer".equals(info.packageName)) {
				return true;
			}
		}
		return false;						
 } 

2.  使用WebView, 老步骤了。

2.1 AndroidManifest.xml 中要定义

 <!-- 使webview有权限访问外部URL  -->
     <uses-permission android:name="android.permission.INTERNET"/>
特别的地方来了,要播放swf,需要启用硬件加速,不然文件播放时就是黑屏

 <activity android:name="SwfPlayerActivity" android:hardwareAccelerated="true"  ></activity>

2.2 在Activity中设好一些基本的属性,及下面这几个必须的属性

 //要访问本地文件 
webSettings.setAllowFileAccess(true);

//要与javascript交互
webSettings.setJavaScriptEnabled(true);

//与javascript接口的别名,MyWebViewClient继承自WebViewClient
mWebView.addJavascriptInterface(new WebAppInterface(this), "CallJava");


3. 定义要播放swf文件的html文件,这将是以后播放文件的模板。

这玩意相当头痛,记得当时我想了好多法子,找了好长时间啊。

3.1 在html页面中先定义好swf控件,注意下embed标签id,Javascript就是通过它来控制播放。

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 
	codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" 
	align="middle">
	<param name="movie" value="about:blank" />
	<param name="quality" value="high" />
	<embed src="lucky.swf" bgcolor="#FFFFFF" id="fmovie" height=400 width="100%"></embed>
</object>

     3.2  精华Javascript , 播放,控件,暂停,Java与前台Javascript的交互全在这里面。

  每播放一帧,就将进度发送后台Java中通知下。 同时,通过其当前帧与总帧数的检查来看文件是否有播放完成。

这个在做自动连播时很有用。但也不能区分所有情况。

比如,有些swf文件在播放完后,会出来再来一次,重新播放之类的按纽一直卡在那,这个要注意。

<script type="text/javascript">
var playover=true;//直接播放
var total;//定义flash影片总帧数
var frame_number=-1;//定义flash影片当前帧数

//动态显示播放影片的当前帧/总帧数(进度条显示)
function showcount(){
	//已测可用CallJava.consoleFlashProgress(5);
	var num=1+fmovie.CurrentFrame();
	var millisec=150;
	if(num<frame_number || num==total)
		{
		CallJava.consoleFlashProgress(100);
		millisec=1000;
	}
	else
		CallJava.consoleFlashProgress(100*(num/total));

	frame_number=num;
	//geolo.innerText = "n/m: "+frame_number+"/"+total
	setTimeout(showcount,millisec);
}
function isLoad(){
	if(fmovie.PercentLoaded()==100)frame_number=0;
}
//加载影片 
function Load(){
	if(frame_number>=0) {
		total = fmovie.TotalFrames();
		if(playover && total>1) Play();
		CallJava.FlashLoaded();
		setTimeout(showcount,100);
	}else {
		setTimeout(Load,100);
		setTimeout(isLoad,50);
	}
}
//播放影片 
function Play(){
	playover=true;
	fmovie.Play();
}
//暂停播放
function Pause(){
	fmovie.StopPlay();
}

//转到指定帧
function PlayLoop(){
	alert("playloop!");	
	//fmovie.rewind();
	//fmovie.gotoframe(0);
}

//影片高宽
function SetWH(x,y){
	var m=document.getElementById("fmovie");
	m.height=y;//m.width=x;
}
setTimeout(Load,100);
</script>

 4. Activity中的另外一些处理

 WebView的goBack处理   

// webview can go back
mWebView.setOnKeyListener(new View.OnKeyListener() {		
	@Override
	public boolean onKey(View v, int keyCode, KeyEvent event) {
		if(keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {			
			mWebView.goBack();
			return true;
		}
		return false;
	}
});


   //播放控制:
	//播放
	mWebView.loadUrl("javascript:Play()");	
	//暂停
	mWebView.loadUrl("javascript:Pause()");	
	//停止
	mWebView.loadUrl("javascript:playover=false");


MAIL:[email protected]

我的CSDN Blog:http://blog.csdn.net/xcl168

你可能感兴趣的:(android,Flash,webView,swf)