نمایش نتایج جستجوی قابل مرور

همه برنامه‌ها باید از جستجوی صوتی پشتیبانی کنند. این صفحه نحوه بهبود بیشتر تجربه جستجو را با پشتیبانی از شروع جستجو بدون صدا و با نمایش لیستی از نتایج جستجو توضیح می‌دهد تا کاربران بتوانند نتیجه دیگری را انتخاب کنند. به عنوان مثال، اگر نتیجه پیشنهادی مرتبط‌ترین نباشد.

برنامه رسانه‌ای شما می‌تواند نتایج جستجوی متنی را در Android Auto و Android Automotive OS (AAOS) ارائه دهد. این نتایج زمانی ظاهر می‌شوند که کاربر یک عبارت جستجو را آغاز می‌کند یا نتایج جدیدترین جستجو را مشاهده می‌کند.

برای فعال کردن و ارائه این نتایج جستجو:

  • پشتیبانی از جستجو را در متد onGetRoot سرویس خود اعلام کنید.

  • متد onSearch را در سرویس مرورگر رسانه خود برای مدیریت عبارات جستجوی کاربر، بازنویسی کنید.

  • نتایج جستجو را با استفاده از آیتم‌های عنوان برای بهبود قابلیت مرور، سازماندهی کنید.

برنامه شما می‌تواند نتایج جستجوی متنی را ارائه دهد که هنگام شروع یک عبارت جستجو ظاهر می‌شوند. Android Auto و AAOS این نتایج را از طریق رابط‌های عبارت جستجو یا از طریق قابلیت‌هایی که بر اساس عبارات جستجو شده قبلی هستند، نشان می‌دهند. برای کسب اطلاعات بیشتر، به بخش «پشتیبانی از عملکردهای صوتی» مراجعه کنید.

نمای پخش با گزینه **نتایج جستجو** برای مشاهده موارد رسانه‌ای مرتبط با جستجوی صوتی کاربر

شکل ۱. نمای پخش با گزینه نتایج جستجو برای مشاهده موارد رسانه‌ای مرتبط با جستجوی صوتی کاربر.

برای نشان دادن اینکه برنامه شما از نمایش نتایج جستجو پشتیبانی می‌کند، کلید ثابت BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED را در بسته extras که توسط متد onGetRoot سرویس شما برگردانده می‌شود، قرار دهید و آن را به مقدار بولی true نگاشت کنید.

کاتلین

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

جاوا

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

برای ارائه نتایج جستجو، متد onSearch را در سرویس مرورگر رسانه خود بازنویسی کنید. اندروید اتو و AAOS هنگامی که کاربر رابط جستجوی پرس و جو یا قابلیت نتایج جستجو را فراخوانی می‌کند، عبارات جستجوی کاربر را به این متد ارسال می‌کنند.

برای اینکه نتایج جستجو قابل مرور بیشتری باشند، می‌توانید از آیتم‌های عنوان استفاده کنید. برای مثال، اگر برنامه شما موسیقی پخش می‌کند، می‌توانید نتایج جستجو را بر اساس آلبوم، هنرمند و آهنگ سازماندهی کنید. این قطعه کد پیاده‌سازی متد onSearch را نشان می‌دهد:

کاتلین

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

جاوا

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