Перейти к содержанию
Fire Monkey от А до Я
  • 0

Delphi XE8 автозагрузка приложения в Android


Вопрос

Пытаюсь сделать автозагрузку приложения в андроид, но не выходит каменная чаша.

Приложение пустое. Даю права на "Receive boot completed", в манифесте делаю следующие изменения (выделил комментариями с "*******"):

<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="%package%"
        android:versionCode="%versionCode%"
        android:versionName="%versionName%"
        android:installLocation="%installLocation%">

    <!-- This is the platform API where NativeActivity was introduced. -->
    <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
<%uses-permission%>
    <uses-feature android:glEsVersion="0x00020000" android:required="True"/>
    <application android:persistent="%persistent%" 
        android:restoreAnyVersion="%restoreAnyVersion%" 
        android:label="%label%" 
        android:debuggable="%debuggable%" 
        android:largeHeap="%largeHeap%"
        android:icon="%icon%"
        android:theme="%theme%"
        android:hardwareAccelerated="%hardwareAccelerated%">

<%application-meta-data%>
        <!-- Our activity is a subclass of the built-in NativeActivity framework class.
             This will take care of integrating with our NDK code. -->
        <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                android:label="%activityLabel%"
                android:configChanges="orientation|keyboard|keyboardHidden"
                android:launchMode="singleTask">
            <!-- Tell NativeActivity the name of our .so -->
            <meta-data android:name="android.app.lib_name"
                android:value="%libNameValue%" />
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter> 
        </activity>
        <%activity%>
        <receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" />
<!-- *********************************************************************** -->
        <receiver android:name=".BootReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
           <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
          </intent-filter>
        </receiver>
<!-- *********************************************************************** -->
        <%receivers%>
    </application>
</manifest>
<!-- END_INCLUDE(manifest) -->

При включении телефона получаю ошибку "В приложении Таком-то произошла ошибка". До TForm.onCreate точно не доходит.

Что я делаю не так? Помогите пожалуйста.

Изменено пользователем Евгений Корепов
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Администраторы

Haword прав. 

Обратите ваше внимание на строчку в манифесте:

<receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" />

Это аналогичный вашему ресивер. name указывает, что ресивер FMXNotificationAlarm находится в пакетах: "com.embarcadero.firemonkey.notifications". 

Ссылка на комментарий
  • 0
  • Модераторы

Да-да. Пишите java-класс с событием onReceive, в котором пишем код, запускающий приложение. В манифесте подписываемся на сообщения системы, указывая имя java-класса .

 

Работает так:

1) Система запустилась и послала всем подписанным приложениям сообщение об окончании запуска

2) Ваше приложение, а точнее класс который вы написали, с событием onReceive, получает сообщение и запускает ваше приложение

Ссылка на комментарий
  • 0

Да-да. Пишите java-класс с событием onReceive, в котором пишем код, запускающий приложение. В манифесте подписываемся на сообщения системы, указывая имя java-класса .

 

Работает так:

1) Система запустилась и послала всем подписанным приложениям сообщение об окончании запуска

2) Ваше приложение, а точнее класс который вы написали, с событием onReceive, получает сообщение и запускает ваше приложение

Т.е. средствами Delphi это не сделать? Только отдельный класс на java и морока с модификацией classes.dex? Я надеялся что мне поможет компонент турецкого коллеги http://brsatalay.blogspot.com.tr/2014/10/delphi-android-broadcast-receiver.html . По крайней мере с другими броадкастами он отлично справляется.

А почему тогда получаю ошибку "В приложении Таком-то произошла ошибка"? Или это просто симптом отсутствия обработчика BOOT_COMPLETED?

Ссылка на комментарий
  • 0
  • Модераторы
Я, другого способа не знаю, может уже и есть, но мне на глаза не попадался, поэтому написал способ, который точно должен сработать.
 
Про компонент: Ресейвер можно прописывать через манифест, а можно регистрировать во время работы приложения. Отличия в том:
  • что через манифест ресейвер статичен, т.е. он всегда будет существовать и принимать сообщения, даже когда приложение закрыто
  • а регистрация во время работы приложения, позволяет создать временный ресейвер, который будет работать, только если приложение уже запущено
По поводу ошибки, точно не подскажу, возможно, это из-за того, что в манифесте указан не существующий java-класс.
 
 
p.s. В XE7-XE8 задача склеивания с файлом classes.dex значительно упрощена.
 
Полезные статьи:
Как создавать обёртки для JAVA-кода (ручной способ, ещё до появления утилиты)
Ссылка на комментарий
  • 0

Да-да. Пишите java-класс с событием onReceive, в котором пишем код, запускающий приложение. В манифесте подписываемся на сообщения системы, указывая имя java-класса ....

Добрый день!

А как правильно запустить свое Delphi-приложение из java-класса ресивера?

Ссылка на комментарий
  • 0

жаль что нет реализации без java, вроде обычная задача и в тоже время очень важная на мой взгляд

в Delphi 10 не появилось иной реализации?

Изменено пользователем fsdb
Ссылка на комментарий
  • 0

fsdb, вот в этой статьей довольно подробно описано как этой сделать... писать на java ничего особенного не придется.

 

 

 

ToAll: Видел на stackoverflow писали что можно не заменять classes.dex, а создать новый dex и прикрепить его к проекту. Что изменить в bat-файле чтобы это сделать?

Ссылка на комментарий
  • 0
В 18.01.2016 в 10:59, Rusland сказал:

fsdb, вот в этой статьей довольно подробно описано как этой сделать... писать на java ничего особенного не придется.

 

 

 

ToAll: Видел на stackoverflow писали что можно не заменять classes.dex, а создать новый dex и прикрепить его к проекту. Что изменить в bat-файле чтобы это сделать?

Коллега можете скинуть ссылку на stackoverflow с этой статьей?

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...