2015-05-07 14 views
6

Ich habe folgendes Problem: Auf Android ruft meine Qt-basierte App (Qt 5.4.1 für mobile) eine externe Aktivität durch einen expliziten starten Absicht. Dies funktioniert sehr gut, wenn keine Daten an die Absicht angehängt werden. Aber wenn ich putExtra zum Anhängen eines Strings usw. verwende, findet die Zielaktivität diese Daten nicht.Aufruf von externen Aktivitäten durch (explizite) Absicht von Qt App auf Android - putExtra funktioniert nicht

Ausschnitt aus dem 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>()); 
     } 
    } 
} 

Ausschnitt aus dem Java-Ziel-App, die die beigefügten Daten zu erhalten versucht:

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 

     ... 
    } 
} 

Snippet AndroidManifest.xml (Ziel Java-Anwendung):

<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> 

Ich habe eine Weile versucht, es zu laufen, aber es ist fehlgeschlagen. Was mache ich falsch? Könnte es Erlaubnis oder Flagge fehlen?

Bitte helfen. Danke vielmals.

Antwort

-1

Sie benötigen Klasse Klasse Picker erstellen: public QAndroidActivityResultReceiver mit Funktion Leere handleActivityResult (int receiverRequestCode, int Result, QAndroidJniObject const & Daten) und starten Absicht mit const int REQUEST_CODE = 42; QtAndroid :: startActivity (Absicht, REQUEST_CODE, Picker);

So können Sie meine Probe auf GitHub Repo

https://github.com/tripolskypetr/qmlchooseimage

0

Ich bin Vielleicht verwenden sehr spät diese Frage zu beantworten, aber Gedanken kann für jemanden nützlich sein, die für die gleiche Funktionalität sucht. Dieser Code funktioniert einwandfrei für mich, ich kann Daten mit Intent empfangen.

#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>()); 
     } 
    } 
} 

Ich habe einige Änderungen im Code Mit dieser Hilfreiche QT Android Blog

Verwandte Themen