عرض نتائج بحث قابلة للتصفح

يجب أن تتيح جميع التطبيقات عمليات البحث الصوتي. توضّح هذه الصفحة كيفية تحسين تجربة البحث بشكل أكبر من خلال إتاحة بدء عمليات البحث بدون استخدام الصوت وعرض قائمة بنتائج البحث ليتمكّن المستخدمون من اختيار نتيجة أخرى. على سبيل المثال، إذا لم تكن النتيجة المقترَحة هي الأكثر صلة.

يمكن لتطبيق الوسائط تقديم نتائج بحث حسب السياق في Android Auto وAndroid Automotive OS (AAOS). تظهر هذه النتائج عندما يبدأ المستخدم طلب بحث أو يعرض نتائج البحث الأخير.

لتفعيل هذه الميزة وتقديم نتائج البحث هذه، يُرجى اتّباع الخطوات التالية:

  • عليك الإفصاح عن إمكانية البحث في طريقة onGetRoot الخاصة بخدمتك.

  • تجاوز طريقة onSearch في خدمة متصفّح الوسائط للتعامل مع عبارات بحث المستخدم.

  • تنظيم نتائج البحث باستخدام عناصر العنوان لتسهيل التصفّح

يمكن أن يوفّر تطبيقك نتائج بحث سياقية تظهر عند بدء طلب بحث. تعرض Android Auto وAAOS هذه النتائج من خلال واجهات طلبات البحث أو من خلال عناصر واجهة المستخدم التي تستند إلى طلبات بحث تم إجراؤها سابقًا. لمزيد من المعلومات، يُرجى الاطّلاع على إتاحة الإجراءات الصوتية.

عرض التشغيل مع خيار **نتائج البحث** للاطّلاع على عناصر الوسائط ذات الصلة بالبحث الصوتي الذي أجراه المستخدم

الشكل 1. عرض التشغيل مع خيار نتائج البحث للاطّلاع على عناصر الوسائط ذات الصلة بالبحث الصوتي الذي أجراه المستخدم

للإشارة إلى أنّ تطبيقك يتيح عرض نتائج البحث، أدرِج المفتاح الثابت BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED في حزمة الإضافات التي تعرضها طريقة onGetRoot الخاصة بخدمتك، مع الربط بالقيمة المنطقية 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);
}

لعرض نتائج البحث، عليك إلغاء طريقة onSearch في خدمة متصفّح الوسائط. ترسل Android Auto وAAOS عبارات البحث التي أدخلها المستخدم إلى هذه الطريقة عندما يستدعي المستخدم واجهة طلب بحث أو عنصر نتائج البحث.

لتسهيل تصفّح نتائج البحث، يمكنك استخدام عناصر العنوان. على سبيل المثال، إذا كان تطبيقك يشغّل الموسيقى، يمكنك تنظيم نتائج البحث حسب الألبوم والفنان والأغنية. يعرض مقتطف الرمز هذا عملية تنفيذ لطريقة 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.
}