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)

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

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

3 10

3 ответа:

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

Это метод, который вы хотите использовать для отправки PendingIntent:

Http://developer.android.com/reference/android/app/PendingIntent.html#send(android.content.Context, int, android.содержание.Намерение, андроид.апп.PendingIntent.OnFinished, андроид.ос.Обработчик)

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

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

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

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

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

Добавление дополнительных элементов к намерению должно быть так же просто, как вызов 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
   }
}

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

Вот мои текущие ответы на эти вопросы. Это работает так в ряде приложений Google (Maps, Docs, YouTube, Listen), которые все передают 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);

Как добавить дополнительные функции к набору существующих дополнительных функций a 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
}