Visualizza risultati di ricerca sfogliabili

Tutte le app devono supportare le ricerche vocali. Questa pagina descrive come migliorare ulteriormente l'esperienza di ricerca supportando l'avvio di ricerche senza voce e mostrando un elenco di risultati di ricerca in modo che gli utenti possano scegliere un altro risultato. Ad esempio, se il risultato suggerito non è il più pertinente.

La tua app multimediale può fornire risultati di ricerca contestuali in Android Auto e Android Automotive OS (AAOS). Questi risultati vengono visualizzati quando un utente avvia una query di ricerca o visualizza i risultati della ricerca più recente.

Per attivare e fornire questi risultati di ricerca:

  • Dichiara il supporto della ricerca nel metodo onGetRoot del tuo servizio.

  • Esegui l'override del metodo onSearch nel servizio di browser multimediale per gestire i termini di ricerca degli utenti.

  • Organizza i risultati di ricerca utilizzando gli elementi del titolo per una migliore navigazione.

La tua app può fornire risultati di ricerca contestuali che vengono visualizzati quando viene avviata una query di ricerca. Android Auto e AAOS mostrano questi risultati tramite interfacce di query di ricerca o tramite funzionalità che si basano su query effettuate in precedenza. Per saperne di più, consulta la pagina Supportare le azioni vocali.

Visualizzazione della riproduzione con un'opzione **Risultati di ricerca** per visualizzare gli elementi multimediali
correlati alla ricerca vocale dell'utente

Figura 1. Visualizzazione della riproduzione con un'opzione Risultati di ricerca per visualizzare gli elementi multimediali correlati alla ricerca vocale dell'utente.

Per indicare che la tua app supporta la visualizzazione dei risultati di ricerca, includi la chiave costante BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED nel bundle di dati aggiuntivi restituito dal metodo onGetRoot del tuo servizio, mappando il valore booleano 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);
}

Per fornire i risultati di ricerca, esegui l'override del metodo onSearch nel servizio del browser multimediale. Android Auto e AAOS inoltrano i termini di ricerca dell'utente a questo metodo quando un utente richiama un'interfaccia di query di ricerca o un'affordance Risultati di ricerca.

Per rendere i risultati di ricerca più sfogliabili, puoi utilizzare gli elementi del titolo. Ad esempio, se la tua app riproduce musica, puoi organizzare i risultati di ricerca per album, artista e brano. Questo snippet di codice mostra un'implementazione del metodo 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.
}