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?


person Kaarel    schedule 24.06.2011    source источник
comment
Пожалуйста, проверьте ссылку ниже, это источник searchDialog.java, вы можете глубоко изучить его, и вы можете четко ответить на свой вопрос. devdaily.com/java/jwarehouse/ андроид/ядро/java/андроид/приложение/   -  person Nikhil    schedule 29.06.2011


Ответы (3)


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

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

http://developer.android.com/reference/android/app/PendingIntent.html#send%28android.content.Context,%20int,%20android.content.Intent,%20android.app.PendingIntent.OnFinished,%20android.os.Handler%29

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

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

http://developer.android.com/reference/android/content/Intent.html#fillIn%28android.content.Intent,%20int%29

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

person hackbod    schedule 01.07.2011
comment
Спасибо, это то, что я был после. - person Kaarel; 01.07.2011
comment
Пожалуйста. Я должен немного пояснить: правила по умолчанию для заполнения Intent заключаются в том, что можно изменить только дополнительные элементы, но можно установить другие поля, если они еще не содержат данных. Например, по умолчанию вы не сможете изменить действие, если оно уже задано. Создатель PendingIntent может использовать флаги, чтобы сказать, что отправителям разрешено изменять это поле... но, конечно, это открывает им серьезные проблемы с безопасностью, потому что это означает, что тот, кому они передают PendingIntent, может изменить его, чтобы сделать что-то совсем другое. . - person hackbod; 02.07.2011
comment
Если я использую PendingIntent.getBroadcast для получения PI, какие специальные шаги мне нужно сделать, чтобы заставить его сохранить существующие дополнения Intent, с которыми изначально был создан PI? Я пытаюсь использовать вышеуказанный метод, но дополнительные функции всегда заканчиваются нулевым значением. - person Michael; 28.04.2013

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

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

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

person Lysandus    schedule 27.06.2011
comment
Спасибо, но PendingIntent — это не совсем то же самое, что Intent. - person Kaarel; 28.06.2011

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

Как добавить дополнения к набору существующих дополнений 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
}
person Kaarel    schedule 01.07.2011
comment
@ИгорьГ. Я не уверен, что понимаю... Все входные данные для приведенного выше кода исходят из дополнений. - person Kaarel; 30.10.2012