RecognizerIntent: как добавить пакет к ожидающемуся намерению

Я реализую действие, которое реагирует на 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?

Ответ 1

Это мои текущие ответы на эти вопросы. Он работает именно так в ряде приложений 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
}

Ответ 2

Вы не можете напрямую коснуться содержимого 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 единственными частями, которые могут быть изменены отправителем, являются дополнительные функции. Создатель может передавать флаги, чтобы другие части могли быть изменены, хотя это обычно не требуется.

Ответ 3

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

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

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