Приложение AIR for Android - служба не найдена - PullRequest
1 голос
/ 04 декабря 2011

Проблема: Служба, называемая PdService, «не найдена» во время выполнения, когда я отправляю Намерение связать его с Деятельностью.

[Редактировать: Решение]

Я не совсем ясен в вопросах, связанных с решением, однако решение найдено. Когда я экспортирую JAR моего основного проекта (который связан с проектом библиотеки Android), я выбираю опцию включения проекта библиотеки в JAR. Это решило проблему.

Теперь, это странно, потому что исходный код из связанного проекта явно превращал его в JAR еще до этого, он просто не "находился" во время выполнения Android. Но по какой-то причине явное включение всего связанного проекта устранило эту проблему. Это также неудачный обходной путь, потому что теперь мне нужно включить в JAR гораздо больше контента, чем я хочу, но пока проблема решена.

[Исходные сведения о проблеме]

подробности:

  • Приложение представляет собой приложение AIR for Android (.SWF + OTHER_STUFF -> .APK)
  • Java-код (включая PdService) был упакован в Собственное расширение AIR (.ane)
  • Намерение для PdService происходит в нашем пользовательском FREContext (см. Собственные расширения AIR), который мы назвали PdContext, в частности, в методе init ().
  • Для полноты я включил тег для PdService как в манифест Android для расширения, так и в файл application.xml приложения AIR.
  • Имя пакета расширения: com.nichemobile.pd.pdextension
  • Путь к классу PdService: org.puredata.android.service.PdService
  • Идентификатор приложения конечного пользователя (AIR ID): com.nichemobile.pdextension.testapp

Я пробовал несколько комбинаций Интентов, в том числе (это действие является ссылкой на выполняемое действие):

bindIntent.setClassName(thisActivity, "org.puredata.android.service.PDService");
bindIntent.setClassName(thisActivity, ".org.puredata.android.service.PDService");
bindIntent.setClassName(thisActivity, "..org.puredata.android.service.PDService");
bindIntent.setClassName("org.puredata.android.service", ".org.puredata.android.service.PDService");
bindIntent.setClassName("org.puredata.android.service", "org.puredata.android.service.PDService");
bindIntent.setClassName("", "org.puredata.android.service.PDService");
bindIntent.setClassName(".", "org.puredata.android.service.PDService");

Каждое намерение приводит к ошибке времени выполнения, утверждая, что служба "не найдена". У кого-нибудь есть идеи как это исправить?

Исходя из моего понимания Intents for Services, два параметра ДОЛЖНЫ быть: пакет: air.com.nichemobile.pdextension.testapp класс: org.puredata.android.service.PDService Но, конечно, это не сработало выше в самом первом примере.

Моя текущая теория:

После проверки файла classes.dex в скомпилированном APK я обнаружил, что в корне этого файла classes.dex есть 3 подкаталога:

  • air.com.nichemobile.pdextension.testapp (содержит активность AppEntry)
  • com (содержит наше расширение классов Java)
  • org.puredata (содержит все классы PD, включая PdService)

Мне интересно, не может ли приложение найти Службы, потому что они существуют за пределами каталога "air.com.nichemobile.pdextension.testapp" в файле classes.dex. Теперь приложение может выполнять код в классах в каталогах / com и /org.puredata, но мне интересно, не мешает ли каким-то образом процессу запуска службы на платформе Android эта структура классов в classes.dex файл.

В качестве несколько запутанного примера того, о чем я говорю выше - строка, перед которой я пытаюсь связать этот сервис, могу сказать:

Log.d(TAG, "PdService package: " + PdService.class.getPackage());
Log.d(TAG, "PdService class name: " + PdService.class.getName());

и я получаю вывод:

PdService package: package org.puredata.android.service
PdService class name: org.puredata.android.service.PdService

Любое разъяснение здесь будет оценено.

Спасибо.

Мэтт

Ответы [ 2 ]

1 голос
/ 01 февраля 2013

Проблема связана как с сертификатом подписи, так и с именем пакета приложения AIR.

Правила для собственных расширений Adobe AIR

Правило 1. Пакет сертификата подписи кода должен соответствовать идентификатору приложения в вашем app.xml так что если пакет сертификата com.my.company, то идентификатор приложения air должен быть <id>com.my.company</id>

Правило 2. При упаковке собственного расширения для Android с использованием ADT к имени вашего пакета добавляется префикс, который выглядит как air.com.my.company.

Когда Android ActivityManager пытается запустить ваш сервис, он ищет его в air.com.my.company. Таким образом, класс Service должен находиться в том же пакете (включая префикс «air») в вашем Java-коде. Класс Correct TestService определен как air.com.my.company.TestService

И со следующим манифестом, он работает просто отлично!

<application>
<activity android:name=".TestActivity">
    <intent-filter>
            <action android:name="TestActivity"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

<service android:enabled="true" android:exported="true" android:name=".TestService">
</service>
 </application>
0 голосов
/ 21 декабря 2011

Я не совсем ясен в вопросах, связанных с решением, однако решение найдено.Когда я экспортирую JAR моего основного проекта (который связан с проектом библиотеки Android), я выбираю опцию включения проекта библиотеки в JAR.Это устранило проблему.

Теперь, это странно, потому что исходный код из связанного проекта явно превращал его в JAR даже до этого, он просто не был «найден» во время выполнения Android.Но по какой-то причине явное включение всего связанного проекта устранило эту проблему.Это также неудачный обходной путь, потому что теперь мне нужно включить в JAR гораздо больше контента, чем я хочу, но пока проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...