Afficher des résultats de recherche consultables

Toutes les applications doivent être compatibles avec la recherche vocale. Cette page explique comment améliorer l'expérience de recherche en permettant aux utilisateurs de lancer des recherches sans utiliser la voix et en affichant une liste de résultats de recherche afin qu'ils puissent en choisir un autre. Par exemple, si le résultat suggéré n'est pas le plus pertinent.

Votre application multimédia peut fournir des résultats de recherche contextuels dans Android Auto et Android Automotive OS (AAOS). Ces résultats s'affichent lorsqu'un utilisateur lance une requête de recherche ou consulte les résultats de sa dernière recherche.

Pour activer et fournir ces résultats de recherche :

  • Déclarez la prise en charge de la recherche dans la méthode onGetRoot de votre service.

  • Remplacez la méthode onSearch dans votre service de navigateur multimédia pour gérer les termes de recherche des utilisateurs.

  • Organisez les résultats de recherche à l'aide d'éléments de titre pour les rendre plus faciles à parcourir.

Votre application peut fournir des résultats de recherche contextuels qui s'affichent lorsqu'une requête de recherche est lancée. Android Auto et AAOS affichent ces résultats via des interfaces de requête de recherche ou via des affordances axées sur les requêtes effectuées plus tôt. Pour en savoir plus, consultez la section Accepter les commandes vocales.

Vue de lecture avec l'option **Résultats de recherche** pour afficher les éléments multimédias liés à la recherche vocale de l'utilisateur

Figure 1 : Vue de lecture avec l'option Résultats de recherche pour afficher les éléments multimédias liés à la recherche vocale de l'utilisateur.

Pour indiquer que votre application est compatible avec l'affichage des résultats de recherche, incluez la clé de constante BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED dans le bundle d'extras renvoyé par la méthode onGetRoot de votre service, en la mappant sur la valeur booléenne 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);
}

Pour fournir des résultats de recherche, remplacez la méthode onSearch dans votre service de navigateur multimédia. Android Auto et AAOS envoient les termes de recherche de l'utilisateur à cette méthode lorsqu'il appelle une interface de requête de recherche ou l'affordance Résultats de recherche.

Pour rendre les résultats de recherche plus faciles à parcourir, vous pouvez utiliser des éléments de titre. Par exemple, si votre application lit de la musique, vous pouvez organiser les résultats de recherche par album, artiste et titre. Cet extrait de code montre une implémentation de la méthode 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.
}