您的位置:首页 > 移动开发 > Android开发

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

<!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插件安装目录下的安全路径文件中,这点非常重要,如读者遇到该问题,需要帮助的话可在线留言~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: