הצגת תוצאות חיפוש שניתן לדפדף

כל האפליקציות צריכות לתמוך בחיפושים קוליים. בדף הזה מוסבר איך לשפר עוד יותר את חוויית החיפוש על ידי תמיכה בהפעלת חיפושים ללא קול והצגת רשימה של תוצאות חיפוש, כדי שהמשתמשים יוכלו לבחור תוצאה אחרת. לדוגמה, אם ההצעה שמופיעה היא לא הכי רלוונטית.

אפליקציית המדיה שלכם יכולה לספק תוצאות חיפוש לפי הקשר ב-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.
}