2015-05-07 15 views
6

Mam następujący problem: Na Androidzie moja aplikacja oparta na Qt (Qt 5.4.1 dla urządzeń mobilnych) wywołuje aktywność zewnętrzną poprzez uruchomienie jawnego zamiar. Działa to bardzo dobrze w przypadku, gdy żadne dane nie są dołączone do intencji. Ale kiedy używam putExtra do dołączenia ciągu znaków itp. Aktywność docelowa nie znajduje tych danych.Wywołanie aktywności zewnętrznej według (jawnego) zamiaru z aplikacji Qt na Androida - putExtra nie działa

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

fragment docelowej aplikacji Java, która próbuje uzyskać załączony dane:

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 

     ... 
    } 
} 

fragment AndroidManifest.xml (destination aplikacji 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> 

Próbowałem chwilę, aby go uruchomić, ale nie udało się. Co robię źle? Czy może brakować pozwolenia lub flagi?

Proszę o pomoc. Wielkie dzięki.

Odpowiedz

-1

Musisz utworzyć klasa klasy Picker: QAndroidActivityResultReceiver publicznego z funkcją void handleActivityResult (int receiverRequestCode, int ResultCode, const QAndroidJniObject & danych) i rozpocząć intencyjny z const int REQUEST_CODE = 42; QtAndroid :: startActivity (intent, REQUEST_CODE, picker);

Tak, można używać próbki na github repo

https://github.com/tripolskypetr/qmlchooseimage

0

Może jestem bardzo późno, aby odpowiedzieć na to pytanie, ale myśl może być pomocne dla kogoś, kto szuka samej funkcjonalności. Ten kod działa doskonale dla mnie, jestem w stanie odbierać dane za pomocą 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>()); 
     } 
    } 
} 

Zrobiłem kilka zmian w kodzie Stosując tę ​​pomocne QT Android Blog

Powiązane problemy