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
?
3 ответа
Это мои текущие ответы на эти вопросы. Это работает так в ряде приложений 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
}
Вы не можете напрямую касаться содержимого PendingIntent по соображениям безопасности. Однако когда вы отправляете PendingIntent, у вас есть возможность дополнять или изменять его содержимое в зависимости от того, что позволяет оригинальный создатель.
Это метод, который вы хотите использовать для отправки PendingIntent:
Предоставляемое вами намерение - это данные, используемые для изменения окончательного намерения, отправленного из PendingIntent.
Правила для того, что может быть изменено здесь:
http://developer.android.com/reference/android/content/Intent.html
Обратите внимание, что по умолчанию при создании 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
}
}
Надеюсь, это поможет некоторым.