Форум программистов, компьютерный форум, киберфорум
QML
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/43: Рейтинг темы: голосов - 43, средняя оценка - 4.86
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
1

Создание Android Service (background application) на Qt (QML)

19.02.2015, 07:41. Показов 8048. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, друзья. Помогите разобраться с проблемой. Есть рабочее приложение для андройда написанное на Qt с использованием Qml. Нужно сделать так, чтобы приложение работало в фоне (как я понял, в андройде это называется service) и посылало уведомления.
Пример NotificationClient из папки examples/androidextras легко натянулся на приложение и работает. Но уведомления приходят только когда приложение запущено и свернуто.
В инете порыскал и нашел очень хорошую наработку на гитхабе: https://github.com/think-free/qt-android-helper
Она вполне рабочая, компилится и запускается, но в качестве Activity для приложения там используется XML файл. Я решил подправить это дело и сделать точно так же, как это сделано в примере androidextras - просто унаследовать класс от QtActivity; поэтому внёс изменения в примере с гитхаба в файле
Код
./myQtApplication/android/src/org/qtproject/qt5/android/addons/qtserviceapp/QtServiceActivity.java
теперь он у меня имеет простой вид:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package org.qtproject.qt5.android.addons.qtserviceapp;
 
import ru.wxmaper.ttmobile.R;
 
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.os.Bundle;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.widget.CompoundButton;
import android.widget.Switch;
 
public class QtServiceActivity extends org.qtproject.qt5.android.bindings.QtActivity {
    private Class m_class = QtService.class;
 
    /* Activity class */
    public void setActivityClass(Class cl){
        m_class = cl;
    }
}
приложение компилится, но при запуске на устройстве предлагает установить Ministro, хотя в настройках сборки у меня стоит параметр "Внедрять библиотеки Qt в APK". Я не понимаю почему это происходит. Если QtServiceActivity наследуется от Activity, то Ministro не требуется (может и требуется, но приложение во всяком случае его находит и запускается). Если исправить файл AndroidManifest.xml на стандартный от Qt - то приложение тоже запускается, но, естественно, без возможности работать в фоне. Помогите разобраться с этими траблами.

AndroidManifest.xml оригинального рабочего приложения:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0"?>
<manifest package="ru.wxmaper.ttmobile" 
          xmlns:android="http://schemas.android.com/apk/res/android" 
          android:versionName="0.6" 
          android:versionCode="13" 
          android:installLocation="auto">
  <application android:hardwareAccelerated="true"
                  android:name="org.qtproject.qt5.android.bindings.QtApplication"
                  android:label="@string/app_name"
                  android:icon="@drawable/icon">
        <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation"
                    android:name="ru.wxmaper.ttmobile.NotificationClient"
                    android:label="@string/app_name"
                    android:screenOrientation="unspecified"
                    android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <meta-data android:name="android.app.lib_name" android:value="ttmobile"/>
            <meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
            <meta-data android:name="android.app.repository" android:value="default"/>
            <meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
            <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
            <meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
            <meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
            <meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
            <meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
            <meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
            <meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/>
            <meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
            <meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
            <meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
            <meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
            <meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="17"/>
    <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>



AndroidManifest.xml исправленный как в примере с гитхаба (после сборки требуется установить ministro):
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?xml version="1.0"?>
<manifest package="ru.wxmaper.ttmobile" 
          xmlns:android="http://schemas.android.com/apk/res/android" 
          android:versionName="0.6" 
          android:versionCode="13" 
          android:installLocation="auto">
  <application android:hardwareAccelerated="true"
                  android:name="org.qtproject.qt5.android.bindings.QtApplication"
                  android:label="@string/app_name"
                  android:icon="@drawable/icon">
    <service android:name="ru.wxmaper.ttmobile.TTMobileService">
      <meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
      <!--<meta-data android:name="android.app.use_local_qt_libs" android:value="1"/>-->
      <meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
      <!--<meta-data android:name="android.app.bundle_local_qt_libs" android:value="1"/>-->
      <!--<meta-data android:name="android.app.load_local_jars" android:value="jar/QtAndroid.jar:jar/QtAndroidAccessibility.jar:jar/QtAndroid-bundled.jar:jar/QtAndroidAccessibility-bundled.jar"/>-->
      <!--<meta-data android:name="android.app.static_init_classes" android:value=""/>-->
      <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
      <meta-data android:name="android.app.lib_name" android:value="@string/app_name"/>
      <meta-data android:name="android.app.fatal_error_msg" android:value="@string/fatal_error_msg"/>
      <meta-data android:name="android.app.notificon" android:resource="@drawable/notificon"/>
      <meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
      <meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
      <meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
      <meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
      <meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
      <meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
      <meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
      <meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
      <meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/>
      <meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
      <meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
    </service>
    <activity android:name="ru.wxmaper.ttmobile.TTMobileActivity" 
              android:process=":TTMobileService"
              android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation"
              android:label="@string/app_name"
              android:screenOrientation="unspecified">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
      <meta-data android:name="android.app.lib_name" android:value="@string/app_name"/>
    </activity>
    <receiver android:name="ru.wxmaper.ttmobile.TTMobileBroadcastReceiver">
        <meta-data android:name="android.app.lib_name" android:value="@string/app_name"/>
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>
  </application>
  
  <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="17"/>
  <supports-screens android:anyDensity="true" android:smallScreens="true" android:largeScreens="true" android:normalScreens="true"/>
  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>


Добавлено через 3 минуты
Да, забыл еще, класс QtActivity не имеет метода setActivityClass(class), подозреваю что это тоже надо будет как исправлять на что-то другое в файле QtServiceActivity.java
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2015, 07:41
Ответы с готовыми решениями:

Using QML in application
Как осуществляется связь между моделью QSqlTableModel и таблицей TableView? Как я понимаю, при...

Background Intelligent Transfer Service
Подскажите как включить Background Intelligent Transfer Service пожалуйста!!! Включаю не...

Console Application background color
Здравствуйте. Хотелось бы выяснить, как задать цвет фона для всей консоли, т.к....

Ошибка: Caused by Android java.lang.ClassCastException: android.app.Application cannot be cast
Здравствуйте. Очень нужен ваш совет. При запуске приложения появляется ошибка: Caused by:...

2
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
21.02.2015, 22:19  [ТС] 2
Такс, почитал ридми и разобрался =) нужно было просто скопировать папку android из примера, запустить setup.sh и выбрать тип приложения - сервис или активити
1
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 2
22.06.2015, 12:35 3
Я в qt новичок. Можете если не сложно мне на пальцах объяснить, как сделать чтобы приложение работало в виде сервиса, так сложно понять, у меня есть приложение на qml, в main запускается основная форма на qml
m_engine = new QQmlApplicationEngine;
m_engine->load(QUrl(QStringLiteral("qrc:/main.qml")));
Как сделать, чтобы был и интерфейс на qml и чтобы приложение работало в фоновом режиме, из интерфейса можно было останавливать сервис и запускать? Пока разбираюсь с найденной Вами наработкой на гитхабе, но пока непонятно
0
22.06.2015, 12:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2015, 12:35
Помогаю со студенческими работами здесь

[android] Нет пункта Android Service
Всем привет! Пробую создать сервис для андроида на delphi XE7. В хелпе сказано добавить так: File...

Интересный факт о Application и Service :remote
Значит берём создаём тестовый примерчик: Активити Сервис Биндимся из активити к сервису и...

Обработка сервиса и запуска [Service Application]
Доброго дня юзеры, собственно, взял из инета такой кусок кода, для управления сервисом приложения....

Можно ли в одно service application добавить несколько сервисов?
доброго времени суток, у меня есть служба написанная для проверки доступности сервера в случае...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru