在使用Adobe AIR进行移动应用开发的时候,我们或许会有这样的需求:假如我们开发的是两个应用(A和B),同时安装到手机上,那么能否在A中呼叫B并传递参数呢(或者反过来B操作后,再把参数返回给A)。目前AIR还没有直接呼叫某个APP的API,但我们可以使用手机特有的特性来实现。
第一种方式:使用ANE
假如我们的目标平台是Android,那么可以确定的是,Java是可以呼叫一个APP并传递参数的,所以我们可以借助Java实现的ANE来调用另一个APP(只要知道另一个APP的ID就可以了)。
首先打开Eclipse,创建一个Android项目,引入FlashRuntimeExtensions.jar,编写Extension,Context和Function(具体过程不再细述了,可以参阅创建ANE的初级教程),也可以在稍后的链接中下载Java部分的代码。主要是实现callApp这个Function,代码如下:
package com.techmx.extensions; 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.FREObject; public class CallAppFunction implements FREFunction { @Override public FREObject call(FREContext arg0, FREObject[] arg1) { FREObject result = null; String appPackage; String appID; Intent myIntent = new Intent(); try { Activity currentActivity = arg0.getActivity(); appPackage = arg1[0].getAsString(); appID = arg1[1].getAsString(); myIntent.addCategory(Intent.CATEGORY_LAUNCHER); myIntent.setAction(Intent.ACTION_MAIN); myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); myIntent.setData(Uri.parse(arg1[2].getAsString())); myIntent.setClassName(appPackage, appID); currentActivity.startActivity(myIntent); } catch (Exception e) { // TODO: handle exception } return result; } }
然后打开Flash Builder,创建一个库项目,和Java部分的接口相对应:
package com.techmx.extensions { import flash.events.EventDispatcher; import flash.events.IEventDispatcher; import flash.external.ExtensionContext; /** * 通过一个传递的ID,启动另外一个应用 */ public class CallAppExtension extends EventDispatcher { public static const CALL_APP:String = "callApp"; public static const EXTENSION_ID:String = "com.techmx.extensions.CallAppExtension"; private var extContext:ExtensionContext; public function CallAppExtension(target:IEventDispatcher=null) { extContext = ExtensionContext.createExtensionContext(EXTENSION_ID,""); } public function callApp(appPackage:String,appID:String,customURI:String):void { if(extContext) { extContext.call(CALL_APP,appPackage,appID,customURI); } } } }
然后就可以拿出SWC,和Java项目导出的JAR一起,打包为ANE文件。整个项目工程(包括ANE文件)可以点击这里下载:ANEPack2
然后我们就可以创建两个测试项目:MobileA和MobileB,类型都是ActionScript手机项目。在MobileA中,引入刚才创建的ANE文件,并调用扩展的方法来呼叫另一个应用,也就是MobileB。
MobileA的主体代码:
package { import com.techmx.extensions.CallAppExtension; import flash.display.Sprite; import flash.events.MouseEvent; import flash.net.*; public class MobileA extends Sprite { public function MobileA() { super(); var btn:Sprite = new Sprite(); btn.graphics.beginFill(0x000000,1); btn.graphics.drawCircle(50,50,50); btn.graphics.endFill(); addChild(btn); btn.addEventListener(MouseEvent.CLICK,clickHandler); } protected function clickHandler(event:MouseEvent):void { var extension:CallAppExtension = new CallAppExtension(); //注意ID的规则,AIR会自动补上"air."和".AppEntry" extension.callApp("air.MobileB","air.MobileB.AppEntry","myarguments://me=neo&you=jack"); } } }
注意扩展方法的第三个参数,我们可以用自定义URI的方式传递参数,这里写的是myarguments,实际上你写成其它的值也没有关系,都可以传递过去。
在MobileB中,则可以生成一个文本对象,来显示收到的参数:
package { import flash.desktop.NativeApplication; import flash.display.Sprite; import flash.events.InvokeEvent; import flash.text.TextField; import flash.text.TextFormat; [SWF(width="320",height="480")] public class MobileB extends Sprite { private var label:TextField; public function MobileB() { super(); label = new TextField(); var format:TextFormat = new TextFormat(null,28); label.width = 320; label.height = 480; label.defaultTextFormat = format; addChild(label); NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke); } private function onInvoke(event:InvokeEvent):void { label.text = "Reason: "+event.reason; label.appendText("\n"+"Arguments: " + event.arguments); } } }
将两个应用全部安装到手机上,然后打开MobileA,就可以点击黑色的圆圈呼叫MobileB。
第二种方式:使用自定义URI
使用ANE的方式,可以最大程度的使用底层API的便利,但对于项目还是不太方便。如果只是呼叫另一个APP的话,所幸我们还有另一个选择,就是使用自定义的URI。
这种方式就要求我们对那个需要被调用的应用(在这个例子中就是MobileB),在配置文件中注册一个自定义的URI,比如我们要注册一个“todoair”的URI,需要在配置文件中同时更改Android部分的定义和iOS部分的定义(如果您还要部署到iOS的话)。
<android> <manifestAdditions><![CDATA[ <manifest android:installLocation="auto"> <application> <activity> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.BROWSABLE"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="todoair"/> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.INTERNET"/> </manifest> ]]></manifestAdditions> </android> <iPhone> <InfoAdditions><![CDATA[ <key>UIDeviceFamily</key> <array> <string>1</string> <string>2</string> </array> <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>todoair</string> </array> <key>CFBundleURLName</key> <string>MobileB</string> </dict> </array> ]]></InfoAdditions> <requestedDisplayResolution>high</requestedDisplayResolution> </iPhone>
然后先把MobileB打包安装到手机,接着来修改MobileA的代码,将调用方式修改为:
protected function clickHandler(event:MouseEvent):void { //URL方式 //navigateToURL(new URLRequest("todoair://me=neo&you=jack")); }
这就可以了,打包MobileA到手机,运行效果和刚才基于ANE的方式是类似的:
这个方式不需要编写原生代码来配合,使用简单,但是一定要在配置文件中注册URI才会生效。另外您应该也注意到了,它使用navigateToURL来调用,说明这个方式用网页也是可行的。您可以在您的WEB网站上,用HTML中的A链接,结合注册的自定义URI,来启动您的应用。
相关推荐
4. **Adobe AIR Native Extensions (ANE)**:如果需要调用操作系统级别的功能,比如访问本地文件系统或硬件设备,可以使用ANE。不过,对于简单的"Hello World"示例,通常不需要这一步。 5. **打包与部署**:完成...
在本文中,我们将深入探讨Adobe Integrated Runtime(AIR)2.0中的一个重要功能——调用本地应用程序,以及如何通过实例和样例实现与本机的通信。AIR 2.0为开发者提供了一种强大的方式,允许Flex或ActionScript应用...
5. **Native Extensions (ANE)**: ANE是Adobe AIR的一个重要特性,允许开发者调用本地系统APIs,扩展AIR应用程序的功能,例如访问硬件设备(如摄像头、GPS)或者使用特定的操作系统服务。 6. **Runtime Environment...
5. **打包和发布**:生成AIR应用文件(.air或.app),并通过Adobe AIR打包工具发布到目标平台。 总的来说,Flash Air开发工具包为开发者提供了一套完整的解决方案,使得他们能够利用熟悉的Flash技术开发出功能丰富...
AIR Native Extensions(ANE)是Adobe AIR平台的一个关键特性,它允许开发者在Adobe AIR应用程序中集成原生代码,从而利用移动设备或桌面系统的特定功能。ANE使得ActionScript开发者可以扩展Flash Player和Adobe AIR...
在移动应用开发领域,Flash AS3 Air for iOS的内购功能是开发者常用的一种技术,用于在应用程序内部提供付费服务或商品。这篇教程将深入探讨如何实现这一功能,并结合ANE(Adobe Native Extensions)来构建IPA(iOS...
标题中的“flash编写的拍照调用摄像头生成apk文件”指的是使用Adobe Flash CS6这款软件,通过ActionScript编程语言,创建一个能够调用Android设备摄像头并实现拍照功能的应用程序。最终,这个应用程序被编译为一个...
本教程主要聚焦于如何在Adobe Air框架下实现跨平台的iOS和Android内购功能。Adobe Air允许开发者使用Flash技术创建原生的移动应用程序,它支持多种操作系统,包括iOS和Android。 一、iOS内购 1. **配置App Store ...
3. **ANE (Adobe Native Extension)**:ANE是Adobe Air的一个特性,允许开发者创建可扩展的原生代码库,这些库可以在Air应用程序中调用,以增加Air不支持或需要更高效实现的功能。AdMob ANE就是这样一个扩展,它封装...
"Air源码"是一个非常适合新手入门的教程,它涵盖了Adobe Air技术的基础到进阶知识。Adobe Air(Adobe Integrated Runtime)是一种跨平台的应用程序运行时环境,允许开发者使用HTML、CSS、JavaScript或者ActionScript...
综合以上分析,我们可以得出,这是一个基于Adobe Air的条形码识别工具,它包括一个Android版本的应用(demo.apk),使用ActionScript实现核心识别功能(BCDEMO.as),并且可能依赖于专门的条形码阅读库(BarCode...
在调用微博接口之前,确保你已经注册成为新浪开发者,并获得了应用的API密钥(App Key)、应用密钥(App Secret)以及OAuth认证所需的回调URL。这些信息将用于身份验证和授权过程,使得你的Flex应用能够合法地代表...
总结,Mobile FLEX调用GPS是通过Adobe AIR的Geolocation API实现的,它提供了获取设备当前位置的能力,并允许开发者处理这些数据。在实际应用中,需要注意权限请求、错误处理、性能优化以及用户体验的提升。通过GPS....
在本文中,我们将深入探讨如何使用Adobe Flex调用Web Service来开发一个天气预报服务。Flex是一种基于MXML和ActionScript的开源框架,用于构建富互联网应用程序(RIA)。它允许开发者创建交互性强、用户体验良好的...
腾讯微博API JS/Flash/AIR-SDK是一款集成了JavaScript、Flash和Adobe AIR技术的开发工具包,主要用于帮助开发者实现与腾讯微博平台的交互。这款SDK提供了丰富的功能,使得开发者能够轻松地在自己的网站或应用程序中...
支付宝ANE的实现基于Adobe AIR的Native Extension机制,这是一种让AIR应用调用本地操作系统功能的方式。开发者可以创建一个ANE,将支付宝SDK封装其中,然后在AIR应用中调用ANE提供的接口,完成与支付宝服务器的通信...
AIR Native Extension(ANE)是Adobe AIR的一项重要特性,它允许开发者访问iOS设备的本地功能,如应用内购买、GameCenter、推送通知、摄像头访问等。通过ANE,ActionScript与本地库之间可以实现数据通信,从而增强...
我们需要查看源代码才能了解具体的实现方式。 `power22.exe`是一个Windows可执行文件,可能是一个辅助程序,用于在AIR应用程序不能直接执行系统命令的情况下,作为中介来执行关机命令。 `power22.fla`是Flash的...
Flex是一种基于ActionScript和Flash Player或Adobe AIR的开源框架,用于构建富互联网应用程序(RIA)。在此场景下,我们讨论的是如何在Flex中集成相机功能,让用户能够拍摄照片,并将照片存储在移动设备的SD卡上。 ...