2015-05-07 27 views
6

Ho il seguente problema: Su Android la mia app basata su Qt (Qt 5.4.1 per dispositivi mobili) chiama un'attività esterna avviando un esplicito intento. Funziona molto bene nel caso in cui nessun dato sia collegato all'intento. Ma quando uso putExtra per collegare una stringa, ecc., L'attività di destinazione non trova questi dati.Chiamare attività esterna per intento (esplicito) dall'app Qt su Android - putExtra non funziona

frammento di app Qt:

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

frammento di destinazione applicazione Java, che cerca di ottenere i dati in allegato:

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 

     ... 
    } 
} 

frammento di AndroidManifest.xml (destinazione Java app):

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

Ho provato un po 'a farlo funzionare ma non è riuscito. Cosa sto facendo di sbagliato? Potrebbe mancare il permesso o la bandiera?

Per favore aiuto. Molte grazie.

risposta

-1

È necessario creare classe classe Picker: QAndroidActivityResultReceiver pubblico con funzione di handleActivityResult void (int receiverRequestCode, int resultCode, const QAndroidJniObject dati &) e iniziare intenti con const int REQUEST_CODE = 42; QtAndroid :: startActivity (intent, REQUEST_CODE, picker);

Quindi, è possibile utilizzare il mio campione su github repo

https://github.com/tripolskypetr/qmlchooseimage

0

può essere Sono molto tardi rispondere a questa domanda, ma il pensiero può essere utile per qualcuno che è alla ricerca di stessa funzionalità. Questo codice funziona perfettamente per me, sono in grado di ricevere dati tramite 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>()); 
     } 
    } 
} 

Ho fatto alcuni cambiamenti nel vostro codice utilizzando questa utile QT Android Blog