1

我的目标是在 Andoird(Neccesitas sdk)下用 Qt 编写的应用程序中按下按钮时启动已经安装在我的 Android 设备上的 apk。在 Windows 下的 Qt 中,这只需使用 QProcess 即可完成,例如:

m_processP = new QProcess;
m_processP->start ( "somthing.exe" );
.....

但在 Android 上,它似乎不像那样工作。我也在尝试使用 QProcess...start("Settings.apk") 但我总是收到错误:ProcessError::FailedToStart。有人遇到过和我一样的问题吗?谢谢

4

2 回答 2

2

呃,在这里和 Qt 论坛上搜索了大量资源,最终从许多来源中找到了一个运行应用程序的解决方案:

C++代码:

Q_INVOKABLE void start(const QString &packageName)
{
    QAndroidJniObject javaPackageName = QAndroidJniObject::fromString(packageName);
    bool success = (bool)QAndroidJniObject::callStaticMethod<jboolean>(
                "com/mycompany/myapp/PackageActivity",
                "runApplication",
                "(Ljava/lang/String;)Z",
                javaPackageName.object<jstring>());

    if(!success) {
        qDebug() << "Error:" << packageName << "package not found!";
    }
}

Java代码:

package com.mycompany.myapp;

import android.content.pm.PackageManager;
import android.content.Intent;
import android.content.Context;
import android.app.Activity;

public class PackageActivity
{
    public static boolean runApplication(String packageName)
    {
        Activity activity = org.qtproject.qt5.android.QtNative.activity();
        PackageManager pm = activity.getApplicationContext().getPackageManager();
        Intent intent = pm.getLaunchIntentForPackage(packageName);
        if (intent != null) {
            activity.startActivity(intent);
            return true;
        } else {
            return false;
        }
    }
}

主要问题是

  • 得到工作Activity对象
  • 然后调用getPackageManager()适当的对象,因为方法返回以下错误给我调用任意创建的对象AcivityContext对象:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.PackageManager android.content.Context.getPackageManager()' on a null object reference

于 2020-08-08T21:37:46.613 回答
1

在 Android 上,事情并不是那么简单。您必须知道Activity要运行的包和名称(在 Android 上,“应用程序”由活动组成,您只能显示它们,而不是“运行”)。您必须通过 JNI 调用(从 C++ 到 Java)来执行此操作,并尝试从那里启动所需 Activity 的实例。这有点复杂。

在此处阅读有关从其他应用程序启动入口活动的更多信息,并在此处阅读有关 JNI 调用的信息

于 2013-10-17T15:03:02.583 回答