Все приложения должны поддерживать голосовой поиск. На этой странице описывается, как улучшить качество поиска, поддерживая запуск поиска без голосового управления и отображая список результатов поиска, чтобы пользователи могли выбрать другой вариант. Например, если предложенный результат не является наиболее релевантным.
Ваше медиаприложение может предоставлять контекстные результаты поиска в Android Auto и Android Automotive OS (AAOS). Эти результаты появляются, когда пользователь инициирует поисковый запрос или просматривает результаты последнего поиска.
Чтобы включить и предоставить эти результаты поиска:
Объявите поддержку поиска в методе
onGetRoot
вашего сервиса.Переопределите метод
onSearch
в службе вашего медиабраузера для обработки поисковых запросов пользователей.Организуйте результаты поиска с использованием заголовков для улучшения удобства просмотра.
Ваше приложение может предоставлять контекстные результаты поиска, которые появляются при начале выполнения поискового запроса. Android Auto и AAOS показывают эти результаты через интерфейсы поисковых запросов или через возможности, основанные на ранее сделанных запросах. Подробнее см. в разделе «Поддержка голосовых действий» .
Рисунок 1. Вид воспроизведения с опцией результатов поиска для просмотра элементов мультимедиа, связанных с голосовым поиском пользователя.
Чтобы указать, что ваше приложение поддерживает отображение результатов поиска, включите константный ключ BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED
в пакет дополнительных услуг, возвращаемый методом 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)
}
Ява
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 перенаправляют поисковые запросы пользователя в этот метод, когда пользователь вызывает интерфейс поискового запроса или доступ к результатам поиска .
Чтобы сделать результаты поиска более удобными для просмотра, можно использовать элементы title . Например, если ваше приложение воспроизводит музыку, вы можете упорядочить результаты поиска по альбому, исполнителю и песне. Этот фрагмент кода демонстрирует реализацию метода 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.
}
Ява
@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.
}