Exibir resultados de pesquisa navegáveis

Todos os apps precisam oferecer suporte a pesquisas por voz. Esta página descreve como melhorar ainda mais a experiência de pesquisa ao permitir o início de pesquisas sem voz e ao mostrar uma lista de resultados para que os usuários possam escolher outro. Por exemplo, se o resultado sugerido não for o mais relevante.

Seu app de música pode fornecer resultados de pesquisa contextual no Android Auto e no Android Automotive OS (AAOS). Esses resultados aparecem quando um usuário inicia uma consulta de pesquisa ou visualiza os resultados da pesquisa mais recente.

Para ativar e fornecer esses resultados da pesquisa:

  • Declare o suporte à pesquisa no método onGetRoot do serviço.

  • Substitua o método onSearch no serviço de navegação de mídia para processar os termos de pesquisa do usuário.

  • Organize os resultados da pesquisa usando itens de título para melhorar a capacidade de navegação.

Seu app pode fornecer resultados da pesquisa contextuais que aparecem quando uma consulta de pesquisa é iniciada. O Android Auto e o AAOS mostram esses resultados usando interfaces de consulta de pesquisa ou recursos focados em consultas anteriores. Para saber mais, consulte Suporte para comandos de voz.

Visualização de reprodução com uma opção **Resultados da pesquisa** para ver itens de mídia
relacionados à pesquisa por voz do usuário

Figura 1. Visualização de reprodução com uma opção Resultados da pesquisa para ver itens de mídia relacionados à pesquisa por voz do usuário.

Para indicar que seu app oferece suporte à exibição de resultados da pesquisa, inclua a chave constante BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED no pacote de extras retornado pelo método onGetRoot do seu serviço, mapeando para o 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);
}

Para fornecer resultados da pesquisa, modifique o método onSearch no seu serviço de navegação de mídia. O Android Auto e o AAOS encaminham os termos de pesquisa do usuário para esse método quando um usuário chama uma interface de consulta de pesquisa ou a opção Resultados da pesquisa.

Para facilitar a navegação nos resultados da pesquisa, use itens de título. Por exemplo, se o app toca música, você pode organizar os resultados da pesquisa por álbum, artista e música. Este snippet de código mostra uma implementação do método 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.
}