В сети ведется активное обсуждение, того что компания Adobe прекратила разработку Flash-плеера для мобильных устройств, в связи с этим хочу поделиться с вами, как используя технологию Adobe AIR написать HelloWorld, который запустится на Android смартфоне/планшете за 5 минут.
Создадим проект Flex Mobile Project


Выбираем мобильные платформы и основной класс приложения:

О различиях контейнеров, рекомендую почитать самим. В нашем случае я остановился на View-Based Application, он даст достаточно функциональности для написания без излишеств.
Во вкладке Permissions , в случае с Android (iOS будет каждый раз запрашивать или предложит сохранить настройку) выбираем необходимый набор функций для доступа к телефону.

Можно не выбирать ни чего.
Для начала создадим еще несколько компонентов:
videoView, audioView, pictureView
Так-же скопируем несколько файлов для теста:
/assets/1.flv, /assets/1.mp3, /assets/1.png
После нам необходимо добавить сертификат:
Заходим в настройки проекта Properties->Flex Build Packing->Google Andriod

Для того, чтобы создать его нажмем Create…

Этот сертификат позволит нам вести debug, но не выкладывать приложение в Andriod.Market (для этого можно искать информацию в другой статье)
У нас есть два варианта запустить приложение Properties->Run/Debug Settings->New->Mobile Application:

Additions :
Процесс :
Для написания нам потребуется :
- Flash Builder 4.5 (4.5.1 для iOS систем)
- Поверхностное знание ActionScript 3.0 и FLEX
- Телефон/планшет с Andoid
Для проверки возможностей AIR на мобильных платформах, нас интересуют следующие функции приложения :
- Проигрывание FLV видео
- Воспроизведение MP3 файла
- Отображение нескольких картинок
Разработка
Создадим проект Flex Mobile Project


Выбираем мобильные платформы и основной класс приложения:

- Blank spark.Application (базовой контейнер без доп.элементов)
- View-Based Application spark.ViewNavigatorApplication (расширенный контейнер без доп.элементов)
- Tabbed Application spark.TabbedViewNavigatorApplication (расширенный контейнер с табами)
О различиях контейнеров, рекомендую почитать самим. В нашем случае я остановился на View-Based Application, он даст достаточно функциональности для написания без излишеств.
Во вкладке Permissions , в случае с Android (iOS будет каждый раз запрашивать или предложит сохранить настройку) выбираем необходимый набор функций для доступа к телефону.

Приступим к написанию кода :
Для начала создадим еще несколько компонентов:
videoView, audioView, pictureView
Так-же скопируем несколько файлов для теста:
/assets/1.flv, /assets/1.mp3, /assets/1.png
Сам код :
mobileHelloWorldHomeView.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" title="Hello World">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:Button id="videoButton" label="Video" click="navigator.pushView(videoView)" x="{(this.width - videoButton.width) / 2}" y="{videoButton.height}"/>
<s:Button id="soundButton" label="Sound" click="navigator.pushView(soundView)" x="{(this.width - soundButton.width) / 2}" y="{videoButton.y + videoButton.height + 2}"/>
<s:Button id="pictureButton" label="Picture" click="navigator.pushView(pictureView)" x="{(this.width - pictureButton.width) / 2}" y="{soundButton.y + soundButton.height + 2}"/>
<s:Button id="exitButton" label="Exit" click="NativeApplication.nativeApplication.exit()" x="{(this.width - exitButton.width) / 2}" y="{pictureButton.y + pictureButton.height + 2}"/>
</s:View>
videoView.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" title="Video"
creationComplete="playVideo(event)" >
<fx:Script>
<![CDATA[
import mx.core.UIComponent;
[Embed(source="/assets/1.flv",mimeType="application/octet-stream")]
private var VideoClass : Class;
private var netConnection:NetConnection;
private var netStream:NetStream;
import mx.events.FlexEvent;
private function playVideo(e:FlexEvent):void
{
netConnection = new NetConnection();
netConnection.connect(null);
netStream = new NetStream(netConnection);
netStream.client = {};
netStream.play(null);
var videoObject:Video = new Video(videoCt.width , videoCt.height);
videoObject.attachNetStream(netStream);
var ui:UIComponent = new UIComponent();
ui.addChild(videoObject);
ui.width = videoObject.width;
ui.height = videoObject.height;
videoCt.addElement(ui);
var videoBytes:ByteArray = new VideoClass() as ByteArray;
netStream.appendBytes(videoBytes);
}
private function stopVideo(e:Event = null):void
{
netStream.close();
netConnection.close();
videoCt.removeAllElements();
navigator.pushView(mobileHelloWorldHomeView);
}
]]>
</fx:Script>
<s:Group id="videoCt" x="{(this.width - videoCt.width) / 2}" y="{backButton.height}"/>
<s:Button id="backButton" label="Back" click="stopVideo(event)" x="{(this.width - backButton.width)/2}"/>
</s:View>
soundView.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" title="Sound"
creationComplete="playAudio(event)" >
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
[Embed(source="/assets/1.mp3")]
private var AudioClass : Class;
private var soundChannel:SoundChannel;
private function playAudio(e:FlexEvent):void
{
var sound:Sound = new AudioClass() as Sound;
soundChannel = sound.play();
}
private function stopAudio(e:Event = null):void
{
soundChannel.stop();
navigator.pushView(mobileHelloWorldHomeView);
}
]]>
</fx:Script>
<s:Button id="backButton" label="Back" click="stopAudio(event)" x="{(this.width - backButton.width)/2}"/>
</s:View>
pictureView.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" title="Picture">
<s:Image id="picture" x="{(this.width - picture.width) / 2}" y="{backButton.height}" source="@Embed(source='/assets/1.png')" />
<s:Button id="backButton" label="Back" click="navigator.pushView(mobileHelloWorldHomeView)" x="{(this.width - backButton.width)/2}"/>
</s:View>
После нам необходимо добавить сертификат:
Заходим в настройки проекта Properties->Flex Build Packing->Google Andriod

Для того, чтобы создать его нажмем Create…

Этот сертификат позволит нам вести debug, но не выкладывать приложение в Andriod.Market (для этого можно искать информацию в другой статье)
Запуск :
У нас есть два варианта запустить приложение Properties->Run/Debug Settings->New->Mobile Application:

- На эмуляторе Launch Method: On desktop
- На устройстве Launch Method: On device (для этого подключите устройство и включите в настройках usb-debugging)
Additions :
- На большинстве Android устройствах вам потребуется установить Adobe AIR для запуска
- Для создания приложения для iOS устройств, вам потребуется оплаченный аккаунт Apple Developer(99$/year) и несколько более сложных операций по созданию сертификата.