Получение строки поискового запроса при использовании настраиваемого поставщика поисковых предложений

У меня есть поставщик настраиваемых поисковых предложений. На самом деле это не предложение само по себе, а ярлыки поиска. Вот пользовательский провайдер, который я написал:

public class QuickSearchProvider extends SearchRecentSuggestionsProvider {

  public final static String AUTHORITY = "com.example.testapp.providers.QuickSearchProvider";
  public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;

  public QuickSearchProvider() {
    setupSuggestions(AUTHORITY, MODE);
  }

  public Cursor query(Uri uri, String[] projection, String sel,
      String[] selArgs, String sortOrder) {

      MatrixCursor cursor = new MatrixCursor(new String[] { 
          BaseColumns._ID,
          SearchManager.SUGGEST_COLUMN_TEXT_1,
          SearchManager.SUGGEST_COLUMN_TEXT_2,
          SearchManager.SUGGEST_COLUMN_ICON_1,
          SearchManager.SUGGEST_COLUMN_INTENT_ACTION});

      cursor.addRow(new Object[] { 0, "Plants", "Search Plants", android.R.drawable.ic_menu_search, Search.SEARCH_PLANTS_ACTION});
      cursor.addRow(new Object[] { 1, "Birds", "Search Birds", android.R.drawable.ic_menu_search, Search.SEARCH_BIRDS_ACTION });

      return new MergeCursor(new Cursor[] { cursor });
  }

}

В моей активности, которая содержит поле поиска, я написал обработчик внутри метода onNewIntent. Вот пример:

protected void onNewIntent(Intent intent) {
    if  (Search.SEARCH_PLANTS_ACTION.equals(intent.getAction())) {
        ...
    } else if (Search.SEARCH_BIRDS_ACTION.equals(intent.getAction())) {
        ...         
    }
}

Как видите, я могу легко проверить, какой ярлык поиска был выбран, но я не могу понять, как получить исходную строку запроса. Любая помощь?

(Дополнительное примечание: если вы обнаружите, что моя реализация поставщика подсказок пользовательского поиска неверна или может быть улучшена, сообщите мне об этом.)

Спасибо.


person Mridang Agarwalla    schedule 29.08.2012    source источник


Ответы (2)


После небольшого головокружения и хождения по документам. Я понял!

Строка поиска всегда доступна как первый и единственный элемент в параметре selArgs метода query().

Чтобы получить строку поиска в обработчике намерений активности, вам нужно использовать: intent.getStringExtra(SearchManager.QUERY). По умолчанию это значение доступно только при отправке искомого запроса, а не при нажатии предложения поиска. Если вам нужно получить это значение с помощью пользовательского намерения, которое вы определили для своего поискового предложения, вам нужно добавить его к курсору следующим образом:

public class QuickSearchProvider extends SearchRecentSuggestionsProvider {

  public final static String AUTHORITY = "com.example.testapp.providers.QuickSearchProvider";
  public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;

  public QuickSearchProvider() {
    setupSuggestions(AUTHORITY, MODE);
  }

  public Cursor query(Uri uri, String[] projection, String sel,
      String[] selArgs, String sortOrder) {

      MatrixCursor cursor = new MatrixCursor(new String[] { 
          BaseColumns._ID,
          SearchManager.SUGGEST_COLUMN_TEXT_1,
          SearchManager.SUGGEST_COLUMN_TEXT_2,
          SearchManager.SUGGEST_COLUMN_ICON_1,
          SearchManager.SUGGEST_COLUMN_QUERY,
          SearchManager.SUGGEST_COLUMN_INTENT_ACTION});

      cursor.addRow(new Object[] { 0, "Plants", "Search Plants", android.R.drawable.ic_menu_search, selArgs[0], Search.SEARCH_PLANTS_ACTION});
      cursor.addRow(new Object[] { 1, "Birds", "Search Birds", android.R.drawable.ic_menu_search, selArgs[0], Search.SEARCH_BIRDS_ACTION });

      return new MergeCursor(new Cursor[] { cursor });
  }

}
person Mridang Agarwalla    schedule 07.09.2012

Большинство паттернов, которые я видел, вызывают функцию с именем handleIntent() из обратных вызовов onCreate и onNewIntent(). Оттуда или внутри onNewIntent() строка запроса извлекается следующим образом:

Строковый запрос = намерение.getStringExtra(SearchManager.QUERY);

о намерении. Я не уверен, можно ли улучшить вашего поставщика контента, поскольку я сейчас преследую ту же цель.

person Sean    schedule 29.08.2012
comment
Я тоже видел этот пример, но SearchManager.QUERY доступен только в намерении ACTION_SEARCH. Когда я пытаюсь использовать его в своих целях, я получаю исключение нулевого указателя. - person Mridang Agarwalla; 29.08.2012
comment
@MridangAgarwalla Если не ACTION_SEARCH, то какое намерение вы здесь используете? - person IgorGanapolsky; 17.09.2013