Menampilkan hasil penelusuran yang dapat dijelajahi

Semua aplikasi harus mendukung penelusuran suara. Halaman ini menjelaskan cara lebih meningkatkan kualitas pengalaman penelusuran dengan mendukung inisiasi penelusuran tanpa suara dan dengan menampilkan daftar hasil penelusuran sehingga pengguna dapat memilih hasil lain. Misalnya, jika hasil yang disarankan bukan yang paling relevan.

Aplikasi media Anda dapat memberikan hasil penelusuran kontekstual di Android Auto dan Android Automotive OS (AAOS). Hasil ini muncul saat pengguna memulai kueri penelusuran atau melihat hasil penelusuran terbaru.

Untuk mengaktifkan dan memberikan hasil penelusuran ini:

  • Deklarasikan dukungan penelusuran dalam metode onGetRoot layanan Anda.

  • Ganti metode onSearch di layanan browser media Anda untuk menangani istilah penelusuran pengguna.

  • Atur hasil Penelusuran menggunakan item judul agar lebih mudah dijelajahi.

Aplikasi Anda dapat memberikan hasil penelusuran kontekstual yang muncul saat kueri penelusuran dimulai. Android Auto dan AAOS menampilkan hasil ini melalui antarmuka kueri penelusuran atau melalui kemampuan yang melakukan pivot pada kueri yang dibuat sebelumnya. Untuk mempelajari lebih lanjut, lihat Mendukung voice action.

Tampilan pemutaran dengan opsi **Hasil penelusuran** untuk melihat item media
yang terkait dengan penelusuran suara pengguna

Gambar 1. Tampilan pemutaran dengan opsi Hasil penelusuran untuk melihat item media yang terkait dengan penelusuran suara pengguna.

Untuk menunjukkan bahwa aplikasi Anda mendukung tampilan hasil penelusuran, sertakan kunci konstanta BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED dalam paket tambahan yang ditampilkan oleh metode onGetRoot layanan Anda, yang dipetakan ke Boolean 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);
}

Untuk memberikan hasil penelusuran, ganti metode onSearch di layanan browser media Anda. Android Auto dan AAOS meneruskan istilah penelusuran pengguna ke metode ini saat pengguna memanggil antarmuka kueri penelusuran atau kemampuan Hasil penelusuran.

Untuk membuat hasil penelusuran lebih mudah dijelajahi, Anda dapat menggunakan item judul. Misalnya, jika aplikasi Anda memutar musik, Anda dapat mengatur hasil penelusuran menurut album, artis, dan lagu. Cuplikan kode ini menunjukkan penerapan metode 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.
}