顯示可瀏覽的搜尋結果
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
所有應用程式都必須支援語音搜尋。本頁面說明如何支援啟動無語音搜尋,以及顯示搜尋結果清單,讓使用者可以選擇其他結果,進一步提升搜尋體驗。舉例來說,如果建議結果並非最相關的內容。
媒體應用程式可在 Android Auto 和 Android Automotive OS (AAOS) 中提供情境搜尋結果。使用者啟動搜尋查詢或查看最近的搜尋結果時,就會看到這些結果。
如要啟用及提供這些搜尋結果,請按照下列步驟操作:
您的應用程式可以在使用者啟動搜尋查詢時,顯示相關內容搜尋結果。Android Auto 和 AAOS 會透過搜尋查詢介面或工作階段中較早進行查詢的預設用途,顯示這些結果。詳情請參閱「支援語音指令」。

圖 1. 播放檢視畫面內含「搜尋結果」選項,用於查看與使用者語音搜尋相關的媒體項目。
如要指出應用程式支援顯示搜尋結果,請在服務 onGetRoot
方法傳回的額外套件中加入常數索引鍵 BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED
,該索引鍵會對應至布林值 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<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<MediaItem> resultsToFill) {
// Implement this method.
}
這個頁面中的內容和程式碼範例均受《內容授權》中的授權所規範。Java 與 OpenJDK 是 Oracle 和/或其關係企業的商標或註冊商標。
上次更新時間:2025-08-22 (世界標準時間)。
[null,null,["上次更新時間:2025-08-22 (世界標準時間)。"],[],[],null,["# Display browsable search results\n\nAll apps must support voice searches. This page describes how to further enhance\nthe search experience by supporting the initiation of searches without voice and\nby showing a list of search results so that users can pick another result. For\nexample, if the suggested result isn't the most relevant.\n\nYour media app can provide contextual search results in Android Auto and Android\nAutomotive OS (AAOS). These results appear when a user initiates a search query\nor views the results of the most recent search.\n\nTo enable and provide these search results:\n\n- Declare search support in your service's `onGetRoot` method.\n\n- Override the `onSearch` method in your media browser service to handle user\n search terms.\n\n- Organize Search results using title items for improved browsability.\n\nYour app can provide contextual search results that appear when a search query\nis started. Android Auto and AAOS show these results through search query\ninterfaces or through affordances that pivot on queries made earlier. To learn\nmore, see the [Support voice actions](/training/cars/media/voice-actions#support_voice).\n\n**Figure 1.** Playback view with a **Search results** option to view media items\nrelated to the user's voice search.\n\nTo indicate that your app supports the display of search results, include the\nconstant key [`BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED`](/reference/androidx/media/utils/MediaConstants#BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED()) in the extras\nbundle returned by your service's [`onGetRoot`](/reference/androidx/media/MediaBrowserServiceCompat#onGetRoot(java.lang.String,%20int,%20android.os.Bundle)) method, mapping to the\nBoolean `true`. \n\n### Kotlin\n\n import androidx.media.utils.MediaConstants\n\n @Nullable\n override fun onGetRoot(\n @NonNull clientPackageName: String,\n clientUid: Int,\n @Nullable rootHints: Bundle\n ): BrowserRoot {\n val extras = Bundle()\n extras.putBoolean(\n MediaConstants.BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED, true)\n return BrowserRoot(ROOT_ID, extras)\n }\n\n### Java\n\n import androidx.media.utils.MediaConstants;\n\n @Nullable\n @Override\n public BrowserRoot onGetRoot(\n @NonNull String clientPackageName,\n int clientUid,\n @Nullable Bundle rootHints) {\n Bundle extras = new Bundle();\n extras.putBoolean(\n MediaConstants.BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED, true);\n return new BrowserRoot(ROOT_ID, extras);\n }\n\nTo provide search results, override the [`onSearch`](/reference/androidx/media/MediaBrowserServiceCompat#onSearch(java.lang.String,android.os.Bundle,androidx.media.MediaBrowserServiceCompat.Result%3Cjava.util.List%3Candroid.support.v4.media.MediaBrowserCompat.MediaItem%3E%3E)) method in your media\nbrowser service. Android Auto and AAOS forward the user's search terms to this\nmethod when a user invokes a search query interface or **Search results**\naffordance.\n\nTo make search results more browsable, you can use [title items](/training/cars/media/create-media-browser/content-styles#group-items). For\nexample, if your app plays music, you can organize search results by album,\nartist, and song. This code snippet shows an implementation of the `onSearch`\nmethod: \n\n### Kotlin\n\n fun onSearch(query: String, extras: Bundle) {\n // Detach from results to unblock the caller (if a search is expensive).\n result.detach()\n object:AsyncTask() {\n internal var searchResponse:ArrayList\n internal var succeeded = false\n protected fun doInBackground(vararg params:Void):Void {\n searchResponse = ArrayList()\n if (doSearch(query, extras, searchResponse))\n {\n succeeded = true\n }\n return null\n }\n protected fun onPostExecute(param:Void) {\n if (succeeded)\n {\n // Sending an empty List informs the caller that there were no results.\n result.sendResult(searchResponse)\n }\n else\n {\n // This invokes onError() on the search callback.\n result.sendResult(null)\n }\n return null\n }\n }.execute()\n }\n // Populates resultsToFill with search results. Returns true on success or false on error.\n private fun doSearch(\n query: String,\n extras: Bundle,\n resultsToFill: ArrayList\n ): Boolean {\n // Implement this method.\n }\n\n### Java\n\n @Override\n public void onSearch(final String query, final Bundle extras,\n Result<List<MediaItem\u003e\u003e result) {\n\n // Detach from results to unblock the caller (if a search is expensive).\n result.detach();\n\n new AsyncTask\u003cVoid, Void, Void\u003e() {\n List\u003eMediaItem\u003e searchResponse;\n boolean succeeded = false;\n @Override\n protected Void doInBackground(Void... params) {\n searchResponse = new ArrayList<MediaItem\u003e();\n if (doSearch(query, extras, searchResponse)) {\n succeeded = true;\n }\n return null;\n }\n\n @Override\n protected void onPostExecute(Void param) {\n if (succeeded) {\n // Sending an empty List informs the caller that there were no results.\n result.sendResult(searchResponse);\n } else {\n // This invokes onError() on the search callback.\n result.sendResult(null);\n }\n }\n }.execute()\n }\n\n /** Populates resultsToFill with search results. Returns true on success or false on error. */\n private boolean doSearch(String query, Bundle extras, ArrayList<MediaItem\u003e resultsToFill) {\n // Implement this method.\n }"]]