21 September 2011
Adobe AIR has come a long way since version 1.0 was launched at the beginning of 2008. We've added dozens of major features, hundreds of minor features, performance improvements, and bug fixes, and we now support three additional platforms: iOS (iPhone and iPad), Android, and Adobe AIR for TV.
AIR 3 is our eleventh release in less than two and a half years. Although all of our major releases have represented big steps forward, I think this one is the most significant. AIR 3 includes the following new APIs and capabilities:
apk-captive-runtime flag to ADT when building your Android app or the bundle flag when building your desktop app. (Note that AIR has always used a captive runtime approach on iOS, although the mechanism is a bit different.)CameraRoll was technically already supported on the iPad, we've added much better support in AIR 3. On iPads, the photo picker doesn't take up the entire screen, as it does on iPhones and iPod touches. Instead, it appears as a floating panel positioned relative to the UI component that invoked it. With the addition of the CameraRollBrowseOptions class, developers can choose the size and position of the image picker, and specify the location of the UI component that invoked it. For more information and a code sample, see my blog post, How to correctly use the CameraRoll API on iPads.StageVideo; now AIR 3 brings StageVideo to mobile as well.StageVideo (hardware-accelerated video) and StageWebView (native HTML rendering). AIR 3 introduces the StageText API which allows developers to place native text fields in their mobile apps. Although you can still use Flash text fields, of course, StageText text fields come with all the OS-specific perks like the magnifying glass, text selection, auto-correct, and so on.Camera APIs now have access to both front and rear-facing cameras on iOS and Android devices (for Android devices, verion 2.3 or later is required). You can use the new Camera.position property along with the constants in the new CameraPosition class (BACK, FRONT, and UNKNOWN) to determine the location of the cameras. For more information and a code sample, see my blog post, Front-facing camera support in AIR 3.EncryptedLocalStore APIs that are available on the desktop are now available on iOS and Android. This API is critical for securely storing user credentials, encryption keys, salts, and similar important information.audioPlaybackMode property on SoundMixer, and the constants in the new AudioPlaybackMode class (MEDIA and VOICE), developers can control whether audio is played through the phone's earpiece or speakers.ProgressEvent.SOCKET_DATA), and to determine how many bytes are available for reading (Socket.bytesAvailable). However, the opposite hasn't been true. In other words, before AIR 3, there was no way to know that data had been successfully written from the ActionScript socket's write buffer to the network, and to know how many bytes were still waiting to be written. This led to situations where developers weren't sure if it was safe to call close() on a socket, or to know if there was a network operation still in progress when the user wanted to shut down an application. Starting with AIR 3, developers can use the OutputProgressEvent.OUTPUT_PROGRESS event along with the new Socket.bytesPending property to determine how much data has been written to the network, and how much data is still in the ActionScript socket waiting to be written. These new APIs should lead to more robust applications that rely on network access through sockets. For more information and a code sample, see my blog post, Socket improvements in AIR 3.Camera class in H.264.Capabilities.hasMultiChannelAudio property, the new AudioDecoder class (containing constants representing several different multichannel audio types), and changes to the Capabilities.serverString property all allow developers to detect a device's multichannel audio capabilities and to stream the correct audio bitstream both from ActionScript and through RTMP.GameInput APIs, developers can build games that respond to advanced TV controllers. A number of new APIs allow for enumerating devices (available controllers), enumerating devices' controls (buttons, triggers, acceleration, etc.), and for getting control values from devices.DisplayObjectContainer now has a removeChildren() function, which removes all the children in a single call. This certainly beats:while (this.numChildren > 0) this.removeChildAt(0)MovieClip is playing using the new isPlaying property.System.pauseForGCIfCollectionImminent function gives AIR developers more control over when the runtime's automatic garbage collection reclaims memory. Since animation or audio may pause during garbage collection, developers can use this function to encourage collection at times when the user is least likely to notice.Math.random function, which returns "pseudo-random" numbers—that is, numbers which appear to be random but always contain some element of non-randomness (a timestamp, for instance). AIR 3 provides a new method for generating random numbers called generateRandomBytes() located in the flash.crypto package. Since the generateRandomBytes() function uses OS APIs to generate random numbers (CryptGenRandom on Windows, /dev/random on OS X, /dev/urandom on Android, and SecRandomCopyBytes on iOS), the resulting random number is as cryptographically secure as the underlying OS.cubicCurveTo() function on the Graphics class allows you to programmatically draw cubic Bézier curves natively without the use of third-party ActionScript code.Be sure to grab the latest version of the AIR runtime and SDK and let us know what you think!
For more details on the changes in AIR 3, refer to the release notes.

This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License