Durchsuchbare Suchergebnisse anzeigen

Alle Apps müssen Sprachsuche unterstützen. Auf dieser Seite wird beschrieben, wie Sie die Suche weiter optimieren können, indem Sie die Initiierung von Suchanfragen ohne Sprachbefehle unterstützen und eine Liste mit Suchergebnissen anzeigen, damit Nutzer ein anderes Ergebnis auswählen können. Das kann beispielsweise der Fall sein, wenn das vorgeschlagene Ergebnis nicht das relevanteste ist.

Ihre Medien-App kann in Android Auto und Android Automotive OS (AAOS) kontextbezogene Suchergebnisse liefern. Diese Ergebnisse werden angezeigt, wenn ein Nutzer eine Suchanfrage startet oder die Ergebnisse der letzten Suche aufruft.

So aktivieren und stellen Sie diese Suchergebnisse bereit:

  • Deklarieren Sie die Unterstützung der Suche in der onGetRoot-Methode Ihres Dienstes.

  • Überschreiben Sie die Methode onSearch in Ihrem Mediabrowserdienst, um Suchbegriffe von Nutzern zu verarbeiten.

  • Suchergebnisse mithilfe von Titel-Elementen organisieren, um die Übersichtlichkeit zu verbessern

Ihre App kann kontextbezogene Suchergebnisse liefern, die angezeigt werden, wenn eine Suchanfrage gestartet wird. In Android Auto und AAOS werden diese Ergebnisse über Suchanfrage-Schnittstellen oder über Affordances angezeigt, die auf früheren Anfragen basieren. Weitere Informationen finden Sie unter Sprachbefehle unterstützen.

Wiedergabeansicht mit der Option **Suchergebnisse**, um Media-Elemente im Zusammenhang mit der Sprachsuche des Nutzers aufzurufen

Abbildung 1: Wiedergabeansicht mit der Option Suchergebnisse, um Media-Elemente im Zusammenhang mit der Sprachsuche des Nutzers aufzurufen.

Wenn Sie angeben möchten, dass Ihre App die Anzeige von Suchergebnissen unterstützt, fügen Sie den Konstantenschlüssel BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED in das Extras-Bundle ein, das von der Methode onGetRoot Ihres Dienstes zurückgegeben wird. Er wird dem booleschen Wert true zugeordnet.

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);
}

Überschreiben Sie die Methode onSearch in Ihrem Media-Browser-Dienst, um Suchergebnisse bereitzustellen. Android Auto und AAOS leiten die Suchbegriffe des Nutzers an diese Methode weiter, wenn ein Nutzer eine Suchanfrageoberfläche oder die Suchergebnisse aufruft.

Um die Suchergebnisse übersichtlicher zu gestalten, können Sie Titelelemente verwenden. Wenn Ihre App beispielsweise Musik abspielt, können Sie Suchergebnisse nach Album, Künstler und Song organisieren. Dieses Code-Snippet zeigt eine Implementierung der Methode 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&lt;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&lt;MediaItem> resultsToFill) {
    // Implement this method.
}