Wszystkie aplikacje muszą obsługiwać wyszukiwanie głosowe. Na tej stronie opisujemy, jak jeszcze bardziej ulepszyć wyszukiwanie, umożliwiając inicjowanie wyszukiwania bez użycia głosu i wyświetlanie listy wyników wyszukiwania, aby użytkownicy mogli wybrać inny wynik. Na przykład, jeśli sugerowany wynik nie jest najbardziej trafny.
Aplikacja multimedialna może wyświetlać kontekstowe wyniki wyszukiwania w Androidzie Auto i Androidzie Automotive OS (AAOS). Te wyniki pojawiają się, gdy użytkownik rozpoczyna wyszukiwanie lub wyświetla wyniki ostatniego wyszukiwania.
Aby włączyć i wyświetlać te wyniki wyszukiwania:
Zadeklaruj obsługę wyszukiwania w metodzie
onGetRoot
usługi.Zastąp metodę
onSearch
w usłudze przeglądarki multimediów, aby obsługiwać wyszukiwane przez użytkowników hasła.Organizowanie wyników wyszukiwania za pomocą elementów tytułowych, aby ułatwić przeglądanie.
Aplikacja może wyświetlać kontekstowe wyniki wyszukiwania, które pojawiają się po rozpoczęciu wyszukiwania. Android Auto i AAOS wyświetlają te wyniki za pomocą interfejsów zapytań lub elementów, które są oparte na wcześniejszych zapytaniach. Więcej informacji znajdziesz w artykule Obsługa komend głosowych.
Rysunek 1. Widok odtwarzania z opcją Wyniki wyszukiwania, która umożliwia wyświetlanie multimediów powiązanych z wyszukiwaniem głosowym użytkownika.
Aby wskazać, że aplikacja obsługuje wyświetlanie wyników wyszukiwania, w pakiecie dodatków zwracanym przez metodę onGetRoot
usługi umieść stały klucz BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED
, który jest mapowany na wartość logiczną true
.
Kotlin
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);
}
Aby udostępniać wyniki wyszukiwania, zastąp metodę onSearch
w usłudze przeglądarki multimediów. Android Auto i AAOS przekazują wyszukiwane hasła użytkownika do tej metody, gdy użytkownik wywoła interfejs wyszukiwania lub wyniki wyszukiwania.
Aby ułatwić przeglądanie wyników wyszukiwania, możesz użyć elementów tytułowych. Jeśli na przykład Twoja aplikacja odtwarza muzykę, możesz uporządkować wyniki wyszukiwania według albumu, wykonawcy i utworu. Ten fragment kodu pokazuje implementację metody onSearch
:
Kotlin
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.
}