Все приложения должны поддерживать голосовой поиск. На этой странице описано, как еще больше улучшить работу с поиском, добавив поддержку запуска поиска без голосового ввода и отобразив список результатов поиска, чтобы пользователи могли выбрать другой результат. Например, если предложенный результат не является наиболее релевантным.
Ваше медиаприложение может предоставлять контекстные результаты поиска в Android Auto и Android Automotive OS (AAOS). Эти результаты появляются, когда пользователь инициирует поисковый запрос или просматривает результаты последнего поиска.
Для отображения и предоставления следующих результатов поиска:
Объявите о поддержке поиска в методе
onGetRootвашего сервиса.Переопределите метод
onSearchв службе вашего медиабраузера, чтобы обрабатывать поисковые запросы пользователей.Для улучшения удобства просмотра результатов поиска используйте заголовки.
Ваше приложение может предоставлять контекстные результаты поиска, которые появляются при начале поискового запроса. Android Auto и AAOS отображают эти результаты через интерфейсы поисковых запросов или через элементы управления, которые зависят от ранее сделанных запросов. Для получения дополнительной информации см. раздел «Поддержка голосовых действий» .

Рисунок 1. Режим воспроизведения с опцией « Результаты поиска» для просмотра медиафайлов, связанных с голосовым поиском пользователя.
Чтобы указать, что ваше приложение поддерживает отображение результатов поиска, включите константу BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED в пакет extras, возвращаемый методом onGetRoot вашей службы, сопоставив его с логическим значением true .
Котлин
import androidx.media.utils.MediaConstants
@Nullable
override fun onGetRoot(
@NonNull clientPackageName: String,
clientUid: Int,
@Nullable rootHints: Bundle
): BrowserRoot {
val extras = Bundle()
extras.putBoolean(
MediaConstants.BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED, true)
return BrowserRoot(ROOT_ID, extras)
}
Java
import androidx.media.utils.MediaConstants;
@Nullable
@Override
public BrowserRoot onGetRoot(
@NonNull String clientPackageName,
int clientUid,
@Nullable Bundle rootHints) {
Bundle extras = new Bundle();
extras.putBoolean(
MediaConstants.BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED, true);
return new BrowserRoot(ROOT_ID, extras);
}
Для отображения результатов поиска переопределите метод onSearch в службе вашего медиабраузера. Android Auto и AAOS перенаправляют поисковые запросы пользователя этому методу, когда пользователь вызывает интерфейс поискового запроса или окно результатов поиска .
Чтобы сделать результаты поиска более удобными для просмотра, можно использовать элементы заголовка . Например, если ваше приложение воспроизводит музыку, вы можете упорядочить результаты поиска по альбому, исполнителю и песне. Этот фрагмент кода демонстрирует реализацию метода onSearch :
Котлин
fun onSearch(query: String, extras: Bundle) {
// Detach from results to unblock the caller (if a search is expensive).
result.detach()
object:AsyncTask() {
internal var searchResponse:ArrayList
internal var succeeded = false
protected fun doInBackground(vararg params:Void):Void {
searchResponse = ArrayList()
if (doSearch(query, extras, searchResponse))
{
succeeded = true
}
return null
}
protected fun onPostExecute(param:Void) {
if (succeeded)
{
// Sending an empty List informs the caller that there were no results.
result.sendResult(searchResponse)
}
else
{
// This invokes onError() on the search callback.
result.sendResult(null)
}
return null
}
}.execute()
}
// Populates resultsToFill with search results. Returns true on success or false on error.
private fun doSearch(
query: String,
extras: Bundle,
resultsToFill: ArrayList
): Boolean {
// Implement this method.
}
Java
@Override
public void onSearch(final String query, final Bundle extras,
Result<List<MediaItem>> result) {
// Detach from results to unblock the caller (if a search is expensive).
result.detach();
new AsyncTask<Void, Void, Void>() {
List>MediaItem> searchResponse;
boolean succeeded = false;
@Override
protected Void doInBackground(Void... params) {
searchResponse = new ArrayList<MediaItem>();
if (doSearch(query, extras, searchResponse)) {
succeeded = true;
}
return null;
}
@Override
protected void onPostExecute(Void param) {
if (succeeded) {
// Sending an empty List informs the caller that there were no results.
result.sendResult(searchResponse);
} else {
// This invokes onError() on the search callback.
result.sendResult(null);
}
}
}.execute()
}
/** Populates resultsToFill with search results. Returns true on success or false on error. */
private boolean doSearch(String query, Bundle extras, ArrayList<MediaItem> resultsToFill) {
// Implement this method.
}