从 Android 上的 Qt 应用程序通过(显式)意图调用外部活动 - putExtra 不起作用

Posted

技术标签:

【中文标题】从 Android 上的 Qt 应用程序通过(显式)意图调用外部活动 - putExtra 不起作用【英文标题】:Calling external activity by (explicit) intent from Qt app on Android - putExtra doesn't work 【发布时间】:2015-05-07 17:33:10 【问题描述】:

我有以下问题: 在 android 上,我基于 Qt 的应用程序(移动版 Qt 5.4.1)通过启动显式意图来调用外部活动。这在没有数据附加到意图的情况下非常有效。但是当我使用 putExtra 附加字符串等时,目标活动找不到此数据。

Qt 应用的 sn-p:

QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
if (activity.isValid())

    QAndroidJniObject intent("android/content/Intent", "()V");
    if (intent.isValid())
    
        QAndroidJniObject action = QAndroidJniObject::fromString("test.app.DO_SOMETHING");
        if (action.isValid())
        
            intent.callObjectMethod("setAction",
                                    "(Ljava/lang/String;)Landroid/content/Intent;",
                                    action.object<jobject>());

            QAndroidJniObject subject = QAndroidJniObject::fromString("test_subject");
            QAndroidJniObject text = QAndroidJniObject::fromString("test_text");
            jint flag = QAndroidJniObject::getStaticField<jint>("android/content/Intent",
                                                                "FLAG_GRANT_READ_URI_PERMISSION");

            intent.callObjectMethod("addFlags", "(I)V", flag);

            intent.callObjectMethod("putExtra",
                                    "(Ljava/lang/String;Ljava/lang/string;)Landroid/content/Intent;",
                                    subject.object<jstring>(),
                                    text.object<jstring>());

            if (intent.isValid())
                activity.callObjectMethod("startActivity", "(Landroid/content/Intent;)V", intent.object<jobject>());
        
    

Java 目标应用程序的 sn-p,它尝试获取附加数据:

public class Test_Activity extends Activity

    public void onCreate(Bundle savedInstanceState)
    
        super.onCreate(savedInstanceState);

        ...

        Intent intent = getIntent();

        String text = intent.getStringExtra("test_subject");//is null

        Bundle bundle = intent.getExtras();//is null

        ...
    

AndroidManifest.xml 的 sn-p(目标 Java 应用程序):

<intent-filter>
    <action android:name="test.app.DO_SOMETHING" />
    <category android:name="android.intent.category.LAUNCHER" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

我尝试了一段时间让它运行,但它失败了。我做错了什么?会不会缺少权限或标志?

请帮忙。非常感谢。

【问题讨论】:

【参考方案1】:

可能我回答这个问题很晚,但认为可能对正在寻找相同功能的人有所帮助。这段代码对我来说工作得很好,我可以使用 Intent 接收数据。

#include<QtAndroidExtras/QtAndroid>
#include<QtAndroidExtras/QAndroidJniObject>
#include<QtAndroidExtras/QAndroidIntent>
#include<QtAndroidExtras>

QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative",
                                                                       "activity",
                                                                       "()Landroid/app/Activity;");
if (activity.isValid())

    QAndroidJniObject intent("android/content/Intent", "()V");
    if (intent.isValid())
    
        QAndroidJniObject action = QAndroidJniObject::fromString("test.app.DO_SOMETHING");
        if (action.isValid())
        
            intent.callObjectMethod("setAction",
                                    "(Ljava/lang/String;)Landroid/content/Intent;",
                                    action.object<jobject>());
            QAndroidJniObject subject = QAndroidJniObject::fromString("url");
            QAndroidJniObject text = QAndroidJniObject::fromString("http://www.google.com");


            intent.callObjectMethod("putExtra",
                                    "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;",
                                    subject.object(),
                                    text.object());

            if (intent.isValid())
                activity.callMethod<void>("startActivity", "(Landroid/content/Intent;)V", intent.object<jobject>());
        
    

我对你的代码做了一些改动使用这个有用的QT Android Blog

【讨论】:

【参考方案2】:

你需要创建类 类选择器:公共 QAndroidActivityResultReceiver 带功能 void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data) 并开始意图 常量 int REQUEST_CODE = 42; QtAndroid::startActivity(intent, REQUEST_CODE, picker);

所以,你可以在 github repo 上使用我的示例

https://github.com/tripolskypetr/qmlchooseimage

【讨论】:

以上是关于从 Android 上的 Qt 应用程序通过(显式)意图调用外部活动 - putExtra 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SoundCloud Android 显式 Intent 共享不再起作用

蓝牙与 Android 上的 Qt。通过抽象类上的jni调用java类

使用显式意图的android进程间通信的安全性

通过意图而不是构造函数传递数据

在 QT 中显式调用paintGL

OpenSuse 13.2 上的 Qt for Android