Qt6 Java Android 服务无法启动

问题描述 投票:0回答:1

我正在使用 Qt 6.2 和 Java 制作一个移动应用程序,我想从移动客户端作为后台进程跟踪用户位置。不幸的是,android后台服务似乎根本没有启动?我怀疑我的问题来自 Java 或 AndroidManifest 文件,而不是 C++ Qt6 文件。

这是我的文件

android/src/org/qtporject/QtAndroidService.java

package org.qtproject;

import android.content.Context;
import android.content.Intent;
import android.util.Log;
import org.qtproject.qt.android.bindings.QtService;

public class QtAndroidService extends QtService {

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("TEST", "I got created!!");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("TEST", "I just got here");

        int ret = super.onStartCommand(intent, flags, startId);


        return ret;
    }

    public static void startQtAndroidService(Context context) {
        context.startService(new Intent(context, QtAndroidService.class));

        Log.d("TEST", "Android Service Start");
    }
}

android/AndroidManifest.xml

<?xml version="1.0"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.qtproject.test1"
    android:installLocation="auto"
    android:versionCode="1"
    android:versionName="1.0">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="true" />
    <application
        android:name="org.qtproject.qt.android.bindings.QtApplication"
        android:extractNativeLibs="true"
        android:hardwareAccelerated="true"
        android:label="test1"
        android:requestLegacyExternalStorage="true"
        android:allowNativeHeapPointerTagging="false">
        <activity
            android:name="org.qtproject.qt.android.bindings.QtActivity"
            android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density"
            android:label="test1"
            android:launchMode="singleTop"
            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="test1" />

            <meta-data
                android:name="android.app.arguments"
                android:value="" />

            <meta-data
                android:name="android.app.extract_android_style"
                android:value="minimal" />

        </activity>
        <service android:name=".QtAndroidService" android:enabled="true">
            <meta-data android:name="android.app.lib_name" android:value="service" />
            <meta-data android:name="android.app.background_running" android:value="true" />
        </service>
    </application>
</manifest>

从这里打印的唯一日志是“Android Service Start”。

onStartCommand 不会被调用,即使它应该在 startQtAndroidService 中启动服务后被调用。 onCreate 函数似乎也没有被调用,因为“我被创建了!!”不在调试控制台中打印出来。

这是调用 startQtAndroidService 函数的 main.cpp 文件(我再次认为问题不是 C++ Qt6 的问题)

#include <QApplication>
#include <QtCore/QJniObject>

int main(int argc, char *argv[])
{

    QCoreApplication app(argc, argv);

    if (QCoreApplication::arguments().count() > 1)
    {
        qDebug() << "I am the service";
    }
    else
    {
        qDebug() << "I am the application";
    }

    QJniObject::callStaticMethod<void>(
        "org/qtproject/QtAndroidService",
        "startQtAndroidService",
        "(Landroid/content/Context;)V",
        QNativeInterface::QAndroidApplication::context());

    return app.exec();
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(test1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

find_package(Qt6 COMPONENTS Widgets Core REQUIRED)
set(PROJECT_SOURCES
        main.cpp
)

if(ANDROID)
set(ANDROID_TARGET_SDK_VERSION 30)
    qt_add_executable(test1
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
        )

    target_link_libraries(test1 PRIVATE Qt6::Widgets Qt6::Core Qt6::CorePrivate)

    set_property(TARGET test1 APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
                 ${CMAKE_CURRENT_SOURCE_DIR}/android)

    qt_finalize_executable(test1)


endif()

我已经遵循了android 服务的官方 Qt6 文档,我想我没有错过任何东西。据我了解, main.cpp 应该调用 startQtAndroidService 然后 startQtAndroidService 来调用 onStartCommand 函数,之后我的 main.cpp 文件应该再次被调用(第一次是主线程,第二次是 android 服务),但是 onStartCommand 不会t 被调用,而我的 main.cpp 仅被调用一次并打印“我是应用程序”,没有“我是服务”日志。我还将 log 放在 if 之外的 main 的开头,但它只打印一次,所以我确信 main 函数只被调用一次。

有人可以帮我吗?我可能错过了什么?

java android c++ qt service
1个回答
0
投票

检查您是否在

QtAndroid::androidActivity()
中正确使用了
main.cpp


    QAndroidJniObject service = QAndroidJniObject::getStaticObjectField(
                "org/qtproject/QtAndroidService", "INSTANCE",
                "Lorg/qtproject/QtAndroidService;");
            if (service.isValid()) {
                QAndroidJniObject context = QtAndroid::androidActivity().object();
                service.callMethod<void>("startQtAndroidService", "(Landroid/content/Context;)V", context.object<jobject>());
            }

在您的

QtAndroidService.java
中,您有一个静态
INSTANCE
字段。

package org.qtproject;

import android.content.Context;
import android.content.Intent;
import android.util.Log;
import org.qtproject.qt.android.bindings.QtService;

public class QtAndroidService extends QtService {

    public static QtAndroidService INSTANCE;
    //rest of your code
© www.soinside.com 2019 - 2024. All rights reserved.