如何使用QtAndroid :: startActivity

时间:2014-09-29 06:45:29

标签: android qt

新的Qt Android extra有一个新功能。 QtAndroid :: startActivity

我不知道如何在C ++代码中设置fisrt参数。有人可以举个例子吗?非常感谢你。

1 个答案:

答案 0 :(得分:0)

您必须构建一个包含Android“ Intent”对象的JNI对象。在Java中创建一个Intent对象相当容易,但是我不知道如何从C ++实现。

因此,我的解决方案是将一个.java文件添加到我的Qt项目中,并在Java中创建一个辅助函数,该函数将为我生成并返回一个Android Intent对象:

package com.k9spud.FileBrowser;

import java.io.File;
import android.net.Uri;
import android.content.Intent;

public class AndroidAction
{
    public static Intent openFile(String filePath, String fileType)
    {
        File f = new File(filePath);
        Uri uri = Uri.fromFile(f);
        Intent intent = new Intent();
        intent.setAction(android.content.Intent.ACTION_VIEW);
        intent.setDataAndType(uri, fileType);
        return intent;
    }
}

(您可以在https://developer.android.com/guide/components/intents-filters上了解有关Android Intent的更多信息)

现在我有了Java辅助函数,可以从C ++代码发出JNI调用以使用辅助函数。 Java代码将生成所需的Intent对象,我终于可以使用QtAndroid :: startActivity()。

这是我用来在外部Android应用中打开(查看)文件的C ++函数:

void openFile(QString filePath, QString fileType)
{
    QAndroidJniObject jfilePath = 
    QAndroidJniObject::fromString(filePath);
    QAndroidJniObject jfileType = 
    QAndroidJniObject::fromString(fileType);
    QAndroidJniObject intent = QAndroidJniObject::callStaticObjectMethod("com/k9spud/FileBrowser/AndroidAction",
                                                                     "openFile",
                                                                     "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;",
                                                                     jfilePath.object<jstring>(),
                                                                     jfileType.object<jstring>());

    QtAndroid::startActivity(intent, 0);
}

例如,要显示视频文件,我调用C ++ openFile()函数,将完整路径传递到所需文件,并传递MIME类型,该类型向Android指示应显示哪些应用程序作为查看此文件的可能方法:

openFile("/storage/emulated/legacy/Movies/myvideo.mp4", "video/mp4");