Android TV ใช้อินเทอร์เฟซการค้นหาของ Android search interface เพื่อดึงข้อมูลเนื้อหาจากแอปที่ติดตั้งไว้และแสดงผลการค้นหาแก่ผู้ใช้ ระบบสามารถรวมข้อมูลเนื้อหาของแอปไว้กับผลการค้นหาเหล่านี้เพื่อให้ผู้ใช้เข้าถึงเนื้อหาในแอปได้ทันที
แอปของคุณต้องระบุช่องข้อมูลที่ Android TV สามารถใช้สร้างผลการค้นหาที่แนะนำเมื่อผู้ใช้ป้อนอักขระในกล่องโต้ตอบการค้นหา โดยแอปต้องใช้
Content Provider ที่แสดง
คำแนะนำพร้อมกับไฟล์การกำหนดค่า
searchable.xml ที่อธิบาย Content
Provider และข้อมูลสำคัญอื่นๆ สำหรับ Android TV นอกจากนี้ คุณยังต้องมีกิจกรรมที่จัดการ Intent ที่เริ่มทำงานเมื่อผู้ใช้เลือกผลการค้นหาที่แนะนำ ดูรายละเอียดเพิ่มเติมได้ที่หัวข้อเพิ่ม
คำแนะนำการค้นหาที่กำหนดเอง คู่มือนี้ครอบคลุมประเด็นหลักๆ ที่เฉพาะเจาะจงสำหรับแอป Android TV
ก่อนอ่านคู่มือนี้ โปรดตรวจสอบว่าคุณคุ้นเคยกับแนวคิดที่อธิบายไว้ใน คู่มือ Search API และโปรดอ่านหัวข้อเพิ่มฟังก์ชันการค้นหาด้วย
ตัวอย่างโค้ดในคู่มือนี้มาจาก Leanback sample app
ระบุคอลัมน์
SearchManager อธิบายช่องข้อมูลที่คาดไว้โดยแสดงเป็นคอลัมน์ของฐานข้อมูลในเครื่อง คุณต้องแมปช่องข้อมูลกับคอลัมน์เหล่านี้ ไม่ว่าข้อมูลจะมีรูปแบบใดก็ตาม โดยปกติแล้วจะอยู่ในคลาสที่เข้าถึงข้อมูลเนื้อหา ดูข้อมูลเกี่ยวกับการสร้าง
คลาสที่แมปข้อมูลที่มีอยู่กับช่องที่จำเป็นได้ที่
Building a suggestion table
คลาส SearchManager มีคอลัมน์หลายคอลัมน์สำหรับ Android TV ตารางต่อไปนี้อธิบายคอลัมน์ที่สำคัญบางคอลัมน์
| ค่า | คำอธิบาย |
|---|---|
SUGGEST_COLUMN_TEXT_1 |
ชื่อเนื้อหา (ต้องระบุ) |
SUGGEST_COLUMN_TEXT_2 |
คำอธิบายข้อความของเนื้อหา |
SUGGEST_COLUMN_RESULT_CARD_IMAGE |
รูปภาพ โปสเตอร์ หรือปกสำหรับเนื้อหา |
SUGGEST_COLUMN_CONTENT_TYPE |
ประเภท MIME ของสื่อ |
SUGGEST_COLUMN_VIDEO_WIDTH |
ความกว้างความละเอียดของสื่อ |
SUGGEST_COLUMN_VIDEO_HEIGHT |
ความสูงความละเอียดของสื่อ |
SUGGEST_COLUMN_PRODUCTION_YEAR |
ปีที่ผลิตเนื้อหา (ต้องระบุ) |
SUGGEST_COLUMN_DURATION |
ระยะเวลาของสื่อในหน่วยมิลลิวินาที (ต้องระบุ) |
เฟรมเวิร์กการค้นหาต้องมีคอลัมน์ต่อไปนี้
เมื่อค่าของคอลัมน์เหล่านี้สำหรับเนื้อหาของคุณตรงกับค่าของเนื้อหาเดียวกันจากผู้ให้บริการรายอื่น ที่เซิร์ฟเวอร์ของ Google พบ ระบบจะแสดง Deep Link ไปยังแอปของคุณในมุมมองรายละเอียด ของเนื้อหา พร้อมกับลิงก์ไปยังแอปของผู้ให้บริการรายอื่น เราจะพูดถึงเรื่องนี้เพิ่มเติมใน ส่วน Deep Link ไปยังแอปของคุณในหน้าจอรายละเอียด
คลาสฐานข้อมูลของแอปพลิเคชันอาจกำหนดคอลัมน์ดังนี้
Kotlin
class VideoDatabase { companion object { // The columns we'll include in the video database table val KEY_NAME = SearchManager.SUGGEST_COLUMN_TEXT_1 val KEY_DESCRIPTION = SearchManager.SUGGEST_COLUMN_TEXT_2 val KEY_ICON = SearchManager.SUGGEST_COLUMN_RESULT_CARD_IMAGE val KEY_DATA_TYPE = SearchManager.SUGGEST_COLUMN_CONTENT_TYPE val KEY_IS_LIVE = SearchManager.SUGGEST_COLUMN_IS_LIVE val KEY_VIDEO_WIDTH = SearchManager.SUGGEST_COLUMN_VIDEO_WIDTH val KEY_VIDEO_HEIGHT = SearchManager.SUGGEST_COLUMN_VIDEO_HEIGHT val KEY_AUDIO_CHANNEL_CONFIG = SearchManager.SUGGEST_COLUMN_AUDIO_CHANNEL_CONFIG val KEY_PURCHASE_PRICE = SearchManager.SUGGEST_COLUMN_PURCHASE_PRICE val KEY_RENTAL_PRICE = SearchManager.SUGGEST_COLUMN_RENTAL_PRICE val KEY_RATING_STYLE = SearchManager.SUGGEST_COLUMN_RATING_STYLE val KEY_RATING_SCORE = SearchManager.SUGGEST_COLUMN_RATING_SCORE val KEY_PRODUCTION_YEAR = SearchManager.SUGGEST_COLUMN_PRODUCTION_YEAR val KEY_COLUMN_DURATION = SearchManager.SUGGEST_COLUMN_DURATION val KEY_ACTION = SearchManager.SUGGEST_COLUMN_INTENT_ACTION ... } ... }
Java
public class VideoDatabase { // The columns we'll include in the video database table public static final String KEY_NAME = SearchManager.SUGGEST_COLUMN_TEXT_1; public static final String KEY_DESCRIPTION = SearchManager.SUGGEST_COLUMN_TEXT_2; public static final String KEY_ICON = SearchManager.SUGGEST_COLUMN_RESULT_CARD_IMAGE; public static final String KEY_DATA_TYPE = SearchManager.SUGGEST_COLUMN_CONTENT_TYPE; public static final String KEY_IS_LIVE = SearchManager.SUGGEST_COLUMN_IS_LIVE; public static final String KEY_VIDEO_WIDTH = SearchManager.SUGGEST_COLUMN_VIDEO_WIDTH; public static final String KEY_VIDEO_HEIGHT = SearchManager.SUGGEST_COLUMN_VIDEO_HEIGHT; public static final String KEY_AUDIO_CHANNEL_CONFIG = SearchManager.SUGGEST_COLUMN_AUDIO_CHANNEL_CONFIG; public static final String KEY_PURCHASE_PRICE = SearchManager.SUGGEST_COLUMN_PURCHASE_PRICE; public static final String KEY_RENTAL_PRICE = SearchManager.SUGGEST_COLUMN_RENTAL_PRICE; public static final String KEY_RATING_STYLE = SearchManager.SUGGEST_COLUMN_RATING_STYLE; public static final String KEY_RATING_SCORE = SearchManager.SUGGEST_COLUMN_RATING_SCORE; public static final String KEY_PRODUCTION_YEAR = SearchManager.SUGGEST_COLUMN_PRODUCTION_YEAR; public static final String KEY_COLUMN_DURATION = SearchManager.SUGGEST_COLUMN_DURATION; public static final String KEY_ACTION = SearchManager.SUGGEST_COLUMN_INTENT_ACTION; ...
เมื่อสร้างการแมปจากคอลัมน์ SearchManager ไปยังช่องข้อมูล คุณต้องระบุ _ID เพื่อกำหนดรหัสที่ไม่ซ้ำกันให้กับแต่ละแถวด้วย
Kotlin
companion object { .... private fun buildColumnMap(): Map<String, String> { return mapOf( KEY_NAME to KEY_NAME, KEY_DESCRIPTION to KEY_DESCRIPTION, KEY_ICON to KEY_ICON, KEY_DATA_TYPE to KEY_DATA_TYPE, KEY_IS_LIVE to KEY_IS_LIVE, KEY_VIDEO_WIDTH to KEY_VIDEO_WIDTH, KEY_VIDEO_HEIGHT to KEY_VIDEO_HEIGHT, KEY_AUDIO_CHANNEL_CONFIG to KEY_AUDIO_CHANNEL_CONFIG, KEY_PURCHASE_PRICE to KEY_PURCHASE_PRICE, KEY_RENTAL_PRICE to KEY_RENTAL_PRICE, KEY_RATING_STYLE to KEY_RATING_STYLE, KEY_RATING_SCORE to KEY_RATING_SCORE, KEY_PRODUCTION_YEAR to KEY_PRODUCTION_YEAR, KEY_COLUMN_DURATION to KEY_COLUMN_DURATION, KEY_ACTION to KEY_ACTION, BaseColumns._ID to ("rowid AS " + BaseColumns._ID), SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID to ("rowid AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID), SearchManager.SUGGEST_COLUMN_SHORTCUT_ID to ("rowid AS " + SearchManager.SUGGEST_COLUMN_SHORTCUT_ID) ) } }
Java
... private static HashMap<String, String> buildColumnMap() { HashMap<String, String> map = new HashMap<String, String>(); map.put(KEY_NAME, KEY_NAME); map.put(KEY_DESCRIPTION, KEY_DESCRIPTION); map.put(KEY_ICON, KEY_ICON); map.put(KEY_DATA_TYPE, KEY_DATA_TYPE); map.put(KEY_IS_LIVE, KEY_IS_LIVE); map.put(KEY_VIDEO_WIDTH, KEY_VIDEO_WIDTH); map.put(KEY_VIDEO_HEIGHT, KEY_VIDEO_HEIGHT); map.put(KEY_AUDIO_CHANNEL_CONFIG, KEY_AUDIO_CHANNEL_CONFIG); map.put(KEY_PURCHASE_PRICE, KEY_PURCHASE_PRICE); map.put(KEY_RENTAL_PRICE, KEY_RENTAL_PRICE); map.put(KEY_RATING_STYLE, KEY_RATING_STYLE); map.put(KEY_RATING_SCORE, KEY_RATING_SCORE); map.put(KEY_PRODUCTION_YEAR, KEY_PRODUCTION_YEAR); map.put(KEY_COLUMN_DURATION, KEY_COLUMN_DURATION); map.put(KEY_ACTION, KEY_ACTION); map.put(BaseColumns._ID, "rowid AS " + BaseColumns._ID); map.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, "rowid AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID); map.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, "rowid AS " + SearchManager.SUGGEST_COLUMN_SHORTCUT_ID); return map; } ...
ในตัวอย่างก่อนหน้า ให้สังเกตการแมปกับช่อง SUGGEST_COLUMN_INTENT_DATA_ID ซึ่งเป็นส่วนของ URI ที่ชี้ไปยังเนื้อหาที่ไม่ซ้ำกันสำหรับข้อมูลในแถวนี้ ซึ่งเป็นส่วนสุดท้ายของ URI ที่อธิบายตำแหน่งที่จัดเก็บเนื้อหา ส่วนแรกของ URI,
เมื่อเป็นส่วนที่ใช้ร่วมกันในทุกแถวของตาราง จะตั้งค่าในไฟล์
searchable.xml เป็นแอตทริบิวต์
android:searchSuggestIntentData ตามที่อธิบายไว้ในส่วน
จัดการคำแนะนำการค้นหา
หากส่วนแรกของ URI แตกต่างกันสำหรับแต่ละแถวในตาราง ให้แมปค่านั้นกับช่อง SUGGEST_COLUMN_INTENT_DATA
เมื่อผู้ใช้เลือกเนื้อหานี้ Intent ที่เริ่มทำงานจะแสดงข้อมูล Intent จากการ
รวมกันของ SUGGEST_COLUMN_INTENT_DATA_ID
และแอตทริบิวต์ android:searchSuggestIntentData หรือค่าช่อง
SUGGEST_COLUMN_INTENT_DATA
ระบุข้อมูลคำแนะนำการค้นหา
ใช้ Content Provider
เพื่อแสดงคำแนะนำข้อความค้นหาในกล่องโต้ตอบการค้นหาของ Android TV ระบบจะค้นหา Content Provider เพื่อหาคำแนะนำโดยเรียกใช้เมธอด query() ทุกครั้งที่พิมพ์ตัวอักษร ในการติดตั้งใช้งาน query() Content Provider จะค้นหาข้อมูลคำแนะนำและแสดงผล Cursor ที่ชี้ไปยังแถวที่คุณกำหนดไว้สำหรับคำแนะนำ
Kotlin
fun query(uri: Uri, projection: Array<String>, selection: String, selectionArgs: Array<String>, sortOrder: String): Cursor { // Use the UriMatcher to see what kind of query we have and format the db query accordingly when (URI_MATCHER.match(uri)) { SEARCH_SUGGEST -> { Log.d(TAG, "search suggest: ${selectionArgs[0]} URI: $uri") if (selectionArgs == null) { throw IllegalArgumentException( "selectionArgs must be provided for the Uri: $uri") } return getSuggestions(selectionArgs[0]) } else -> throw IllegalArgumentException("Unknown Uri: $uri") } } private fun getSuggestions(query: String): Cursor { val columns = arrayOf<String>( BaseColumns._ID, VideoDatabase.KEY_NAME, VideoDatabase.KEY_DESCRIPTION, VideoDatabase.KEY_ICON, VideoDatabase.KEY_DATA_TYPE, VideoDatabase.KEY_IS_LIVE, VideoDatabase.KEY_VIDEO_WIDTH, VideoDatabase.KEY_VIDEO_HEIGHT, VideoDatabase.KEY_AUDIO_CHANNEL_CONFIG, VideoDatabase.KEY_PURCHASE_PRICE, VideoDatabase.KEY_RENTAL_PRICE, VideoDatabase.KEY_RATING_STYLE, VideoDatabase.KEY_RATING_SCORE, VideoDatabase.KEY_PRODUCTION_YEAR, VideoDatabase.KEY_COLUMN_DURATION, VideoDatabase.KEY_ACTION, SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID ) return videoDatabase.getWordMatch(query.toLowerCase(), columns) }
Java
@Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // Use the UriMatcher to see what kind of query we have and format the db query accordingly switch (URI_MATCHER.match(uri)) { case SEARCH_SUGGEST: Log.d(TAG, "search suggest: " + selectionArgs[0] + " URI: " + uri); if (selectionArgs == null) { throw new IllegalArgumentException( "selectionArgs must be provided for the Uri: " + uri); } return getSuggestions(selectionArgs[0]); default: throw new IllegalArgumentException("Unknown Uri: " + uri); } } private Cursor getSuggestions(String query) { query = query.toLowerCase(); String[] columns = new String[]{ BaseColumns._ID, VideoDatabase.KEY_NAME, VideoDatabase.KEY_DESCRIPTION, VideoDatabase.KEY_ICON, VideoDatabase.KEY_DATA_TYPE, VideoDatabase.KEY_IS_LIVE, VideoDatabase.KEY_VIDEO_WIDTH, VideoDatabase.KEY_VIDEO_HEIGHT, VideoDatabase.KEY_AUDIO_CHANNEL_CONFIG, VideoDatabase.KEY_PURCHASE_PRICE, VideoDatabase.KEY_RENTAL_PRICE, VideoDatabase.KEY_RATING_STYLE, VideoDatabase.KEY_RATING_SCORE, VideoDatabase.KEY_PRODUCTION_YEAR, VideoDatabase.KEY_COLUMN_DURATION, VideoDatabase.KEY_ACTION, SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID }; return videoDatabase.getWordMatch(query, columns); } ...
ในไฟล์ Manifest Content Provider จะได้รับการจัดการเป็นพิเศษ โดยจะอธิบายเป็น
<provider>แทนที่จะติดแท็กเป็นกิจกรรม Provider จะมีแอตทริบิวต์ android:authorities เพื่อบอกระบบถึงเนมสเปซของ Content Provider นอกจากนี้ คุณต้องตั้งค่าแอตทริบิวต์ android:exported เป็น "true" เพื่อให้การค้นหาส่วนกลางของ Android ใช้ผลการค้นหาที่แสดงจาก Content Provider ได้
<provider android:name="com.example.android.tvleanback.VideoContentProvider" android:authorities="com.example.android.tvleanback" android:exported="true" />
จัดการคำแนะนำการค้นหา
แอปของคุณต้องมีไฟล์
res/xml/searchable.xml เพื่อกำหนดค่าการตั้งค่าคำแนะนำการค้นหา
ในไฟล์ res/xml/searchable.xml ให้ใส่แอตทริบิวต์
android:searchSuggestAuthority เพื่อบอกระบบถึงเนมสเปซของ Content Provider ค่านี้ต้องตรงกับค่าสตริงที่คุณระบุใน
android:authorities
แอตทริบิวต์ขององค์ประกอบ <provider>
ในไฟล์ AndroidManifest.xml
นอกจากนี้ ให้ใส่ ป้ายกำกับ ซึ่งเป็นชื่อของแอปพลิเคชันด้วย การตั้งค่าการค้นหาของระบบจะใช้ป้ายกำกับนี้เมื่อแสดงรายการแอปที่ค้นหาได้
ไฟล์ searchable.xml ต้องมี
android:searchSuggestIntentAction ที่มีค่า "android.intent.action.VIEW"
เพื่อกำหนดการดำเนินการผ่าน Intent สำหรับการแสดงคำแนะนำที่กำหนดเอง ซึ่งแตกต่างจากการดำเนินการ Intent
สำหรับการแสดงข้อความค้นหาตามที่อธิบายไว้ในส่วนถัดไป
ดูวิธีอื่นๆ ในการประกาศการดำเนินการผ่าน Intent สำหรับคำแนะนำได้ที่
หัวข้อ Declaring the
intent action
แอปของคุณต้องแสดงข้อมูล Intent พร้อมกับการดำเนินการผ่าน Intent ซึ่งคุณระบุด้วยแอตทริบิวต์
android:searchSuggestIntentData ข้อมูลนี้เป็นส่วนแรกของ URI ที่ชี้ไปยังเนื้อหา ซึ่งอธิบายส่วนของ URI ที่ใช้ร่วมกันในทุกแถวของตารางการแมปสำหรับเนื้อหานั้น ส่วนของ URI ที่ไม่ซ้ำกันสำหรับแต่ละแถวจะกำหนดด้วยช่อง SUGGEST_COLUMN_INTENT_DATA_ID ตามที่อธิบายไว้ในส่วน
ระบุคอลัมน์
ดูวิธีอื่นๆ ในการประกาศข้อมูล Intent สำหรับคำแนะนำได้ที่หัวข้อ
Declaring
the intent data
แอตทริบิวต์ android:searchSuggestSelection=" ?" จะระบุค่าที่ส่งเป็นพารามิเตอร์ selection ของเมธอด query() ระบบจะแทนที่ค่าเครื่องหมายคำถาม (?) ด้วยข้อความค้นหา
สุดท้าย คุณต้องใส่แอตทริบิวต์
android:includeInGlobalSearch ที่มีค่า "true" ด้วย ตัวอย่างไฟล์ searchable.xml มีดังนี้
<searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/search_label" android:hint="@string/search_hint" android:searchSettingsDescription="@string/settings_description" android:searchSuggestAuthority="com.example.android.tvleanback" android:searchSuggestIntentAction="android.intent.action.VIEW" android:searchSuggestIntentData="content://com.example.android.tvleanback/video_database_leanback" android:searchSuggestSelection=" ?" android:searchSuggestThreshold="1" android:includeInGlobalSearch="true"> </searchable>
จัดการข้อความค้นหา
ทันทีที่กล่องโต้ตอบการค้นหามีคำที่ตรงกับค่าในคอลัมน์ใดคอลัมน์หนึ่งของแอปตามที่
อธิบายไว้ในส่วนระบุคอลัมน์ ระบบจะเริ่มทำงาน Intent
ACTION_SEARCH
กิจกรรมในแอปที่จัดการ Intent นั้นจะค้นหาที่เก็บข้อมูลสำหรับคอลัมน์ที่มีคำที่ระบุในค่าของคอลัมน์ และแสดงผลรายการเนื้อหาที่มีคอลัมน์เหล่านั้น ในไฟล์ AndroidManifest.xml คุณกำหนดกิจกรรมที่จัดการ Intent ACTION_SEARCH ดังที่แสดงในตัวอย่างต่อไปนี้
... <activity android:name="com.example.android.tvleanback.DetailsActivity" android:exported="true"> <!-- Receives the search request. --> <intent-filter> <action android:name="android.intent.action.SEARCH" /> <!-- No category needed, because the Intent will specify this class component --> </intent-filter> <!-- Points to searchable meta data. --> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> ... <!-- Provides search suggestions for keywords against video meta data. --> <provider android:name="com.example.android.tvleanback.VideoContentProvider" android:authorities="com.example.android.tvleanback" android:exported="true" /> ...
กิจกรรมต้องอธิบายการกำหนดค่าที่ค้นหาได้ด้วยการอ้างอิงไฟล์
searchable.xml
หากต้องการใช้กล่องโต้ตอบการค้นหาส่วนกลาง,
ไฟล์ Manifest ต้องอธิบายกิจกรรมที่จะรับคำค้นหา นอกจากนี้ ไฟล์ Manifest ต้อง
อธิบายองค์ประกอบ <provider>
ตามที่อธิบายไว้ในไฟล์ searchable.xml ทุกประการ
Deep Link ไปยังแอปของคุณในหน้าจอรายละเอียด
หากคุณตั้งค่าการค้นหาตามที่อธิบายไว้ในส่วนจัดการคำแนะนำ และแมปช่องSUGGEST_COLUMN_TEXT_1,
SUGGEST_COLUMN_PRODUCTION_YEAR, และ
SUGGEST_COLUMN_DURATION ตามที่อธิบายไว้ใน
ส่วนระบุคอลัมน์
Deep Link ไปยังการดำเนินการดูเนื้อหาจะปรากฏในหน้าจอรายละเอียดที่เปิดขึ้นเมื่อ
ผู้ใช้เลือกผลการค้นหา
เมื่อผู้ใช้เลือกลิงก์สำหรับแอปของคุณ ซึ่งระบุด้วยปุ่ม **พร้อมให้บริการใน** ใน
หน้าจอรายละเอียด ระบบจะเปิดกิจกรรมที่จัดการ ACTION_VIEW
ซึ่งตั้งค่าเป็น
android:searchSuggestIntentAction ที่มีค่า "android.intent.action.VIEW" ใน
ไฟล์ searchable.xml
นอกจากนี้ คุณยังตั้งค่า Intent ที่กำหนดเองเพื่อเปิดกิจกรรมได้ด้วย ซึ่งแสดงให้เห็นใน
แอปตัวอย่าง Leanback
. โปรดทราบว่าแอปตัวอย่างจะเปิด LeanbackDetailsFragment ของตัวเองเพื่อแสดงรายละเอียดของสื่อที่เลือก ในแอปของคุณ ให้เปิดกิจกรรมที่เล่นสื่อทันทีเพื่อช่วยให้ผู้ใช้ไม่ต้องคลิกเพิ่มอีก 1-2 ครั้ง
พฤติกรรมการค้นหา
การค้นหามีให้บริการใน Android TV จากหน้าจอหลักและจากภายในแอป ผลการค้นหาจะแตกต่างกันใน 2 กรณีนี้
ค้นหาจากหน้าจอหลัก
เมื่อผู้ใช้ค้นหาจากหน้าจอหลัก ผลการค้นหาแรกจะปรากฏในการ์ดเอนทิตี หากมีแอปที่เล่นเนื้อหาได้ ลิงก์ไปยังแอปแต่ละแอปจะปรากฏที่ด้านล่างของการ์ด
คุณไม่สามารถวางแอปในการ์ดเอนทิตีโดยใช้โปรแกรมได้ ผลการค้นหาของแอปต้องตรงกับชื่อ ปี และระยะเวลาของเนื้อหาที่ค้นหาเพื่อให้รวมเป็นตัวเลือกการเล่นได้
ผลการค้นหาเพิ่มเติมอาจปรากฏอยู่ใต้การ์ด ผู้ใช้ต้องกดลงบนรีโมตและเลื่อนเพื่อดูผลการค้นหา ผลการค้นหาสำหรับแต่ละแอปจะปรากฏในแถวที่แยกต่างหาก คุณไม่สามารถควบคุมการจัดลำดับแถวได้ ระบบจะแสดงแอปที่รองรับ การดำเนินการดูเนื้อหาก่อน
ค้นหาจากแอป
ผู้ใช้ยังเริ่มการค้นหาจากภายในแอปได้ด้วยการเริ่มใช้ไมโครโฟนจากรีโมตหรือคอนโทรลเลอร์เกมแพด ผลการค้นหาจะแสดงในแถวเดียวที่ด้านบนของเนื้อหาแอป แอปจะสร้างผลการค้นหาโดยใช้ผู้ให้บริการการค้นหาส่วนกลางของตัวเอง
ดูข้อมูลเพิ่มเติม
หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการค้นหาแอปทีวี โปรดอ่าน หัวข้อผสานรวมฟีเจอร์การค้นหาของ Android เข้ากับแอป และ เพิ่มฟังก์ชันการค้นหา
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีปรับแต่งประสบการณ์การค้นหาในแอปด้วย SearchFragment ได้ที่หัวข้อ
Search within TV apps