Как добавить расширение Air Native на сцену

Мне нужно отобразить действие, написанное на Java, с помощью Android SDK в моем приложении Flex Mobile. Я видел, как это делается с помощью Map ANE, но не могу найти ни одного примера кода или чего-то подобного. Я уже создал код Java и ActionScript, необходимый для работы моего ANE (активность создана, и все классы, события и методы, необходимые для действительного соединения Java и AS3, есть), я просто не могу понять, как добавить его на сцену. Я знаю, что его нельзя добавить в DisplayList, и меня устраивает, что он является сценическим объектом.

Если это вообще помогает, я пытаюсь отобразить видео с помощью MediaPlayer (из-за проблем с потоковой передачей MP4, когда это делается с использованием AS3/Flex).

Для Майкла (27 августа 2012 г., 9:44 по московскому времени):

08-27 09:27:07.836: I/CS VideoInit(2567): context is set
08-27 09:27:07.836: I/CS VideoInit(2567): intent is instantiated 
08-27 09:27:07.836: I/ActivityManager(349): START {cmp=air.AndroidANETesting2/xi.video.android.extension.VideoActivity u=0} from pid 2567

Самая первая строка моей деятельности

Log.i("CS VideoActivity","Made it inside the activity somehow");

Вот посмотрите на мою Java. Это функция инициализации:

VideoInit.context = context;
Log.i("CS VideoInit","context is set");
Intent intent = new Intent( context.getActivity(), VideoActivity.class );
Log.i("CS VideoInit","intent is instantiated");
context.getActivity().startActivity( intent );
Log.i("CS VideoInit","Activity is started");
context.dispatchStatusEventAsync("PLAY", "PLAY");

А вот моя VideoActivity onCreate():

super.onCreate(savedInstanceState);
Log.i("CS VideoActivity","Made it inside the activity somehow");

И мой манифест на всякий случай (только раздел приложения):

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".VideoActivity"
        android:label="@string/title_activity_video" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Обновление (27 августа 2012 г., 10:52 по московскому времени) После дальнейшего изучения (или проб и ошибок, как бы вы это ни называли) я решил добавить строку startActivity() в команду try{} catch(Throwable e), чтобы увидеть, какие ошибки он выдавал. Интересно, что он бросил это.

08-27 10:49:41.406: I/CS VideoInit(7786): Unable to find explicit activity class {air.AndroidANETesting2.debug/xi.video.android.extension.VideoActivity}; have you declared this activity in your AndroidManifest.xml?

Похоже, мне нужно перепроверить файл манифеста Android.


person Josh    schedule 22.08.2012    source источник
comment
Не зная подробностей об ANE; Я не уверен, что на это можно ответить. Как правило, ANE — это просто особый тип библиотечного файла. Таким образом, вы бы не добавили ANE на сцену; а скорее класс внутри ANE. Я не понимаю, чем добавление чего-либо на сцену отличается от добавления чего-либо в DisplayList.   -  person JeffryHouser    schedule 22.08.2012
comment
Добавление чего-либо на сцену означает, что оно парит над всем остальным. Добавление чего-либо в список отображения — это, как правило, то, как вы добавляете вещи. Подумайте, как вы используете stageWebView. Вы устанавливаете его сцену и окно просмотра. Окно просмотра располагается относительно рабочей области, а не относительно родителя, как обычный компонент Flex. Кроме того, над этим элементом сцены ничего не может отображаться, поэтому вам нужно по-другому позиционировать и работать с объектом, который обычно отображается поверх этого объекта (например, меню настроек для проигрывателя).   -  person Josh    schedule 22.08.2012
comment
И на это есть ответ, как это было сделано раньше, и несколько евангелистов платформы Adobe заявили, что вы можете отображать активность Android (или ее аналог iOS) с помощью собственного расширения. Вот видео как это делается. flashmobileblog.com/2011/09 /15/   -  person Josh    schedule 22.08.2012
comment
Если вы уже создали ANE; как вы, кажется, заявляете в своем посте; Я не понимаю, как мы можем предоставить вам подробную информацию о том, как его использовать. Возможно, вам нужно переработать свой пост? Для получения информации о сцене; прочтите: help.adobe.com/en_US /FlashPlatform/reference/actionscript/3/ и help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/ и help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/ .   -  person JeffryHouser    schedule 22.08.2012
comment
Как я понимаю; Stage, по сути, находится в верхней части DisplayList. Я никогда не слышал, чтобы кто-то пытался использовать его, по сути, для создания второго списка отображения (помимо встроенных вещей, таких как StageVideo, Stage3D и StageWebView). но в теории это звучит возможно. Несмотря на некоторые образцы, ANE не были созданы для функций визуального отображения, и большинство рекомендаций, которые я видел, заключались в том, чтобы не использовать ANE для целей визуального отображения.   -  person JeffryHouser    schedule 22.08.2012


Ответы (1)


Это на самом деле довольно легко.

Вам нужно создать класс в ANE, который реализует android.app.Activity, а затем из FREFunction просто используйте функцию startActivity базового экземпляра Activity из FREContext.

Итак, в функции давайте начнем действие с намерением:

public class ExampleFunction implements FREFunction 
{
    @Override
    public FREObject call( FREContext context, FREObject[] passedArgs ) 
    {
        Intent intent = new Intent( context.getActivity(), ExampleActivity.class );
        context.getActivity().startActivity( intent );
    }
}

Затем в фактической реализации Activity:

public class ExampleActivity extends Activity 
{
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        // Do your stuff here, like create views, buttons etc
    }
}

Это действие будет отображаться поверх вашего приложения. Вы можете использовать статическую ссылку на ваш FREContext для передачи событий/данных обратно в ваше приложение, если хотите.

Вам также необходимо добавить активность в ваш -app.xml внутри тега приложения манифеста:

<application> <activity android:name="package.ExampleActivity"></activity></application>
person Michael    schedule 23.08.2012
comment
Это отлично. Я проверю это завтра утром и вернусь к вам по этому поводу, но это определенно похоже на то, что мне нужно. Спасибо! - person Josh; 23.08.2012
comment
Хорошо, мне удалось успешно подключить ANE к моей AS3... вроде. Я запускаю ваш скрипт в своей функции инициализации, и скрипт останавливается на этой строке, и я не могу понять, почему. Если я прокомментирую это, мои возвращаемые данные и отправка событий, которые происходят после этой строки, будут работать нормально. Есть идеи? context.getActivity().startActivity(намерение); это линия - person Josh; 24.08.2012
comment
Под init вы имеете в виду инициализатор расширения или пользовательскую функцию FREFunction, которую вы вызываете init? Вы не должны вызывать приведенный выше код в инициализаторе расширения. - person Michael; 25.08.2012
comment
Извините, это функция FREFunction, которую я вызываю init и вызываю сразу после установки контекста расширения в моем AS3. Я должен был быть более ясным об этом. - person Josh; 25.08.2012
comment
Можете ли вы получить какую-либо информацию из журналов? Запустите в терминале следующее: [flexlib]/lib/android/bin/adb logcat - person Michael; 25.08.2012
comment
Это не входит в деятельность. Я отредактирую ОП с логом. - person Josh; 27.08.2012
comment
Хорошо, код готов. Похоже, он вообще не попадает в onCreate, хотя диспетчер действий, похоже, запускает действие. Размещение строки журнала (до или после строки super.onCreate()) не имеет значения (и я не думал, что это будет, но это того стоило) - person Josh; 27.08.2012
comment
Я просто запустил его как отладку Java (в отличие от отладки Flash), и он отлично справляется с этой активностью. - person Josh; 27.08.2012
comment
Попробуйте добавить активность в дескриптор вашего приложения, добавьте дополнения: ‹application› ‹activity android:name=package.ExampleActivity›‹/activity› ‹/application› - person Michael; 28.08.2012
comment
Мне удалось выяснить это самостоятельно около полутора часов назад. Сейчас работаю над тем, чтобы SurfaceHolder работал. Чтобы было ясно, вам нужно добавить активность в дескриптор приложения FLEX, а НЕ в манифест Android. Я потратил 4+ часа, чтобы понять это. В любом случае, большое спасибо за вашу помощь. У меня почти получилось. - person Josh; 28.08.2012
comment
Да, как раз собирался это сказать, это распространенная ошибка, извините, нужно было указать на это в ответе. - person Michael; 28.08.2012