Vibration 原生扩展示例

  • Adobe

2011 年 10 月 14 日

话题:语言 & 开发

目录

要求

预备知识

熟悉在 Adobe AIR 上构建移动应用程序,包括熟悉 Objective C、Xcode 或 Android 开发。

需要的第三方产品

用户水平

中级

需要的产品

示例文件

注意:要使用此原生扩展,您需要 Flash Builder 4.5.1 Premium 和 Adobe AIR 3,可以在Adobe Labs上获得它们的候选发行版。

Vibration 类是针对 Adobe AIR 的一个原生扩展。它允许来自 ActionScript 的 AIR 应用程序开发人员使用 Android 或 iOS 移动设备的震动功能。

附加的 ZIP 文件包含:

  • 目录 VibrationActionScriptLibrary 中的 ActionScript 库。此目录包含创建 Vibration 扩展的 ActionScript 部分的 Flash Builder 项目。
  • 目录 VibrationAndroidLibrary 中的 Android 原生库。此目录包含创建 Vibration 扩展的 Android 原生部分的 Eclipse 项目。要构建 Eclipse 项目,首先将 FlashRuntimeExtension.jar 从AIR_SDK>/lib/android/FlashRuntimeExtensions.jar 复制到 VibrationAndroidLibrary\libs 目录。
  • 目录 VibrationiOSLibrary 中的 iOS 原生库。此目录包含创建 Vibration 扩展的 iOS 原生部分的 Xcode 项目。要构建 Xcode 项目,首先将 FlashRuntimeExtension.h 从 <AIR_SDK>/include/FlashRuntimeExtensions.h 复制到 VibrationiOSLibrary 目录。
  • 一个名为 ReadyToUseExtension 的目录,包含 AIR 应用程序开发人员使用原生扩展所需的所有内容:ANE 文件、SWC 文件和包含扩展 ID 的文本文件。
  • 一个名为 TestVibrationExtension 的目录,包含使用 Vibration 原生扩展的示例 AIR 应用程序。

ActionScript 库

ActionScript 库包含 Vibration 类。Vibration 类向 AIR 应用程序提供了这个公共方法和属性:

  • public static function get isSupported(): Boolean
  • public function vibrate(duration:Number): void

该 AIR 应用程序可以创建 Vibration 类的多个实例。但是 Vibratione 类仅创建一个 ExtensionContext 类实例,所有 Vibration 实例都可以共享该实例。

应用程序用途

要使用 Vibration 扩展,AIR 应用程序可以执行以下操作:

  • 通过调用 isSupported 检查扩展是否受支持。
  • 调用 vibrate(),以毫秒作为参数指定震动的持续时间,从而导致设备震动。

例如:

var vibe:Vibration;
if (Vibration.isSupported)
{
    vibe = new Vibration();
    vibe.vibrate(2000);
}

Android 应用程序

对于 Android 应用程序,在您的应用程序描述符文件中包含 Vibration 权限:

Android Permission : <uses-permission android:name="android.permission.VIBRATE"/>

iOS 应用程序

对于 iOS 应用程序:

  • isSupported 属性始终返回 true。在 iOS 设备上,没有原生 API 可用于确定震动功能是否受支持。
  • 传递给 vibrate() 的持续时间值被忽略。设备震动由 iOS 确定的持续时间。

Android 原生库

Android 原生库是在 Java 中使用原生扩展 Java API 实现的。原生库包含以下类:

  • VibrationExtension 实现 FREExtension
  • VibrationExtensionContext 扩展 FREContext
  • VibrationSupportedFunction、VibrationInitNativeCode 和 VibrationVibrateFunction 分别实现 FREFunction

原生库还包含使用这些 FREObject 方法的示例:

  • getAsInt()
  • newObject()

在初始化时,原生库使用 FREContext 类的 getActivity() 方法获取应用程序的 Android 活动。使用返回的活动,初始化方法(VibrationInitNativeCodeFunction.call())获取震动服务:

Activity a = vibExtContext.getActivity();
vibExtContext.androidVibrator = (Vibrator) a.getSystemService(Context.VIBRATOR_SERVICE);

注意:从 ActionScript 部分对 ExtensionContext.createExtensionContext() 的调用必须先返回,原生库才能够调用派生自 FREContext 类的对象的方法。因此,调用 vibExtContext.getActivity() 发生在 ActionScript 部分在来自 createExtensionContext() 的返回值后调用的初始化函数内。对 getActivity() 的调用不能发生在 FREContext 构造函数内。

iOS 原生库

iOS 原生库在 Objective C 中使用原生扩展 C API 实现。原生库包含这些原生扩展 C API 的示例:

  • 扩展初始化器和终结器,使用签名 FREInitializer() 和 FREFinalizer()。
  • 上下文初始化器和终结器,使用签名 FREContextInitializer() 和 FREContextFinalizer()。
  • 原生函数,使用签名 FREFunction()。原生函数包括 IsSupported()、InitNativeCode() 和 VibrateDevice()。
  • FRENewObjectFromBool()

函数 VibrateDevice() 调用 iOS API AudioServicesPlaySystemSound() 来震动设备。但是,如果设备不支持震动,此 iOS API 将不执行任何操作。

注意:在 iOS 原生实现中,不需要初始化,所以初始化原生函数 InitNativeCode() 不执行任何操作。但是,该函数必不可少,因为 Android 原生实现需要一个初始化函数。因此,要使扩展的 ActionScript 接口对于所有原生实现都相同,iOS 原生实现提供了存根。

延伸阅读

关于开发 Adobe AIR 的原生扩展的更多信息,请参阅:

查看原文:Vibration native extension sample

语言 & 开发