http://blog.csdn.net/bulesky813/article/details/6804581
到目前为止,我只做过Android上的本机扩展,windows, ios 上的还没有实践过
具体流程,和相关网址如下。
1. Android开发环境
参考网址:http://hi.baidu.com/lvjava/blog/item/74a8480ee120e0c67acbe10f.html
2.当然是安装Flash Builder 和 Adobe AIR3 SDK了。
下载网址:http://labs.adobe.com/downloads/air3.html
3.准备写代码了。
首先在Android开发环境里。编写要实现的Android API功能
例如我想实现启动APK安装器,这样AIR的程序,也能自动更新了。
首先将AIR SDK里的lib/android/FlashRuntimeExtensions.jar 添加到Android开发项目的类库里,因为实现扩展要用到里面的类和接口。。。[好像是废话]
- package com.ishowtu.android;
- import java.util.HashMap;
- import java.util.Map;
- import android.util.Log;
- import com.adobe.fre.FREContext;
- import com.adobe.fre.FREExtension;
- import com.adobe.fre.FREFunction;
- import com.ishowtu.android.function.AlertDialogFREFunction;
- import com.ishowtu.android.function.IntentFunction;
- public class AS3Context extends FREContext implements FREExtension {
- private static final String TAG = "[AS3Context]";
- @Override
- public FREContext createContext(String pType) {
- log(pType);
- return new AS3Context();
- }
- @Override
- public void initialize() {
- log("initialize()");
- }
- @Override
- public void dispose() {
- log("dispose()");
- }
- @Override
- public Map<String, FREFunction> getFunctions() {
- //暴露air里能调用的函数名
- HashMap<String, FREFunction> result = new HashMap<String, FREFunction>();
- result.put("intentStart", new IntentFunction());
- result.put("alertDialog", new AlertDialogFREFunction());
- return result;
- }
- private void log(Object o){
- Log.i(TAG, o+"");
- }
- }
package com.ishowtu.android;
import java.util.HashMap;
import java.util.Map;
import android.util.Log;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREExtension;
import com.adobe.fre.FREFunction;
import com.ishowtu.android.function.AlertDialogFREFunction;
import com.ishowtu.android.function.IntentFunction;
public class AS3Context extends FREContext implements FREExtension {
private static final String TAG = "[AS3Context]";
@Override
public FREContext createContext(String pType) {
log(pType);
return new AS3Context();
}
@Override
public void initialize() {
log("initialize()");
}
@Override
public void dispose() {
log("dispose()");
}
@Override
public Map<String, FREFunction> getFunctions() {
//暴露air里能调用的函数名
HashMap<String, FREFunction> result = new HashMap<String, FREFunction>();
result.put("intentStart", new IntentFunction());
result.put("alertDialog", new AlertDialogFREFunction());
return result;
}
private void log(Object o){
Log.i(TAG, o+"");
}
}
然后再是IntentFunction这个类,AlertDialogFREFunction这个类是实现显示警告框的,很简单,我就没必要贴出来了
- package com.ishowtu.android.function;
- import java.io.File;
- import android.app.Activity;
- import android.content.Intent;
- import android.net.Uri;
- import com.adobe.fre.FREContext;
- import com.adobe.fre.FREFunction;
- import com.adobe.fre.FREInvalidObjectException;
- import com.adobe.fre.FREObject;
- import com.adobe.fre.FRETypeMismatchException;
- import com.adobe.fre.FREWrongThreadException;
- public class IntentFunction implements FREFunction {
- @Override
- public FREObject call(FREContext pContext, FREObject[] pParams) {
- try {
- Activity activity = pContext.getActivity();
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setDataAndType(Uri.fromFile(new File(pParams[0].getAsString())), pParams[1].getAsString());
- activity.startActivity(intent);
- return FREObject.newObject(true);
- } catch (IllegalStateException e) {
- e.printStackTrace();
- } catch (FRETypeMismatchException e) {
- e.printStackTrace();
- } catch (FREInvalidObjectException e) {
- e.printStackTrace();
- } catch (FREWrongThreadException e) {
- e.printStackTrace();
- }
- return null;
- }
- }
package com.ishowtu.android.function;
import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREInvalidObjectException;
import com.adobe.fre.FREObject;
import com.adobe.fre.FRETypeMismatchException;
import com.adobe.fre.FREWrongThreadException;
public class IntentFunction implements FREFunction {
@Override
public FREObject call(FREContext pContext, FREObject[] pParams) {
try {
Activity activity = pContext.getActivity();
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(pParams[0].getAsString())), pParams[1].getAsString());
activity.startActivity(intent);
return FREObject.newObject(true);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (FRETypeMismatchException e) {
e.printStackTrace();
} catch (FREInvalidObjectException e) {
e.printStackTrace();
} catch (FREWrongThreadException e) {
e.printStackTrace();
}
return null;
}
}
在Android项目里写好这两个类,就可以导出jar文件了,
导出jar文件后,和Android项目有关的东西,我们就告一段落了。
4.编写extension.xml文件
这个文件android和windows,ios的区别主要在于
<platform name="Android-ARM">
其他两个系统的。我到目前为止也不太清楚,就不说太多,免得误导大家了
- <extension xmlns="http://ns.adobe.com/air/extension/2.5">
- <id>com.ishowtu.android</id>
- <versionNumber>1.0</versionNumber>
- <platforms>
- <platform name="Android-ARM">
- <applicationDeployment>
- <nativeLibrary>com.ishowtu.android.jar</nativeLibrary>
- <initializer>com.ishowtu.android.AS3Context</initializer>
- <finalizer>com.ishowtu.android.AS3Context</finalizer>
- </applicationDeployment>
- </platform>
- </platforms>
- </extension>
<extension xmlns="http://ns.adobe.com/air/extension/2.5">
<id>com.ishowtu.android</id>
<versionNumber>1.0</versionNumber>
<platforms>
<platform name="Android-ARM">
<applicationDeployment>
<nativeLibrary>com.ishowtu.android.jar</nativeLibrary>
<initializer>com.ishowtu.android.AS3Context</initializer>
<finalizer>com.ishowtu.android.AS3Context</finalizer>
</applicationDeployment>
</platform>
</platforms>
</extension>
<id>com.ishowtu.android</id>
这个是在AIR里要用到的,扩展ID
<nativeLibrary>com.ishowtu.android.jar</nativeLibrary>
这个是先导出的jar的文件名
<initializer>com.ishowtu.android.AS3Context</initializer>
<finalizer>com.ishowtu.android.AS3Context</finalizer>
这两个就是你Android项目里,初始化类的名字
5.编写AIR的类库项目
注意:一定要用类库,而不要写到你程序代码里
- package com.ishowtu.android.extensions
- {
- import flash.events.EventDispatcher;
- import flash.events.StatusEvent;
- import flash.external.ExtensionContext;
- public class IntentNativeUtil extends EventDispatcher
- {
- private var context:ExtensionContext;
- public function IntentNativeUtil()
- {
- //根据扩展的ID获取内容
- context = ExtensionContext.createExtensionContext("com.ishowtu.android", "type");
- if(context != null)
- context.addEventListener(StatusEvent.STATUS, onStatusHandler);
- }
- private function onStatusHandler(e:StatusEvent):void
- {
- dispatchEvent(e.clone());
- }
- public function intentStart(fileUrl:String, fileType:String):String
- {
- //这个是在Android项目里暴露的函数名
- return call("intentStart", fileUrl, fileType) as String;
- }
- public function alertDialog(pTitle:String, pMessage:String):Object {
- return call("alertDialog", pTitle, pMessage);
- }
- private function call(pName:String , ...args:Array):Object {
- if (context == null){
- return null;
- }
- //执行Android项目里对应的函数
- return context.call.apply( this , [pName].concat(args) );
- }
- }
- }
package com.ishowtu.android.extensions
{
import flash.events.EventDispatcher;
import flash.events.StatusEvent;
import flash.external.ExtensionContext;
public class IntentNativeUtil extends EventDispatcher
{
private var context:ExtensionContext;
public function IntentNativeUtil()
{
//根据扩展的ID获取内容
context = ExtensionContext.createExtensionContext("com.ishowtu.android", "type");
if(context != null)
context.addEventListener(StatusEvent.STATUS, onStatusHandler);
}
private function onStatusHandler(e:StatusEvent):void
{
dispatchEvent(e.clone());
}
public function intentStart(fileUrl:String, fileType:String):String
{
//这个是在Android项目里暴露的函数名
return call("intentStart", fileUrl, fileType) as String;
}
public function alertDialog(pTitle:String, pMessage:String):Object {
return call("alertDialog", pTitle, pMessage);
}
private function call(pName:String , ...args:Array):Object {
if (context == null){
return null;
}
//执行Android项目里对应的函数
return context.call.apply( this , [pName].concat(args) );
}
}
}
然后生成这个项目对应的swc文件
用winrar打开对应的swc文件,提取里面的library.swf文件
6.好啦,离胜利只差两步了
将extension.xml,*.swc,library.swf,*.jar 文件都放到一个目录下
执行下面的命令,并将下面的文件名换成你自己文件的名字,一定要换。不要拿来主义。不然会出错的
adt这个命令,要将AIR SDK下面的bin目录,添加到环境变量里,或者直接在命令行里切换到对应的目录下。
adt -package -target ane IntentNativeUtil.ane extension.xml -swc IntentNative.swc -platform Android-ARM library.swf com.ishowtu.android.jar
如果一切ok,就会生成一个*.ane的文件了。
7.只差最后一步。
将swc添加到你的AIR程序库函数目录里。
- var intentNative:IntentNativeUtil=new IntentNativeUtil();
- intentNative.intentStart(softUpdateContorl.updateFile.nativePath, "application/vnd.android.package-archive");
var intentNative:IntentNativeUtil=new IntentNativeUtil();
intentNative.intentStart(softUpdateContorl.updateFile.nativePath, "application/vnd.android.package-archive");
第一个参数是APK文件的路径,后面是Android里要用到的这个文件的类型。
写好代码后,再AIR项目配置文件里。添加
- <extensions>
- <extensionID>com.ishowtu.android</extensionID>
- </extensions>
<extensions>
<extensionID>com.ishowtu.android</extensionID>
</extensions>
这个里面的字符串就是你刚刚在extension.xml里填写的<ID>那个节点里的内容了
8.不好意思。差点忘记了很重要的一步,那就是编译项目了。哈哈
用flash builder导出项目。
注意:看到这一步时,再点一次下一步,就不要在继续了。
这时你的项目目录里,应该有bin-release-temp这样一个目录,如果你继续操作,就会生成apk文件,这个目录就不存在了
但是现在的flash builder还不支持本地扩展的打包,我们需要用到命令行
adt -package -target apk-captive-runtime -storetype pkcs12 -keystore E:\key\mycert.pfx As3ColorDesign.apk As3ColorDesign-app.xml As3ColorDesign.swf ico photo update -extdir C:\extensions
这一行命令的意思就是打包APK文件,并且将运行时也打包进去。PS:AIR3新功能
指定密钥。要生成的APK名称。要打包的配置文件。和目录。
重点是这个参数-extdir C:\extensions
就是打包扩展了。你应该把刚刚生成的ane文件放到C:\extensions目录下,当然你也可以放到别的目录。只要这个地方作对应的修改即可
运行成功后,你就可以使用AIR调用Android的API了。
从理论来讲。应该是无所不能了。