Android通过javascript与flash动画交互
2015-01-17 12:35
489 查看
问题描述:当我们在Android应用上加载了flash,然后希望点击flash的相关控件,Android应用能够做出相应。
这就涉及到Android通过javascript与flash动画交互技术。我们实现方案是:新建一个html文件显示flash动画,html文件嵌入javascript函数与flash交互,然后我们我们Android应用通过webview加载html文件,再与该html文件嵌入的javascript函数交互,最后可以实现Android的数据与flash的数据进行通信。有点绕口,不知读者是否看明白了。总之就一句话:html中的javascript函数是中介,Android与flash分别与它进行数据传输即可。
贴代码:
flash.html
下面是Android完整代码
Android加载flash时有一些要注意的问题:Webview加载flash一开始会出现白屏,可以通过刷图的形式掩盖;刚加载完flash,它还无法获得Android用户的焦点事件,必须在代码里面模拟点击屏幕,才可以获得焦点;在运行flash的过程中可能会出现焦点丢失的情况,我的方案是每隔几秒点击屏幕一次;Android加载flash需要flash插件,必须确保插件装好了,但是。即使插件装好了也不能通信,必须要把要加载的flash的路径写到flash插件安装目录下的安全路径文件中,这点非常重要,如读者遇到该问题,需要帮助的话可在线留言~
这就涉及到Android通过javascript与flash动画交互技术。我们实现方案是:新建一个html文件显示flash动画,html文件嵌入javascript函数与flash交互,然后我们我们Android应用通过webview加载html文件,再与该html文件嵌入的javascript函数交互,最后可以实现Android的数据与flash的数据进行通信。有点绕口,不知读者是否看明白了。总之就一句话:html中的javascript函数是中介,Android与flash分别与它进行数据传输即可。
贴代码:
flash.html
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd "> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script language="JavaScript" type="text/JavaScript"> var str1 = "hello"; var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1; function myFlash_DoFSCommand(command, args) { var myFlashObj = InternetExplorer ? myFlash : document.myFlash; //flash传来的参数,如果有数据传来则调用Android代码的函数,将flash数据传给Android if(command =="file1_open"||command=="file2_open"||command=="file3_open"||command=="file4_open"||command=="file5_open"||command=="file6_open") { //alert(command); doFromCommand(command); }else{ //alert(command); } } //下面的代码是网页加载flash的钩子 if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 && navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) { document.write('<SCRIPT LANGUAGE=VBScript\> \n'); document.write('on error resume next \n'); document.write('Sub myFlash_FSCommand(ByVal command, ByVal args)\n'); document.write(' call myFlash_DoFSCommand(command, args)\n'); document.write('end sub\n'); document.write('</SCRIPT\> \n'); } //调用android的函数,runJs2Activity是Android代码定义的函数,<span style="font-family: Arial, Helvetica, sans-serif;">playerJs是Android中定义该类的别名,</span><span style="font-family: Arial, Helvetica, sans-serif;">目的是获得flash传来的数据</span> function doFromCommand(command){ window.playerJs.runJs2Activity(command); } </script> </head> <body> <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=11,0,0,0" WIDTH="100%" HEIGHT="100%" id="myFlash"> <PARAM NAME=movie VALUE="flash.swf"> <!--这里一堆代码是加载flash动画的--> <PARAM NAME=quality VALUE=high> <PARAM NAME=bgcolor VALUE=#CCCCCC> <param name="allowScriptAccess" value="always" /> <param name="allowNetworking" value="all"> <param name="allowFullScreen" value="true"> <EMBED src="flash.swf" quality=high bgcolor=#CCCCCC WIDTH="100%" HEIGHT="100%" NAME="myFlash" swLiveConnect="true" allowScriptAccess="always" allownetworking="all" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED> </OBJECT> <div id="show" style="color:#000000;font-size:30px;margin-left:50px" ></div> </body> </html>Android中定义的与thml交互的函数
//类中类:定义js中调用的Android类 class RunJavaScript { public void runJs2Activity(String str) { strFromJs = str; mScriptHandler.removeCallbacks(mPlayerRunnable); mScriptHandler.postDelayed(mPlayerRunnable, 300); } }Android中是Vebview加载html文件的,其中交互类的别名是这样定义的
//给网页文件添加Android与JS交互函数的定义 mWebView.addJavascriptInterface(new RunJavaScript(), "playerJs");
下面是Android完整代码
package com.ideal.swfplayer; /************************ *用来加载flash.html文件* ************************/ import java.io.File; import java.util.Timer; import java.util.TimerTask; import sunvision.database.DBOperation; import sunvision.dialog.MatchDialog; import sunvision.dialog.TipDialog; import sunvision.dialog.VersionDialog; import sunvision.file.FileOperation; import sunvision.tools.FlashPath; import sunvision.tools.IdealSystemProperties; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.SystemClock; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; 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 android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class MainFlashActivity extends Activity { private WebView mWebView = null; private FrameLayout mFrameLayout = null; private ImageView mImageView = null; private Timer mTimer = null; private Timer mTimer2 = null; private WebSettings settings; private String strFromJs = ""; private String TAG = "SwfPlayer"; private int mLoadingIndex = 0; private int mWebViewLoadTimes = 0; private int versionloadtime=0; private MatchDialog mDialogManager; private Handler mHandler = null; private FileOperation mFileUnit; private boolean isversionup=true; Handler mScriptHandler = new Handler() {}; //加载驱动 public native void native_initPlayer( ) throws Exception; public native void native_prepare() throws Exception; public native void native_start(); public native void native_finish(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_flash); //初始化UI界面 InitUI(); //加载主界面 loadSwf(FlashPath.MainPath); //等待消息传过来更新界面 //mHandler.post(task); //启动定时器1秒刷新一次 mHandler = new Handler() { @SuppressLint("Recycle") public void handleMessage(Message msg) { Log.i(TAG, "PlayerActivity-mLoadingIndex==" + mLoadingIndex); switch (msg.arg1) { case 0: mImageView.setImageResource(R.drawable.flashloading); break; case 1: mTimer.cancel(); mImageView.setVisibility(View.GONE); mImageView.destroyDrawingCache(); mLoadingIndex = 0; break; case 6: mWebView.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN, mWebView.getLeft() + 5,mWebView.getTop() + 5, 0)); mWebView.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,mWebView.getLeft() + 5, mWebView.getTop() + 5, 0)); break; default: break; } super.handleMessage(msg); } }; } //UI界面初始化函数 private void InitUI() { mFileUnit = new FileOperation(getApplicationContext()); mFileUnit.createFlashPlayerTrust(); mFrameLayout = (FrameLayout) findViewById(R.id.player_frameLayout); mImageView = (ImageView) findViewById(R.id.swf_loading_img); mWebView = (WebView) findViewById(R.id.webView_show); } //加载Flash动画 @SuppressLint({ "SetJavaScriptEnabled", "Recycle" }) public void loadSwf(String swfPath) { //获得配置函数 settings = mWebView.getSettings(); //设置允许与js交互 settings.setJavaScriptEnabled(true); //设置允许文件操作 settings.setAllowFileAccess(true); //设置允许使用Adobe Flash播放视频 settings.setPluginState(PluginState.ON); //设置加载方式是替换加载,而不是新页面加载 settings.setLoadWithOverviewMode(true); //设置编码方式 settings.setDefaultTextEncodingName("GBK"); //设置透明背景 mWebView.setBackgroundColor(0); //重写Flash加载辅助函数 mWebView.setWebChromeClient(new WebChromeClient() { public void onShowCustomView(View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback) { super.onShowCustomView(view, callback); //Android SDK版本 if (Build.VERSION.SDK_INT >= 14) { if (view instanceof FrameLayout) { mFrameLayout.addView(view,new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT,Gravity.CENTER)); mFrameLayout.setVisibility(View.VISIBLE); } } } @Override public void onHideCustomView() { super.onHideCustomView(); } }); //重写Flash加载主要函数 mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } //Flash启东时调用 @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); mWebViewLoadTimes++; } //Flash加载完成之后调用 @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); //Flash加载之前会有一段时间是白屏,为了掩盖,让五张图片隔时刷新 if (mWebViewLoadTimes == 1) { mTimer = new Timer(); mTimer.schedule(new TimerTask() { @Override public void run() { Message msg = new Message(); msg.what = 0; msg.arg1 = mLoadingIndex; mHandler.sendMessage(msg); mLoadingIndex++; } }, 0, 2000); //flash偶尔会失去焦点,让flash加载完成之后每隔2秒点击一次界面获得焦点 mTimer2 = new Timer(); mTimer2.schedule(new TimerTask() { @Override public void run() { Message msg = new Message(); msg.what = 0; msg.arg1 = 6; mHandler.sendMessage(msg); } }, 0, 2000); } else if (mWebViewLoadTimes >= 2) { mWebViewLoadTimes = 0; String path = FlashPath.TIP_NO_FILE; Intent intent = new Intent(MainFlashActivity.this,NoFileFlashActivity.class); intent.putExtra("swfPath", path); startActivity(intent); MainFlashActivity.this.finish(); } } }); //给网页文件添加Android与JS交互函数的定义 mWebView.addJavascriptInterface(new RunJavaScript(), "playerJs"); //设置网页能够获得焦点 mWebView.requestFocusFromTouch(); mWebView.requestFocus(); mWebView.setFocusable(true); //设置完毕之后加载Flash mWebView.loadUrl(swfPath); } //类中类:定义js中调用的Android类 class RunJavaScript { public void runJs2Activity(String str) { strFromJs = str; mScriptHandler.removeCallbacks(mPlayerRunnable); mScriptHandler.postDelayed(mPlayerRunnable, 300); } } //类中接口:当js调用RunJavaScript时,新开辟线程处理消息,这里是接口 Runnable mPlayerRunnable = new Runnable() { @Override public void run() { //文件操作行为 if (strFromJs.equals("file1_open")||strFromJs.equals("file2_open")||strFromJs.equals("file3_open")||strFromJs.equals("file4_open")||strFromJs.equals("file5_open")||strFromJs.equals("file6_open") ) { File folder = new File("/mnt/external_sd/"); //TF卡存在 if(folder.length()>0){ Intent intent = new Intent(MainFlashActivity.this,FileListActivity.class); intent.putExtra("filename", strFromJs); startActivity(intent); //TF卡不在 }else{ TipDialog mTipDialog = new TipDialog(MainFlashActivity.this, R.style.IdealDialog,R.drawable.no_tf_card,3); //设置背景透明度 WindowManager.LayoutParams lp=mTipDialog.getWindow().getAttributes(); lp.dimAmount=0.7f; mTipDialog.getWindow().setAttributes(lp); mTipDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); mTipDialog.show(); } } } }; //加载Antivity是调用 @SuppressLint("Recycle") @Override protected void onResume() { super.onResume(); //flash在回到该Activity是能够继续播放 try { mWebView.getClass().getMethod("onResume").invoke(mWebView, (Object[]) null); } catch (Exception e) { e.printStackTrace(); } } //Activity停止时调用 @Override protected void onPause() { super.onPause(); //允许flash暂停播放 try { mWebView.getClass().getMethod("onPause").invoke(mWebView, (Object[]) null); } catch (Exception e) { e.printStackTrace(); } } //该Activity销毁时调用 @Override protected void onDestroy() { super.onDestroy(); mWebView.destroyDrawingCache(); mWebView.destroy(); try { mHandler.removeMessages(0); mTimer.cancel(); } catch (Exception e) { } } }
Android加载flash时有一些要注意的问题:Webview加载flash一开始会出现白屏,可以通过刷图的形式掩盖;刚加载完flash,它还无法获得Android用户的焦点事件,必须在代码里面模拟点击屏幕,才可以获得焦点;在运行flash的过程中可能会出现焦点丢失的情况,我的方案是每隔几秒点击屏幕一次;Android加载flash需要flash插件,必须确保插件装好了,但是。即使插件装好了也不能通信,必须要把要加载的flash的路径写到flash插件安装目录下的安全路径文件中,这点非常重要,如读者遇到该问题,需要帮助的话可在线留言~
相关文章推荐
- PhoneGap(Cordova)通过自定义plugin插件实现javascript与android交互
- android web view的学习 2 通过WebChomeClient 实现进度条和title,通过WebViewClient 来进行url的拦截,和javascript的交互
- android 中 java 和 javascript 通过webview 交互
- android 通过WebView与javascript实现数据交互
- VC写的Flash动画播放组件 ,实现透明播放Flash动画及交互功能,类似迅雷及PPS广告动画
- javascript与flash函数相互交互
- Javascript与flash交互通信基础教程
- Javascript与flash交互通信基础教程
- flash和javascript交互时 出现“对象不支持此属性或方法”错误的解决方法
- C++ 实现flash动画播放——Flash和c++的交互
- Javascript与flash交互通信控制的方法
- Flash和ASP/PHP以及Javascript的交互
- DELPHI OCX控制与页面通过javascript交互
- Flash与JavaScript信息交互
- 通过Flash和c++的交互来实现自己的桌面游戏
- javascript控制flash动画
- 通过Flash和c++的交互来实现自己的桌面游戏
- [原]flash研究(三)——Falsh与JavaScript交互
- flash研究(三)——Falsh与JavaScript交互
- VC++开发的ActiveX如何通过JavaScript脚本和EOS应用交互