[ANDROID] Network request with the service that starts at boot time
-
Hello,
I implemented simple android service that starts at boot time based on https://www.kdab.com/qt-android-create-android-service-using-qt/Now, I have problem with network request - status code 0 - only with service that starts at boot time :(
Simple code of server:#include <QAndroidService> #include "rep_pingpong_source.h" #include <QObject> #include <QString> #include <QNetworkAccessManager> #include <QNetworkReply> #include <QNetworkRequest> QString statusCode = "-"; class PingPong : public PingPongSource { public slots: // PingPongSource interface void ping(const QString &msg) override { emit pong("Status code: " + statusCode); } }; int main(int argc, char *argv[]) { QAndroidService app(argc, argv); QRemoteObjectHost srcNode(QUrl(QStringLiteral("local:replica"))); PingPong pingPongServer; srcNode.enableRemoting(&pingPongServer); auto networkManager = new QNetworkAccessManager(); QObject::connect(networkManager, &QNetworkAccessManager::finished, [](QNetworkReply* reply){ statusCode = QString::number(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()); }); QByteArray rawDataToSend = "{}"; QByteArray postDataSize = QByteArray::number(rawDataToSend.size()); QNetworkRequest networkRequest(QUrl("http://example.com/")); // Header networkRequest.setRawHeader("User-Agent", "test"); networkRequest.setRawHeader("X-Custom-User-Agent", "test"); networkRequest.setRawHeader("Content-Type", "application/json"); networkRequest.setRawHeader("Content-Length", postDataSize); networkManager->post(networkRequest, rawDataToSend); return app.exec(); }
AndroidManifest.xml:
<?xml version="1.0"?> <manifest package="com.kdab.training" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto"> <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="-- %%INSERT_APP_NAME%% --"> <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="-- %%INSERT_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> <!-- Application arguments --> <!-- meta-data android:name="android.app.arguments" android:value="arg1 arg2 arg3"/ --> <!-- Application arguments --> <meta-data android:name="android.app.lib_name" android:value="client"/> <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"/> <!-- Deploy Qt libs as part of package --> <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"/> <!-- Run with local libs --> <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%% --"/> <!-- Messages maps --> <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"/> <!-- Messages maps --> <!-- Splash screen --> <!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ --> <!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ --> <!-- Splash screen --> <!-- Background running --> <!-- Warning: changing this value to true may cause unexpected crashes if the application still try to draw after "applicationStateChanged(Qt::ApplicationSuspended)" signal is sent! --> <meta-data android:name="android.app.background_running" android:value="false"/> <!-- Background running --> <!-- auto screen scale factor --> <meta-data android:name="android.app.auto_screen_scale_factor" android:value="false"/> <!-- auto screen scale factor --> <!-- extract android style --> <!-- available android:values : * full - useful QWidget & Quick Controls 1 apps * minimal - useful for Quick Controls 2 apps, it is much faster than "full" * none - useful for apps that don't use any of the above Qt modules --> <meta-data android:name="android.app.extract_android_style" android:value="full"/> <!-- extract android style --> </activity> <receiver android:name="com.kdab.training.MyActivity"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <service android:process=":qt" android:name="com.kdab.training.MyService"> <!-- android:process=":qt" is needed to force the service to run on a separate process than the Activity --> <!-- Application arguments --> <meta-data android:name="android.app.arguments" android:value="-service"/> <!-- Application arguments --> <!-- If you are using the same application (.so file) for activity and also for service, then you need to use *android.app.arguments* to pass some arguments to your service in order to know which one is which --> <!-- Ministro --> <meta-data android:name="android.app.lib_name" android:value="server"/> <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"/> <!-- Ministro --> <!-- Deploy Qt libs as part of package --> <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"/> <!-- Deploy Qt libs as part of package --> <!-- Run with local libs --> <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%% --"/> <!-- Run with local libs --> <!-- Messages maps --> <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"/> <!-- Messages maps --> <!-- Background running --> <meta-data android:name="android.app.background_running" android:value="true"/> <!-- Background running --> </service> </application> <uses-permission android:name="android.permission.SEND_SMS"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="16"/> <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/> <!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application. Remove the comment if you do not require these default permissions. --> <!-- %%INSERT_PERMISSIONS --> <!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application. Remove the comment if you do not require these default features. --> <!-- %%INSERT_FEATURES --> </manifest>
TEMPLATE = lib TARGET = server CONFIG += dll QT += core QT += remoteobjects QT += androidextras QT += network SOURCES += \ server.cpp REPC_SOURCE += pingpong.rep
Package of project to download:
https://1drv.ms/u/s!AufN-y--ppMkvD5NG3bf4HQlExqnp.s.
After install app You have to restart system (service starts only at boot time)!Qt: 5.11.2
Android 5.1 Lollipop
SDK:26.1.1
NDK: 16.1#edit
I also added
<uses-permission android:name="android.permission.INTERNET"/>
after: <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>and no changes.
-
@Montjet
you can use QNetworkConfigurationManager::isOnline() before submitting the request.
On Android true is returned either when you are connected to a WiFi or cellular network. -
@raven-worx said in [ANDROID] Network request with the service that starts at boot time:
QNetworkConfigurationManager::isOnline()
QNetworkConfigurationManager::isOnline() and it's signal returns false all the time.
-
@Montjet said in [ANDROID] Network request with the service that starts at boot time:
QNetworkConfigurationManager::isOnline() and it's signal returns false all the time.
it doesn't on my side.
Are you sure you are not missing the network permissions? -
@Montjet
what does logcat say? -
@Montjet
what was the issue?
Maybe it helps others in the future.