RecognizerIntent: как добавить пакет в ожидающее намерение - PullRequest
10 голосов
/ 24 июня 2011

Я выполняю действие, которое отвечает на RecognizerIntent . Среди прочего, это действие должно обрабатывать два входящих дополнения, которые указывают ожидаемое намерение и его пакет дополнений:

  • EXTRA_RESULTS_PENDINGINTENT
  • EXTRA_RESULTS_PENDINGINTENT_BUNDLE

Перефразируя документацию:

  • Если вы используете EXTRA_RESULTS_PENDINGINTENT для предоставления PendingIntent, результаты будут добавлены в его комплект, а PendingIntent будет отправлен его цели.

  • Если вы используете EXTRA_RESULTS_PENDINGINTENT для предоставления цели переадресации, вы также можете использовать EXTRA_RESULTS_PENDINGINTENT_BUNDLE для предоставления дополнительных дополнений для окончательного намерения. Результаты поиска будут добавлены в этот пакет, а комбинированный пакет будет отправлен на целевое устройство.

Я тщетно искал пример кода, который продемонстрировал бы следующее.

Каков наилучший способ извлечения PendingIntent из пачки?

Должен ли я сделать:

(PendingIntent)
        extras.getParcelable(RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT)

Как добавить дополнения к набору существующих дополнений из PendingIntent?

Как запустить модифицированный PendingIntent?

Ответы [ 3 ]

4 голосов
/ 01 июля 2011

Вы не можете напрямую касаться содержимого PendingIntent по соображениям безопасности. Однако когда вы отправляете PendingIntent, у вас есть возможность дополнять или изменять его содержимое в зависимости от того, что позволяет исходный создатель.

Это метод, который вы хотите использовать для отправки 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)

Предоставляемое здесь намерение - это данные, используемые для изменения окончательного намерения, отправленного из PendingIntent.

Правила того, что можно изменить, приведены здесь:

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

Обратите внимание, что по умолчанию при создании PendingIntent отправителем могут быть только те детали, которые могут быть изменены. Создатель может передавать флаги, чтобы разрешить изменение других частей, хотя это обычно нежелательно.

1 голос
/ 01 июля 2011

Это мои текущие ответы на эти вопросы. Это работает так в ряде приложений Google (Карты, Документы, YouTube, Прослушивание), которые все передают PendingIntent в RecognizerIntent, когда вы выполняете поиск с помощью кнопки микрофона. Хотя я не уверен, что это лучший (или самый общий) способ сделать это. Любые комментарии приветствуются.

Как лучше всего извлечь PendingIntent из пачки?

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

Как добавить дополнения к набору существующих дополнений в PendingIntent?

Здесь мы просто создаем новое намерение и помещаем в него все необходимые дополнения.

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

Как запустить модифицированный PendingIntent?

Мы отправляем PendingIntent, сообщая ему новое намерение (с новыми дополнениями) в качестве аргумента.

try {           
    mExtraResultsPendingIntent.send(this, 1234, intent);
} catch (CanceledException e) {
    // Handle exception
}
1 голос
/ 27 июня 2011

Возможно, я смогу вам немного помочь с вашим вторым вопросом, поскольку я сделал нечто подобное в своем собственном приложении.

Добавление дополнений к цели должно быть так же просто, как вызов putExtra ()намерение.Я сделал это для уведомления.

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

Это часть уведомления, которое запускает мое приложение.Позже я прочитаю дополнительное, когда моя деятельность возобновится.

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

Надеюсь, это поможет некоторым.

...