目录
熟悉Android上的Adobe AIR原生扩展、Java和Android授权验证库(LVL)
需要的第三方产品
中级
注意:Adobe建议使用下一版的Flash Builder来开发Adobe AIR的原生扩展。立即注册获取Flash Builder 4.6的预发行版。
本教程向您展示针对Android授权的原生扩展的使用和封装,包括保护应用程序的技巧。
Android授权原生扩展为AIR应用程序开发人员提供了访问Android Market授权服务的能力。此服务可帮助您执行您通过Android Market发布的付费应用程序的授权策略。当使用此服务时,您的应用程序可在运行时查询Android Market来获取当前用户的授权状态,然后允许或禁止进一步使用。
开始之前:验证您的Flash Builder副本是否安装了Java开发工具(JDT)。您需要JDT来在Flash Builder中编辑Java代码。关于如何安装JDT的详细信息,请参阅Jason在Flash Builder中的Java开发中的Flex博客文章中介绍的步骤。
要使用针对Android授权的原生扩展,您需要创建:
要创建Java项目,执行以下步骤:
图1. 在Flash Builder中选择Java透视图。
图2. 输入您的新Java项目的名称。
图3. 添加外部JAR文件。
注意:建议使用最新的Android API级目录。
您现在需要将Google Android SDK中可用的LVL复制到您的Java src项目。
转到AIR SDK,复制您的Java项目的src文件夹中的<air_sdk_dir>\frameworks\projects\air\Licensing\Android\AndroidLicensingJavaProject\src中的com文件夹。
现在,您的Java项目应该类似于图4。
图4. Flash Builder中您的Java项目的包资源管理器
针对原生扩展设置您的Java项目之后,您需要创建一个ActionScript库,它支持在Java代码与您的AIR应用程序在运行时通信。
在以后,您将在AIR应用程序中引用此ActionScript库。
图5. 为您的新Flex库项目键入一个名称。
登录您的Google Android Market门户,复制公钥并将它设置为LicenseChecker.as文件中的BASE64_PUBLIC_KEY变量:
// Add the Public key obtained from Android Market here private static const BASE64_PUBLIC_KEY:String = "";
图6. Flash Builder项目资源管理器显示Java和Flex项目。
接下来创建一个AIR应用程序,它将通过您刚才创建的原生扩展使用Android授权。
确保没有使用相同的项目名称,因为此ID已在Google Android Market中使用。
图7. 键入Flex移动AIR项目的名称。
图8. 引用您的Flex移动项目的SWC。
图9. 将链接类型设置为External。
var lc:LicenseChecker = new LicenseChecker(); lc.addEventListener(ErrorEvent.ERROR,errorHandler); lc.addEventListener(LicenseStatusEvent.STATUS,licenseResult); lc.checkLicense();
import com.adobe.air.sampleextensions.android.licensing.*;
protected function licenseResult(event:LicenseStatusEvent):void{ lbl.text = "status: " + event.status + " statusReason: +" + event.statusReason; if (event.status == LicenseStatus.LICENSED) { //Application is licensed, allow the user to proceed. } else if (event.status == LicenseStatus.NOT_LICENSED) { //Application is not licensed, don't allow to user to proceed. switch (event.statusReason) { case LicenseStatusReason.CHECK_IN_PROGRESS: // There is already a license check in progress. break ; case LicenseStatusReason.INVALID_PACKAGE_NAME: // Package Name of the application is not valid. break ; case LicenseStatusReason.INVALID_PUBLIC_KEY: // Public key specified is incorrect. break ; case LicenseStatusReason.MISSING_PERMISSION: // License Check permission in App descriptor is missing. break ; case LicenseStatusReason.NON_MATCHING_UID: // UID of the application is not matching. break ; case LicenseStatusReason.NOT_MARKET_MANAGED: // The application is not market managed. break ; default: // Application is not licensed. } } }
在application标记之后添加一个扩展ID标记:
<extensions> <extensionID>com.adobe.air.sampleextensions.android.licensing</extensionID> </extensions>
所有执行许可证检查的应用程序需要一个Android权限,您需要将它添加到<manifest>标记下:
<uses-permission android:name="com.android.vending.CHECK_LICENSE"/>
另外,确保应用程序描述符命名空间设置为3.0:
<application xmlns="http://ns.adobe.com/air/application/3.0">
注意:这里生成的SWF是一个调试SWF。在Flash Builder中完成此任务的一种方式(无论是AIR项目还是Web项目,或者无论是否可以导出)是向编译器选项添加一个参数。为此,转到Project > Properties > Flex Compiler,然后向Additional编译器参数添加“-debug=false”。
最后,在单击按钮时,此应用程序将执行一次许可证检查,并在标签文本中打印响应。
对于您自己的项目,请确保阅读了下一节,其中提供了保护您的应用程序的建议。
要封装您的应用程序,您需要以下文件:
创建一个名为PackageAL的工作文件夹,将所有这些文件复制到此文件夹,然后使用ADT工具(可在AIR SDK中找到)封装应用程序
在Windows上
<Full Path to adt.bat> -package -storetype PKCS12 -keystore <path to Certificate for Native Extension> -storepass <password> -target ane com.adobe.air.sampleextensions.android.licensing.ane extension.xml -swc AndroidLicensingLib.swc -platform Android-ARM -C .\Android-ARM\.
在Mac OS X上
<Full Path to adt> -package -storetype PKCS12 -keystore <path to Certificate for Native Extension> -storepass <password> -target ane com.adobe.air.sampleextensions.android.licensing.ane extension.xml -swc AndroidLicensingLib.swc -platform Android-ARM -C ./Android-ARM/.
有了ANE文件之后,使用以下命令封装APK文件:
在Windows上:
<Full Path to adt.bat> -package -target apk -storetype PKCS12 -keystore <path to Certificate for AIR application> -storepass <password> AndroidLicensingUsage.apk AndroidLicensingUsage-app.xml AndroidLicensingUsage.swf –extdir.
在Mac OS X上:
<Full Path to adt> -package -target apk -storetype PKCS12 -keystore <path to Certificate for AIR application> -storepass <password> AndroidLicensingUsage.apk AndroidLicensingUsage-app.xml AndroidLicensingUsage.swf –extdir.
注意:如果您希望在设备logcat中查看轨迹,请将目标更改为apk-debug。
当将您的应用程序发布到市场,并且您应用程序的用户已从Google Android Market购买了该应用程序,他们将收到响应“Licensed”。
参考以下技巧,使您的应用程序更加安全:
var retValue:int = extContext.call( "checkLicenseNative", BASE64_PUBLIC_KEY ) as int;
functionMap.put("checkLicenseNative", new AndroidLicensing() );
java –jar <Path to ProGuard.jar> @licensing.pro
SampleAndroidLicensing_o.jar重命名为SampleAndroidLicensing.jar并使用它封装ANE。
下表介绍了一些可能的错误消息和解决它们的技巧:
错误消息 |
如何解决 |
无效的密钥规范错误(来自logcat中的LVL) |
确保您提供了您的Google Android Market门户中可用的完全相同的密钥。 |
missingPermission (statusReason) |
检查您是否在应用程序描述符中提供了Android Permission for Check License。 |
notMarketManaged (statusReason) |
ID无法被Google Android Market应用程序识别,因为从未将具有此ID的应用程序上传到Google Android Market。上传合适的应用程序。 |
联系授权服务器时出错(来自logcat中的LVL) |
确保您登录过您的Android电话的市场应用程序。另请确保您的设备拥有有效的互联网连接。 |
在这个示例中,您学习了如何使用AIR原生扩展授权您的Android应用程序。要了解关于ANE的更多信息,请访问AIR开发人员中心中的Adobe AIR原生扩展。
+
此作品依据Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License授权。超出本许可证范围,与本作品中包含的代码示例相关的权限可在Adobe上找到。
查看原文:Licensing Adobe AIR applications on Android