Archive for the ‘AIR’ Category

AIRKinect 1.7.1 Release

Current Release version: 1.7.1

Whats New in 1.7.1?

  • Bug Fixes to Spacial Mapping

AIRKinect 1.7.1 ANEs, SWCs, and DOCs can be found here.
https://github.com/AS3NUI/airkinect-1-release

AIRKinect Extended Library and docs are located here also
https://github.com/AS3NUI/airkinect-1-release

Here are the links to our Open Source Repos
AIRKinect 1.7.1 core
AIRKinect 1.7.1 Core Exmaples
AIRKinect 1.0.1 Extended
AIRKinect 1.0.1 Extended Exmaples

Lastly the Windows Installer binaries have been updated with the latest ANE so you can simply download those and check them out here at out AIREkinect Release Download Page

Advertisements

AIRKinect 2 Point Cloud Features

I’d like to share some work I’ve been doing on the point cloud for the upcoming AIRKinect 2 release. We haven’t spent much attention at the point cloud in the previous releases, but we’ll be adding some interesting stuff.

One new feature will be the option to specify a density for the point cloud. This way you can lower the dataset – for example, only get each 4th point instead of all points – and get faster running results (although it runs fast in release builds). We’re also looking at adding RGB information to the point cloud, so you don’t see white dots, but you see the dots, matching the RGB colors from the camera.

We’d also like to add interactivity to the point cloud. For this, we’re adding a feature called “point cloud regions”, which enable you to specify 3D regions, where you can track the number of dots. This counting will happen on the C side of the extension, so it doesn’t slow down your actionscript code. With this point count, you could add triggers as soon as a certain amount of points is reached within a region. This way, you don’t need to do full skeleton tracking to create interactive applications.

I hope you like what we’ve got lined up!

Adobe AIR 3新特性

自从2008年发布了第一个版本,Adobe AIR已经走过了很长的一段路。在此期间,我们为AIR增加了几十个较大的特性,上百个较小的特性,性能优化和错误修复,并且我们支持3个额外的平台:iOS (iPhone和iPad),Android, 和Adobe AIR for TV.

AIR 3将是我们在不到两年半的时间里的第11个发行版本。虽然我们每次的发行版都代表了很大的进步,但我个人觉得这次是非比寻常的。AIR 3包括以下新的API和特性:

  • Stage3D(桌面特性)。Stage3D是一个底层的,具备硬件加速的二维和三维渲染的API。对于AIR 3,目前这些API只能在AIR的桌面版本中使用,然而,未来这些特性也将进入移动设备。Stage3D是一个非常重要的特性,它的意义之大让我们感到言语都难以描述,您可以从这里得到更加详细的信息, 请参阅Stage 3D页面。
  • 本地扩展 (所有平台)。这又是一个重要的特性。从AIR 3的版本开始,开发者可以通过绑定本地扩展和应用程序,来增强AIR运行时的功能,然后他们就可以在ActionScript中调用那些扩展(这个特性原先只在Adobe AIR 2.5 for TV中存在,但是基于AIR 3,这个特性在所有的平台可用)。您可以认为Adobe AIR本地扩展(简称ANEs)就是ActionScript库(SWCs),只不过是包含了本机代码实现。ANEs的适用场合,包括让您的应用程序访问AIR所不支持的原生API(见下面的例子),并授权在某些情况下访问本机代码,以达到更好的性能。关于更多AIR 3本地扩展的信息,请参阅奥利弗.高盛的这篇文章:扩展Adobe AIR
  • Android Market的授权集成 (显然只支持Android)。使用ANE文件,开发人员可以访问Android Market的授权服务,让发布者执行许可政策。这是一个能体现ANE强大特性的很好的例子:因为这个特性(授权服务)在iOS中是不可用的,所以我们不会把它作为AIR的直接支持的功能;但是,ANE可以保证我们运行于Android设备的AIR应用可以很轻松的访问这些API。
  • 运行时捆绑 (Android和桌面)。在之前的版本中,需要您的最终用户在安装您的应用之前,已经安装了AIR的运行时(如果没有,则必须先安装AIR运行时),如果您想改变这个过程(让您的应用程序安装过程和其它本地安装的应用程序没有区别),或者您是想控制您的应用程序运行所需的AIR版本,AIR 3允许您捆绑AIR运行时和您的应用程序。捆绑运行时非常容易,当您构建一个Android应用时可以设置apk-captive-runtime变量,如果是构建桌面应用,则可以设置bundle变量。(注意在iOS上AIR一直使用一个捆绑的运行时,虽然其机制不太相同。)
  • 背景音频播放 (对于iOS是新特性;在Android上之前就被支持了)。由于iOS独特的多任务模式,在之前如果我们想在AIR应用处于非活动状态的时候继续播放音频,是不可能的。在AIR 3中,您所需要做的只是修改您的应用程序描述文件,声明您需要播放背景音乐,然后它会自动工作。(基本上,当应用程序被放置到后台程序中,它将继续运行。但是,所有的屏幕更新将被禁用,以保持电池寿命,并符合iOS的多任务要求。)
  • 在iPad对CameraRoll的支持。虽然CameraRoll在技术上已经被iPad支持,但是我们在AIR 3中增加了很多更好的支持。在iPad上,图片选择器不再占用整个屏幕,在iPhone和iPod touch上也是如此。相反,它会在调用它的UI组件的相对位置上,出现一个浮动的面板。使用额外的CameraRollBrowseOptions类,开发人员可以选择图像选择器的大小和位置,并指定调用它的UI组件的位置。欲了解更多信息和代码示例,请参阅我的博客文章, 如何正确使用iPad上的CameraRoll API 。
  • 视频硬件加速 (移动设备):AIR 2.5通过StageVideo为TV带来了视频硬件加速;现在AIR 3则为移动设备也提供了StageVideo。
  • 本机文本字段(移动设备) 。之前版本的AIR提供给开发者访问底层渲染的能力,比如StageVideo (视频硬件加速)和StageWebView (本地的HTML渲染)。AIR 3提供了StageText的API,它允许开发人员将系统原生的文本字段放置在移动应用程序中。虽然您仍然可以使用Flash文本字段,但是StageText文本字段可以使用所有操作系统底层支持的特性,比如放大镜,文本选择,自动更正等等。
  • 前置摄像头支持 (iOS和Android)。现在ActionScript的摄像头API可以访问iOS和Android设备的前置摄像头和后置摄像头(如果是Android设备,至少需要2.3的版本)。您可以使用新的Camera.position属性以及新CameraPosition类中的常量(背部,正面,和UNKNOWN)来确定摄像机的位置。欲了解更多信息和代码示例,请参阅我的博客文章, AIR 3前置摄像头支持 。
  • 移动设备的加密本地存储(带来了台式机和移动设备之间的等价实现)。EncryptedLocalStore的API曾经只在桌面上可用,现在则进入了iOS和Android。这个API用于安全地存储用户凭据,加密密钥,私密信息,和类似的重要信息。
  • 设备扬声器控制 (移动设备)。使用新的SoundMixer audioPlaybackMode属性,和新的AudioPlaybackMode类中的常量(媒体和语音),开发人员可以控制是否是通过电话的听筒或扬声器播放音频。
  • 原生JSON支持 (移动和台式机)。原先只能使用ActionScript来解析JSON,现在则是由运行时提供更有效的原生JSON支持。相对于ActionScript实现,原生的JSON API的速度更快,使用更少的内存。欲了解更多信息和代码示例,请参阅我的博客文章, AIR 3中的原生JSON支持 。
  • 套接字(Socket)改进(移动和桌面)。曾经我们认为应该很容易的通过ProgressEvent.SOCKET_DATA来读取从网络传到ActionScript套接字缓冲区的数据,并确定有多少个字节可供读取(Socket.bytesAvailable)。然而,事实尚非如此。换句话说,在AIR 3之前,没有办法知道有多少数据从ActionScript套接字成功地写入了网络的缓冲区,也不可能知道有多少数据正在等待被写入。这导致开发者不确定调用套接字的关闭是否是安全的,或知道当用户想关闭应用程序的时候,是否有一个网络进程还在处理中。通过AIR 3,开发人员可以使用OutputProgressEvent.OUTPUT_PROGRESS事件和Socket新属性.bytesPending,以确定有多少数据被写入到网络,多少数据在ActionScript套接字中仍在等待写入。这些新的API可以帮助我们构建更强壮的依赖套接字网络访问的应用程序。欲了解更多信息和代码示例,请参阅我的博客文章, AIR 3中套接字的改进 。
  • H.264视频编码 (桌面)。您可以将摄像头捕获的视频基于H.264进行编码。
  • JPEG XR的支持 (移动和台式机)。AIR 3现在支持JPEG XR,一个新的文件格式,相比JPEG有几个优点。例如,JPEG XR提供了更好的压缩率,更小的压缩损失,更准确的色彩,和Alpha透明度。欲了解更多信息,请查阅Wikipedia上的JEPG XR文章
  • 更高分辨率的位图(移动和桌面) 。在之前的AIR中,位图被限制为16万像素(16777215像素)和8191的最大宽度/高度。在AIR 3中,所有的限制已被删除,这意味着现在的最大尺寸是由主机操作系统决定的,而不是AIR限制的。
  • 多声道数字音频输出 (只支持AIR for TV)。现在电视上的Adobe AIR可以播放杜比数字+ 5.1环绕声和DTS 5.1音频流。新的Capabilities.hasMultiChannelAudio属性,新的AudioDecoder类(其中包含代表几个不同的多声道音频类型的常量),和Capabilities.serverString属性,都可以让开发者来检测设备的多声道音频功能,并从ActionScript中通过RTMP协议输出正确的音频比特流。
  • 高级控制器支持 (只支持AIR for TV)。使用新的GameInput API,开发人员可以构建基于高级电视控制器的游戏。一些新的API允许枚举设备(可用控制器),枚举设备的控制功能(按钮,触发器,加速度等),并从设备中得到控制值。
  • 更容易删除一个容器的所有的子元件 (所有平台)。DisplayObjectContainer现在已经具备了removeChildren()函数,它可以只用一个方法删除所有的子元件。这当然比下面的操作更有效:
    (this.numChildren> 0)this.removeChildAt(0)
  • 更容易判断MovieClip是否在播放 (所有平台)。通过使用新的isPlaying属性,可以很容易判断一个电影剪辑是否在播放。
  • GC建议的API(所有平台)。新的System.pauseForGCIfCollectionImminent功能,可以让AIR开发人员更好地控制运行时的自动垃圾回收机制。由于垃圾回收有可能造成动画或音频的暂停,开发者可以在用户难以察觉的时候,使用这个方法鼓励垃圾回收。
  • 安全随机数生成 (移动和桌面)。Adobe AIR中一直有Math.random方法可用,返回“伪随机”的数字,也就是说,这似乎是随机的,但总是包含一些非随机性(比如时间戳)的数字。AIR 3提供了一个用于生成随机数的新方法,称为generateRandomBytes(),位于flash.crypto包。由于generateRandomBytes()函数使用操作系统API来产生随机数(在Windows上是CryptGenRandom ,在OSX上是/dev/random , 在Android上是/dev/urandom, 在iOS上则是SecRandomCopyBytes),由此产生的随机数更有效,更安全。
  • 三次贝塞尔曲线 (所有平台) 。新的cubicCurveTo()方法是Graphics类的功能,允许您以编程方式绘制三次贝塞尔曲线,而且不使用第三方ActionScript代码。

Adobe AIR 3作为一个候选发布版可以在Adobe实验室中找到 。

控制设备何时休眠,在你的AIR手机游戏中使用KEEP_AWAKE

如果你正在开发AIR手机游戏,你可能需要确保在用户玩游戏过程中,设备不会睡眠。对于一些游戏,这个不是问题,因为用户始终在触摸屏幕,它不会睡眠。但是,对于我开发的一些游戏,它们的主要输入模式是加速度,所以没有办法保证用户始终触摸屏幕而不使屏幕变暗及至睡眠。
即使你的游戏需要用户触摸,这仍然是个好主意,即:使设备避免睡眠。因为有可能你的游戏中有些平静的活动,而且有些用户设置的屏幕保护时间很短。

使设备保持清醒很容易。首先你需要启用以下两个-app.xml文件的权限:
<uses-permission android:name=”android.permission.WAKE_LOCK”/>
<uses-permission android:name=”android.permission.DISABLE_KEYGUARD”/>

然后,在任何你想要设备保持清醒的时候,使用下面这条简单的代码:
NativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.KEEP_AWAKE;
使设备重新睡眠:
NativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.NORMAL;

在我的游戏中,当用户开始一个游戏或者进入另外一级时,我会设置SystemIdelMode.KEEP_AWAKE. 当一级完成时,或者这个游戏被暂停,我会将它设回SystemIdelMode.NORMAL. 因此,当游戏运行时,设备仍然会睡眠,除非用户真正在玩游戏。如果他们查看分数或干其他分心的事情时,设备会进入睡眠状态,重而保存了他们的电池。

如何使用Adobe AIR更新框架

Using the Update Framework for Adobe AIR

如何使用Adobe AIR更新框架

One feature that I was more useful in Adobe AIR, was the addition of an API designed to make better automatic update of my application. This can be very important because not all users have the time (or desire) to return the application site to download the latest version.

在Adobe AIR中有一个我觉得非常有用的特征,这个特性被设计用于自动更新你的程序,以使你的程序更加完善.这是非常重要的一点,因为不是所有用户都会回到网站去下载最新版本.

This is already routine for operating systems and software that we use in day-to-day as the Mozilla Firefox and Google Chrome or TweetDeck.

这个功能对于每天更新的操作系统和软件如Mozilla Firefox 和Google Chrome 或TweetDeck是很常见的.

From Adobe AIR 1.5, we have the class ApplicationUpdater andApplicationUpdaterUI which aims to define the basic functionality to update the applications made with Adobe AIR

Manage updates and can be tricky, AIR update framework has the API’s necessary for you to do this in a practical and functional. The developer can, for example:

Adobe AIR 1.5开始,我们有ApplicationUpdater 和ApplicationUpdaterUI ,这些类定义了用于更新Adobe AIR 制作的应用程序的基础方法.管理更新应该是非常棘手的,AIR 更新框架包含了实用功能的API.开发者可以使用这些,如下面例子:

  • Periodically checking for updates based on an interval or at the request of the user 根据某一时间间隔或用户要求,定期检查更新
  • Downloading AIR files (updates) from a web source 从网站服务器上下载要更新的AIR 文件
  • Alerting the user on the first run of the newly installed version 在首次运行的时候提醒用户使用最新版本
  • Confirming that the user wants to check for updates 确认用户想要检查的更新
  • Displaying information on the new update version to the user 在给用户更新的版本中显示信息
  • Displaying download progress and error information to the user 显示下载进度以及错误信息给用户

The information is derived from XML files where you say that the latest version of software, new version of the news etc. Let’s take a practical example, if you use Flash Builder should already have the files applicationupdater.swc and applicationupdater_ui.swc as a reference in the library.

信息从xml文件中获得,xml文件里面说明了软件的最新版本,以及新版本的新闻等等.让我们做一个实用的例子,如果你使用Flash Builder 可能已经获得了applicationupdater.swc 和applicationupdater_ui.swc 两个文件在库中.
We started by calling xml updateConfig.xml, that “say” to your application where are the files to update.

我们开始查看叫updateConfig.xml 文件,它告诉你的应用更新文件在那里.

PLAIN TEXT

XML:

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <configuration xmlns=”http://ns.adobe.com/air/framework/update/configuration/1.0&#8243;>
  3.      <url>http://localhost:81/leonardofranca/air/updates/testeUpdate/updateDescriptor.xml</url>
  4.     <delay>1</delay>
  5. </configuration>

It must be saved in the same directory of your application, along with other xml and swf files. Now in Flex, instantiate the class ApplicationUpdateUI and setting the configuration xml file so that Flex can know where is the update.

这个文件必须存在你应用程序的同一目录下,并且同其他xml及swf文件放置一起.当前在Flex中, 实例类 ApplicationUpdateUI 以及设定配置xml文件,这样Flex将会知道更新文件在哪里.

PLAIN TEXT

ACTIONSCRIPT3:

  1. var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI();
  2. appUpdater.configurationFile = new File(“app:/updateConfig.xml”);
  3. appUpdater.initialize();
  4. //via ActionScript
  5. //appUpdater.updateURL = ” http://example.com/updates/update.xml&#8221;;
  6. //appUpdater.delay = 1;

The file updateDescriptor.xml is where you set the version in the update of your application and where you can add a description of the news update.

updateDescriptor.xml 文件用于你设定在你更新的应用中的版本,以及添加一个更新的描述.

PLAIN TEXT

XML:

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2.      <update xmlns=”http://ns.adobe.com/air/framework/update/description/2.5&#8243;>
  3.        <versionNumber>0.0.2</versionNumber>
  4.        <url>http://localhost:81/leonardofranca/air/updates/testeUpdate/testeUpdate_0.0.2.air</url>
  5.        <description><![CDATA[
  6. This version has fixes for the following knowns issues:
  7. *First issue
  8. *Second issue
  9.  ]]></description>
  10.     </update>

Basically that’s it, we will only implement the call to open the application, it checks if there is update.

基本上就是这样,我们将会只执行调用来打开应用,它会检查是否有更新.

PLAIN TEXT

MXML:

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <s:WindowedApplication xmlns:fx=”http://ns.adobe.com/mxml/2009&#8243;
  3.                        xmlns:s=”library://ns.adobe.com/flex/spark”
  4.                        xmlns:mx=”library://ns.adobe.com/flex/mx” creationComplete=”windowedapplication1_creationCompleteHandler(event)”>
  5.     <fx:Script>
  6.         <![CDATA[
  7.             import air.update.ApplicationUpdaterUI;
  8.             import air.update.events.UpdateEvent;
  9.             import mx.events.FlexEvent;
  10.             private var appUpdater:ApplicationUpdaterUI;
  11.             protected function windowedapplication1_creationCompleteHandler(event:FlexEvent):void
  12.             {
  13.                 appUpdater = new ApplicationUpdaterUI();
  14.                 appUpdater.configurationFile = new File(“app:/updateConfig.xml”);
  15.                 appUpdater.addEventListener(ErrorEvent.ERROR, onError);
  16.                 appUpdater.addEventListener(UpdateEvent.INITIALIZED, handlerInit);
  17.                 appUpdater.initialize();
  18.                 //via ActionScript
  19.                 //appUpdater.updateURL = ” http://example.com/updates/update.xml&#8221;;
  20.                 //appUpdater.delay = 1;
  21.             }
  22.             protected function onError(event:ErrorEvent):void
  23.             {
  24.                 trace(event.text);
  25.             }
  26.             protected function handlerInit(event:UpdateEvent):void
  27.             {
  28.                 appUpdater.checkNow();
  29.             }
  30.         ]]>
  31.     </fx:Script>
  32.     <fx:Declarations>
  33.         <!– Place non-visual elements (e.g., services, value objects) here –>
  34.     </fx:Declarations>
  35. </s:WindowedApplication>

I created a second version of my test application for demonstration, we have the following result:

我创建了一个my test 应用第二版,用于示范,我们将会见到下面的结果:

Check for update

If you want to see if there are any updates of the application, just click on “check for upadates. The updated file is downloaded and installed.

如果你想看看是否有任何可以更新的应用程序,只需要点击”检查更新”.更新文件将会被下载和安装.

 

References:

http://help.adobe.com/en_US/air/build/WS9CD40F06-4DD7-4230-B56A-88AA27541A1E.html
http://www.adobe.com/devnet/air/flex/quickstart/articles/update_framework.html

 

AIR 3.0 配置文件,全面兼容手机平台

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<application xmlns="http://ns.adobe.com/air/application/3.0">

<!-- Adobe AIR Application Descriptor File Template.

	Specifies parameters for identifying, installing, and launching AIR applications.

	xmlns - The Adobe AIR namespace: http://ns.adobe.com/air/application/3.0
			The last segment of the namespace specifies the version 
			of the AIR runtime required for this application to run.
			
	minimumPatchLevel - The minimum patch level of the AIR runtime required to run 
			the application. Optional.
-->

	<!-- A universally unique application identifier. Must be unique across all AIR applications.
	Using a reverse DNS-style name as the id is recommended. (Eg. com.example.ExampleApplication.) Required. -->
	<id>test</id>

	<!-- Used as the filename for the application. Required. -->
	<filename>test</filename>

	<!-- The name that is displayed in the AIR application installer. 
	May have multiple values for each language. See samples or xsd schema file. Optional. -->
	<name>test</name>
	
	<!-- A string value of the format <0-999>.<0-999>.<0-999> that represents application version which can be used to check for application upgrade. 
	Values can also be 1-part or 2-part. It is not necessary to have a 3-part value.
	An updated version of application must have a versionNumber value higher than the previous version. Required for namespace >= 2.5 . -->
	<versionNumber>1.0.0</versionNumber>
		         
	<!-- A string value (such as "v1", "2.5", or "Alpha 1") that represents the version of the application, as it should be shown to users. Optional. -->
	<!-- <versionLabel></versionLabel> -->

	<!-- Description, displayed in the AIR application installer.
	May have multiple values for each language. See samples or xsd schema file. Optional. -->
	<!-- <description></description> -->

	<!-- Copyright information. Optional -->
	<!-- <copyright></copyright> -->

	<!-- Publisher ID. Used if you're updating an application created prior to 1.5.3 -->
	<!-- <publisherID></publisherID> -->

	<!-- Settings for the application's initial window. Required. -->
	<initialWindow>
		<!-- The main SWF or HTML file of the application. Required. -->
		<!-- Note: In Flash Builder, the SWF reference is set automatically. -->
		<content>[This value will be overwritten by Flash Builder in the output app.xml]</content>
		
		<!-- The title of the main window. Optional. -->
		<!-- <title></title> -->

		<!-- The type of system chrome to use (either "standard" or "none"). Optional. Default standard. -->
		<!-- <systemChrome></systemChrome> -->

		<!-- Whether the window is transparent. Only applicable when systemChrome is none. Optional. Default false. -->
		<!-- <transparent></transparent> -->

		<!-- Whether the window is initially visible. Optional. Default false. -->
		<!-- <visible></visible> -->

		<!-- Whether the user can minimize the window. Optional. Default true. -->
		<!-- <minimizable></minimizable> -->

		<!-- Whether the user can maximize the window. Optional. Default true. -->
		<!-- <maximizable></maximizable> -->

		<!-- Whether the user can resize the window. Optional. Default true. -->
		<!-- <resizable></resizable> -->

		<!-- The window's initial width in pixels. Optional. -->
		<!-- <width></width> -->

		<!-- The window's initial height in pixels. Optional. -->
		<!-- <height></height> -->

		<!-- The window's initial x position. Optional. -->
		<!-- <x></x> -->

		<!-- The window's initial y position. Optional. -->
		<!-- <y></y> -->

		<!-- The window's minimum size, specified as a width/height pair in pixels, such as "400 200". Optional. -->
		<!-- <minSize></minSize> -->

		<!-- The window's initial maximum size, specified as a width/height pair in pixels, such as "1600 1200". Optional. -->
		<!-- <maxSize></maxSize> -->

        <!-- The initial aspect ratio of the app when launched (either "portrait" or "landscape"). Optional. Mobile only. Default is the natural orientation of the device -->

        <!-- <aspectRatio></aspectRatio> -->

        <!-- Whether the app will begin auto-orienting on launch. Optional. Mobile only. Default false -->

        <!-- <autoOrients></autoOrients> -->

        <!-- Whether the app launches in full screen. Optional. Mobile only. Default false -->

        <!-- <fullScreen></fullScreen> -->

        <!-- The render mode for the app (either auto, cpu, or gpu). Optional. Mobile only. Default auto -->

        <!-- <renderMode></renderMode> -->

		<!-- Whether or not to pan when a soft keyboard is raised or lowered (either "pan" or "none").  Optional.  Defaults "pan." -->
		<!-- <softKeyboardBehavior></softKeyboardBehavior> -->
	</initialWindow>

	<!-- We recommend omitting the supportedProfiles element, -->
	<!-- which in turn permits your application to be deployed to all -->
	<!-- devices supported by AIR. If you wish to restrict deployment -->
	<!-- (i.e., to only mobile devices) then add this element and list -->
	<!-- only the profiles which your application does support. -->
	<!-- <supportedProfiles>desktop extendedDesktop mobileDevice extendedMobileDevice</supportedProfiles> -->

	<!-- The subpath of the standard default installation location to use. Optional. -->
	<!-- <installFolder></installFolder> -->

	<!-- The subpath of the Programs menu to use. (Ignored on operating systems without a Programs menu.) Optional. -->
	<!-- <programMenuFolder></programMenuFolder> -->

	<!-- The icon the system uses for the application. For at least one resolution,
	specify the path to a PNG file included in the AIR package. Optional. -->
	<!-- <icon>
		<image16x16></image16x16>
		<image32x32></image32x32>
		<image36x36></image36x36>
		<image48x48></image48x48>
		<image57x57></image57x57>
		<image72x72></image72x72>
		<image114x114></image114x114>
		<image128x128></image128x128>
	</icon> -->

	<!-- Whether the application handles the update when a user double-clicks an update version
	of the AIR file (true), or the default AIR application installer handles the update (false).
	Optional. Default false. -->
	<!-- <customUpdateUI></customUpdateUI> -->
	
	<!-- Whether the application can be launched when the user clicks a link in a web browser.
	Optional. Default false. -->
	<!-- <allowBrowserInvocation></allowBrowserInvocation> -->

	<!-- Listing of file types for which the application can register. Optional. -->
	<!-- <fileTypes> -->

		<!-- Defines one file type. Optional. -->
		<!-- <fileType> -->

			<!-- The name that the system displays for the registered file type. Required. -->
			<!-- <name></name> -->

			<!-- The extension to register. Required. -->
			<!-- <extension></extension> -->
			
			<!-- The description of the file type. Optional. -->
			<!-- <description></description> -->
			
			<!-- The MIME content type. -->
			<!-- <contentType></contentType> -->
			
			<!-- The icon to display for the file type. Optional. -->
			<!-- <icon>
				<image16x16></image16x16>
				<image32x32></image32x32>
				<image48x48></image48x48>
				<image128x128></image128x128>
			</icon> -->
			
		<!-- </fileType> -->
	<!-- </fileTypes> -->

    <!-- iOS specific capabilities -->
	<!-- <iPhone> -->
		<!-- A list of plist key/value pairs to be added to the application Info.plist -->
		<!-- <InfoAdditions>
            <![CDATA[
                <key>UIDeviceFamily</key>
                <array>
                    <string>1</string>
                    <string>2</string>
                </array>
                <key>UIStatusBarStyle</key>
                <string>UIStatusBarStyleBlackOpaque</string>
                <key>UIRequiresPersistentWiFi</key>
                <string>YES</string>
            ]]>
        </InfoAdditions> -->
	<!-- Display Resolution for the app (either "standard" or "high"). Optional. Default "standard" -->
	<!-- <requestedDisplayResolution></requestedDisplayResolution> -->
	<!-- </iPhone> -->

	<!-- Specify Android specific tags that get passed to AndroidManifest.xml file. -->
	<!--<android> 
		<manifestAdditions>
		<![CDATA[
			<manifest android:installLocation="auto">
				<uses-permission android:name="android.permission.INTERNET"/>
				<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
				<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
				<uses-feature android:required="true" android:name="android.hardware.touchscreen.multitouch"/>
				<application android:enabled="true">
					<activity android:excludeFromRecents="false">
						<intent-filter>
							<action android:name="android.intent.action.MAIN"/>
							<category android:name="android.intent.category.LAUNCHER"/>
						</intent-filter>
					</activity>
				</application>
			</manifest>
		]]>
		</manifestAdditions> 
	</android> -->
	<!-- End of the schema for adding the android specific tags in AndroidManifest.xml file -->

</application>

在AIR桌面应用程序中创建AIR3运行时(貌似是我等的)

在本周初,AIR 3 SDK的beta2版本发布了。AIR 3 SDK和AIR运行时的发布是相当重要的,它给我们带来了许许多多酷炫的功能。其中一个功能是我非常感兴趣的,那就是Captive Runtime,它允许你通过一个捆绑的运行时封装你的应用程序。ISO平台从一开始就拥有这个功能,到了今天,它已经可以支持Android设备和台式机。

我认为它对于AIR来说是一个非常重要的功能。我从我们的社区和用户那里听到过很多次这样的建议:我们需要找到一个解决方案来使得用户可以在没有管理员权限的情况下安装AIR应用程序。这样的情况是比较普遍的,尤其在企业这样的环境中,用户没有完全的权限。此外,在另外一些情况下,它可以改善用户体验,因为用户无须再安装一个额外的运行时。
当你需要把你的应用程序发布到CD或者一些不允许你使用基于浏览器的badge安装器的媒介上时,它也能给你提供帮助。

那么我们怎样才能在Windows和Mac上封装你的应用程序呢?其实很简单。你需要做的第一件事就是从Adobe Labs上下载和解压缩最新的SDK。然后通过命令行mxmlc编译器或者Flash Builder编译你的应用程序。下面我们以Flash Builder为例来讲解操作过程:右击你的AIR应用程序项目,选择Export(导出)  Flash Builder  Release Build(发行版),这样,我们的第一步操作就完成了。它会在你的项目目录下创建一个bin-release-temp文件夹,里面有一个被编译了的swf和应用程序描述符文件。现在,来到你的命令行下,从你的项目/bin-release-temp文件夹下调用以下ADT命令:

在Windows下:
c:\path\to\air3sdk\bin\adt.bat -package -storetype pkcs12 -keystore c:\path\to\certificate.p12 -target bundle myapp.exe myapp-app.xml -C . myapp.swf

在Mac下:
/path/to/air3sdk/bin/adt -package -storetype pkcs12 -keystore /path/to/certificate.p12 -target bundle myapp.app myapp-app.xml -C . myapp.swf

根据不同的平台你会得到略有不同的结果。在Mac上,你的应用程序被封装在myapp.app中,它是单个Mac包文件。你可以通过双击它来运行你的应用程序。当然如果你想要查看其中的内容,你可以右击它,并选择Show Package Contents(显示包内容)选项。在windows上,你会得到一个myapp.exe文件夹,里面包含了所有的运行时文件,可执行myapp.exe文件也在里面。
现在,你就可以使用你最喜欢的安装程序构建器为你的应用程序创建一个安装程序包。
在windows下生成的文件夹结构:

在Mac下生成的包结构: