我有以下问题: 在Android上,我的基于Qt的应用程序(Qt 5.4.1 for mobile)通过启动显式意图来调用外部活动。如果没有数据附加到intent,这非常有效。但是当我使用putExtra附加字符串等时,目标活动找不到这些数据。
Qt app的片段:
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目标应用程序的片段,它试图获取附加数据:
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片段(目标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>
我尝试了一段时间让它运行但它失败了。我做错了什么?它可能缺少许可或旗帜吗?
请帮忙。非常感谢。
答案 0 :(得分:0)
我可能很晚才回答这个问题,但是对于正在寻找相同功能的人来说,这可能会有所帮助。这段代码对我来说非常好,我能够使用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
答案 1 :(得分:-1)
您需要创建课程 class Picker:public QAndroidActivityResultReceiver 有功能 void handleActivityResult(int receiverRequestCode,int resultCode,const QAndroidJniObject&amp; data) 并开始意图 const int REQUEST_CODE = 42; QtAndroid :: startActivity(intent,REQUEST_CODE,picker);
所以,你可以在github repo上使用我的样本