2011-06-24 9 views
10

Wdrażam działanie, które odpowiada na RecognizerIntent. Między innymi ta działalność musi obsłużyć dwa nadchodzące dodatki, które określają oczekującego zamiar i jego extras-pakiet:RecognizerIntent: dodawanie pakietu do oczekujących zamiarów

  • EXTRA_RESULTS_PENDINGINTENT
  • EXTRA_RESULTS_PENDINGINTENT_BUNDLE

Parafrazując dokumentację:

  • Jeśli użyjesz EXTRA_RESULTS_PENDINGINTENT do dostarczenia PendingIntent, resu Do pakietu zostaną dodane lts, ​​a PendingIntent zostanie wysłany do celu.

  • Jeśli użyjesz EXTRA_RESULTS_PENDINGINTENT do dostarczenia intencji przesyłania, możesz również użyć EXTRA_RESULTS_PENDINGINTENT_BUNDLE, aby dostarczyć dodatkowe dodatki do ostatecznego celu. Wyniki wyszukiwania zostaną dodane do tego pakietu, a połączony pakiet zostanie wysłany do celu.

Na próżno szukałem kodu przykładowego, który przedstawiałby poniższe.

Jaki jest najlepszy sposób wydobycia PendingIntent z pakietu?

powinienem zrobić:

(PendingIntent) 
     extras.getParcelable(RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT) 

Jak dodać dodatki do zestawu istniejących dodatków o PendingIntent?

Jak uruchomić zmodyfikowany PendingIntent?

+0

Proszę sprawdzić poniżej link to źródło searchDialog.java możesz dogłębnie przestudiować to i możesz być jasne odpowiedź. http://www.devdaily.com/java/jwarehouse/android/core/java/android/app/SearchDialog.java.shtml – Nikhil

Odpowiedz

1

Oto moje aktualne odpowiedzi na te pytania. Działa to tak w wielu aplikacjach Google (Maps, Dokumenty, YouTube, Listen), które wszystkie przekazują PendingIntent do RecognizerIntent podczas wyszukiwania za pomocą przycisku mikrofonu. Nie jestem pewien, czy jest to najlepszy (lub najbardziej ogólny) sposób na zrobienie tego. Wszelkie komentarze są mile widziane.

Jaki jest najlepszy sposób wydobycia PendingIntent z pakietu?

Parcelable extraResultsPendingIntentAsParceable = 
      bundle.getParcelable(RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT); 
if (extraResultsPendingIntentAsParceable != null) { 
    if (extraResultsPendingIntentAsParceable instanceof PendingIntent) { 
     mExtraResultsPendingIntent = 
         (PendingIntent) extraResultsPendingIntentAsParceable; 
    } else { 
     // Report an error 
    } 
} 

mExtraResultsPendingIntentBundle = 
      bundle.getBundle(RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT_BUNDLE); 

Jak dodać dodatki do zestawu istniejących dodatków o PendingIntent?

Tutaj właśnie tworzymy nową intencję i umieszczamy w niej wszystkie wymagane dodatki.

if (mExtraResultsPendingIntentBundle == null) { 
    mExtraResultsPendingIntentBundle = new Bundle(); 
}    
Intent intent = new Intent(); 
intent.putExtras(mExtraResultsPendingIntentBundle); 
// Unsure about the following line... 
// Should I use another name for the extra data (instead of SearchManager.QUERY) 
intent.putExtra(SearchManager.QUERY, speechRecognitionResult); 

Jak uruchomić zmodyfikowany PendingIntent?

Wysyłamy PendingIntent, nadając nowy zamiar (z nowymi dodatkami) jako argument.

try {   
    mExtraResultsPendingIntent.send(this, 1234, intent); 
} catch (CanceledException e) { 
    // Handle exception 
} 
+0

Skąd pochodzi pakiet? –

+1

@IgorG. Nie jestem pewien, czy rozumiem ... Wszystkie dane wejściowe do powyższego kodu pochodzą z dodatków. – Kaarel

+0

Chciałem tylko upewnić się, że zmienna pakietu jest tym, co zakładałem ... –

1

Być może będę mógł udzielić ci trochę pomocy przy drugim pytaniu, ponieważ zrobiłem coś podobnego w mojej własnej aplikacji.

Dodawanie dodatków do intencji powinno być tak proste jak wywołanie metody putExtra() w celu. Zrobiłem to dla powiadomienia.

Intent notificationIntent = new Intent(_context, MyActivity.class); notificationIntent.putExtra("SOME_ID", "VALUE");

Jest to część zgłoszenia, które uruchamia moją aplikację. Później przeczytałem dodatkowe, gdy moja aktywność wznowi się.

Intent intent = getIntent(); 
Bundle extras = intent.getExtras(); 
if(extras !=null) 
{ 
    String value = extras.getString("SOME_ID"); 
    if(value != null && value.equals("VALUE")) 
    { 
     //Value was found, do something 
    } 
} 

Mam nadzieję, że to pomaga niektórym.

+2

Dzięki, ale PendingIntent to nie to samo co Intent. – Kaarel

4

Ze względów bezpieczeństwa nie można bezpośrednio dotknąć zawartości obiektu PendingIntent. Jednak, gdy wyślesz PendingIntent, masz możliwość uzupełnienia lub modyfikacji jego zawartości w zależności od tego, na co zezwala oryginalny twórca.

Jest to metoda chcesz użyć do wysłania PendingIntent:

http://developer.android.com/reference/android/app/PendingIntent.html#send(android.content.Context, int, android.content.Intent, android.app.PendingIntent.OnFinished, android.os.Handler)

zamiarem podać tutaj jest dane wykorzystane do modyfikacji ostateczną Intent wysłany z PendingIntent.

Zasady jakie mogą być modyfikowane są tutaj:

http://developer.android.com/reference/android/content/Intent.html#fillIn(android.content.Intent, int)

Należy pamiętać, że domyślnie, gdy PendingIntent jest tworzony, jedynymi elementami, które mogą być modyfikowane przez nadawcę są dodatki. Twórca może przekazywać flagi, aby umożliwić modyfikację innych części, chociaż generalnie nie jest to pożądane.

+0

Dzięki, tego właśnie szukałem. – Kaarel

+1

Nie ma za co. Powinienem trochę wyjaśnić - domyślne zasady wypełniania intencji są takie, że tylko dodatki mogą być modyfikowane, ale inne pola można ustawić, jeśli nie zawierają jeszcze danych. Na przykład domyślnie nie można zmienić akcji, jeśli jest już ustawiona. Twórca obiektu PendingIntent może użyć flag do stwierdzenia, że ​​nadawcy mogą modyfikować to pole ... ale oczywiście to otwiera je na poważne problemy z bezpieczeństwem, ponieważ oznacza to, że ktokolwiek poda PendingIntent, może zmodyfikować to, aby zrobić coś zupełnie innego. . – hackbod

+0

Jeśli używam PendingIntent.getBroadcast do uzyskania PI, jakie specjalne kroki muszę wymusić, aby zachować istniejące dodatki Intent, z którymi początkowo tworzył PI? Próbuję powyżej metody, ale dodatki zawsze kończą się wartością zerową. – Michael

Powiązane problemy