Durchsuchbare Suchergebnisse anzeigen

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

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

So aktivieren und liefern Sie diese Suchergebnisse:

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

  • Überschreiben Sie die onSearch-Methode in Ihrem Media Browser-Dienst, um Suchbegriffe von Nutzern zu verarbeiten.

  • Organisieren Sie die Suchergebnisse mit Titel-Elementen, 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 Schnittstellen für Suchanfragen oder über Schaltflächen angezeigt, die auf früheren Suchanfragen basieren. Weitere Informationen finden Sie unter Sprachaktionen 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 anzusehen, die mit der Sprachsuche des Nutzers zusammenhängen.

Wenn Sie angeben möchten, dass Ihre App die Anzeige von Suchergebnissen unterstützt, fügen Sie den konstanten Schlüssel BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED dem Extras Bundle hinzu, das von der onGetRoot-Methode Ihres Dienstes zurückgegeben wird, und ordnen Sie ihm den booleschen Wert true zu.

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

Wenn Sie Suchergebnisse liefern möchten, überschreiben Sie die onSearch-Methode in Ihrem Media Browser-Dienst. Android Auto und AAOS leiten die Suchbegriffe des Nutzers an diese Methode weiter, wenn ein Nutzer eine Schnittstelle für Suchanfragen oder die Schaltfläche Suchergebnisse aufruft.

Um die Suchergebnisse übersichtlicher zu gestalten, können Sie Titel-Elemente verwenden. Wenn Ihre App beispielsweise Musik abspielt, können Sie die Suchergebnisse nach Album, Künstler und Song organisieren. Dieses Code-Snippet zeigt eine Implementierung der onSearch-Methode:

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.
}