Hiển thị kết quả tìm kiếm có thể xem
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Tất cả ứng dụng đều phải hỗ trợ tính năng tìm kiếm bằng giọng nói. Trang này mô tả cách cải thiện hơn nữa trải nghiệm tìm kiếm bằng cách hỗ trợ việc bắt đầu tìm kiếm mà không cần giọng nói và bằng cách hiện danh sách kết quả tìm kiếm để người dùng có thể chọn một kết quả khác. Ví dụ: nếu kết quả được đề xuất không phải là kết quả phù hợp nhất.
Ứng dụng đa phương tiện của bạn có thể cung cấp kết quả tìm kiếm theo bối cảnh trong Android Auto và Android Automotive OS (AAOS). Những kết quả này xuất hiện khi người dùng bắt đầu một cụm từ tìm kiếm hoặc xem kết quả của lượt tìm kiếm gần đây nhất.
Cách bật và cung cấp những kết quả tìm kiếm này:
Khai báo tính năng hỗ trợ tìm kiếm trong phương thức onGetRoot
của dịch vụ.
Ghi đè phương thức onSearch
trong dịch vụ trình duyệt nội dung đa phương tiện để xử lý cụm từ tìm kiếm của người dùng.
Sắp xếp kết quả tìm kiếm bằng cách sử dụng mục tiêu đề để cải thiện khả năng duyệt xem.
Ứng dụng của bạn có thể cung cấp kết quả tìm kiếm theo ngữ cảnh xuất hiện khi người dùng bắt đầu một cụm từ tìm kiếm. Android Auto và AAOS hiển thị các kết quả này thông qua giao diện truy vấn tìm kiếm hoặc thông qua các thành phần hướng đến truy vấn đã thực hiện trước đó. Để tìm hiểu thêm, hãy xem phần Hỗ trợ thao tác bằng giọng nói.

Hình 1. Khung hiển thị phát có tuỳ chọn Kết quả tìm kiếm để xem các mục nội dung đa phương tiện liên quan đến nội dung tìm kiếm bằng giọng nói của người dùng.
Để cho biết rằng ứng dụng của bạn hỗ trợ việc hiển thị kết quả tìm kiếm, hãy thêm khoá hằng số BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED
vào gói dữ liệu bổ sung do phương thức onGetRoot
của dịch vụ trả về, liên kết đến giá trị 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);
}
Để cung cấp kết quả tìm kiếm, hãy ghi đè phương thức onSearch
trong dịch vụ trình duyệt nội dung đa phương tiện của bạn. Android Auto và AAOS sẽ chuyển tiếp các cụm từ tìm kiếm của người dùng đến phương thức này khi người dùng gọi giao diện truy vấn tìm kiếm hoặc thành phần Kết quả tìm kiếm.
Để giúp kết quả tìm kiếm dễ xem hơn, bạn có thể sử dụng mục tiêu đề. Ví dụ: nếu ứng dụng của bạn phát nhạc, thì bạn có thể sắp xếp kết quả tìm kiếm theo đĩa nhạc, nghệ sĩ và bài hát. Đoạn mã này cho thấy cách triển khai phương thức 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.
}
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-08-22 UTC.
[null,null,["Cập nhật lần gần đây nhất: 2025-08-22 UTC."],[],[],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 }"]]