Adobe AIR3,Android本机扩展[Native Extensions]详细示例

49 篇文章 0 订阅
37 篇文章 0 订阅

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开发项目的类库里,因为实现扩展要用到里面的类和接口。。。[好像是废话睡觉]

 

  1. package com.ishowtu.android;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5. import android.util.Log;  
  6.   
  7. import com.adobe.fre.FREContext;  
  8. import com.adobe.fre.FREExtension;  
  9. import com.adobe.fre.FREFunction;  
  10. import com.ishowtu.android.function.AlertDialogFREFunction;  
  11. import com.ishowtu.android.function.IntentFunction;  
  12.   
  13. public class AS3Context extends FREContext implements FREExtension {  
  14.       
  15.     private static final String TAG = "[AS3Context]";  
  16.       
  17.     @Override  
  18.     public FREContext createContext(String pType) {  
  19.         log(pType);  
  20.         return new AS3Context();  
  21.     }  
  22.     @Override  
  23.     public void initialize() {  
  24.         log("initialize()");  
  25.     }  
  26.   
  27.     @Override  
  28.     public void dispose() {  
  29.         log("dispose()");  
  30.     }  
  31.   
  32.     @Override  
  33.     public Map<String, FREFunction> getFunctions() {  
  34.         //暴露air里能调用的函数名   
  35.         HashMap<String, FREFunction> result = new HashMap<String, FREFunction>();  
  36.         result.put("intentStart"new IntentFunction());  
  37.         result.put("alertDialog"new AlertDialogFREFunction());  
  38.         return result;  
  39.     }  
  40.       
  41.     private void log(Object o){  
  42.         Log.i(TAG, o+"");  
  43.     }  
  44. }  
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这个类是实现显示警告框的,很简单,我就没必要贴出来了

 

  1. package com.ishowtu.android.function;  
  2.   
  3. import java.io.File;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.Intent;  
  7. import android.net.Uri;  
  8.   
  9. import com.adobe.fre.FREContext;  
  10. import com.adobe.fre.FREFunction;  
  11. import com.adobe.fre.FREInvalidObjectException;  
  12. import com.adobe.fre.FREObject;  
  13. import com.adobe.fre.FRETypeMismatchException;  
  14. import com.adobe.fre.FREWrongThreadException;  
  15.   
  16. public class IntentFunction implements FREFunction {  
  17.   
  18.     @Override  
  19.     public FREObject call(FREContext pContext, FREObject[] pParams) {  
  20.         try {  
  21.             Activity activity = pContext.getActivity();  
  22.             Intent intent = new Intent(Intent.ACTION_VIEW);   
  23.             intent.setDataAndType(Uri.fromFile(new File(pParams[0].getAsString())), pParams[1].getAsString());   
  24.             activity.startActivity(intent);   
  25.             return FREObject.newObject(true);  
  26.         } catch (IllegalStateException e) {  
  27.             e.printStackTrace();  
  28.         } catch (FRETypeMismatchException e) {  
  29.             e.printStackTrace();  
  30.         } catch (FREInvalidObjectException e) {  
  31.             e.printStackTrace();  
  32.         } catch (FREWrongThreadException e) {  
  33.             e.printStackTrace();  
  34.         }  
  35.         return null;  
  36.     }  
  37. }  
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">

其他两个系统的。我到目前为止也不太清楚,就不说太多,免得误导大家了

 

  1. <extension xmlns="http://ns.adobe.com/air/extension/2.5">  
  2. <id>com.ishowtu.android</id>  
  3. <versionNumber>1.0</versionNumber>  
  4. <platforms>  
  5.     <platform name="Android-ARM">  
  6.         <applicationDeployment>  
  7.             <nativeLibrary>com.ishowtu.android.jar</nativeLibrary>  
  8.             <initializer>com.ishowtu.android.AS3Context</initializer>  
  9.             <finalizer>com.ishowtu.android.AS3Context</finalizer>  
  10.         </applicationDeployment>  
  11.     </platform>  
  12. </platforms>  
  13. </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的类库项目

注意:一定要用类库,而不要写到你程序代码里

 

[javascript] view plain copy print ?
  1. package com.ishowtu.android.extensions  
  2. {  
  3.     import flash.events.EventDispatcher;  
  4.     import flash.events.StatusEvent;  
  5.     import flash.external.ExtensionContext;  
  6.   
  7.     public class IntentNativeUtil extends EventDispatcher  
  8.     {  
  9.         private var context:ExtensionContext;  
  10.           
  11.         public function IntentNativeUtil()  
  12.         {  
  13.             //根据扩展的ID获取内容   
  14.             context = ExtensionContext.createExtensionContext("com.ishowtu.android""type");  
  15.             if(context != null)  
  16.                 context.addEventListener(StatusEvent.STATUS, onStatusHandler);  
  17.         }  
  18.           
  19.         private function onStatusHandler(e:StatusEvent):void   
  20.         {  
  21.             dispatchEvent(e.clone());             
  22.         }  
  23.           
  24.         public function intentStart(fileUrl:String, fileType:String):String  
  25.         {  
  26.             //这个是在Android项目里暴露的函数名   
  27.             return call("intentStart", fileUrl, fileType) as String;  
  28.         }  
  29.           
  30.         public function alertDialog(pTitle:String, pMessage:String):Object {  
  31.             return call("alertDialog", pTitle, pMessage);         
  32.         }  
  33.           
  34.         private function call(pName:String , ...args:Array):Object {              
  35.             if (context == null){  
  36.                 return null;  
  37.             }  
  38.             //执行Android项目里对应的函数   
  39.             return context.call.apply( this , [pName].concat(args) );  
  40.         }  
  41.     }  
  42. }  
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程序库函数目录里。

  1. var intentNative:IntentNativeUtil=new IntentNativeUtil();  
  2. 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项目配置文件里。添加

  1. <extensions>  
  2.         <extensionID>com.ishowtu.android</extensionID>  
  3. </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了。

从理论来讲。应该是无所不能了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值