Android TV ใช้อินเทอร์เฟซการค้นหาของ Android เพื่อดึงข้อมูลเนื้อหาจากแอปที่ติดตั้ง และส่งผลการค้นหาให้ผู้ใช้ แอปของคุณ ข้อมูลเนื้อหาอาจรวมอยู่ในผลการค้นหาเหล่านี้เพื่อให้ผู้ใช้สามารถเข้าถึงเนื้อหาใน แอปของคุณ
แอปของคุณต้องให้ Android TV มีช่องข้อมูลที่ Android TV สามารถสร้างการค้นหาที่แนะนำได้
เมื่อผู้ใช้ป้อนอักขระในกล่องโต้ตอบการค้นหา ในการทำเช่นนั้น แอปของคุณต้องใช้
ผู้ให้บริการเนื้อหาที่ให้บริการ
คำแนะนำขึ้นพร้อมกับ
ไฟล์การกำหนดค่า searchable.xml
ที่อธิบายเนื้อหา
และข้อมูลสำคัญอื่นๆ สำหรับ Android TV นอกจากนี้ คุณจะต้องมีกิจกรรมที่จัดการ
ที่จะเริ่มทำงานเมื่อผู้ใช้เลือกผลการค้นหาที่แนะนำ สำหรับ
โปรดดูรายละเอียดเพิ่มเติมที่เพิ่ม
การแนะนำการค้นหาที่กำหนดเอง คู่มือนี้ครอบคลุมประเด็นหลักสำหรับแอป Android TV โดยเฉพาะ
ก่อนอ่านคู่มือนี้ อย่าลืมทำความคุ้นเคยกับแนวคิดที่อธิบายไว้ใน คู่มือ Search API และโปรดอ่านเพิ่มฟังก์ชันการค้นหา
โค้ดตัวอย่างในคู่มือนี้มาจาก แอปตัวอย่าง Leanback ที่ใช้เวลาเพียง 2 นาที
ระบุคอลัมน์
SearchManager
อธิบายช่องข้อมูลที่คาดไว้โดยแสดงช่องเหล่านั้นเป็น
ของฐานข้อมูลในเครื่อง ไม่ว่าข้อมูลจะเป็นรูปแบบใด คุณต้องแมปฟิลด์ข้อมูลกับ
ซึ่งมักจะอยู่ในคลาสที่เข้าถึงข้อมูลเนื้อหาของคุณ สําหรับข้อมูลเกี่ยวกับการสร้าง
คลาสที่แมปข้อมูลที่มีอยู่ของคุณกับฟิลด์ที่จำเป็น โปรดดู
การสร้างตารางคำแนะนำ
คลาส 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 ไปยังแอปของคุณในรายละเอียด เพื่อดูเนื้อหา รวมถึงลิงก์ไปยังแอปพลิเคชันของผู้ให้บริการรายอื่น ประเด็นนี้มีการกล่าวถึงเพิ่มเติมใน ส่วนลิงก์ในรายละเอียดที่ไปยังแอปของคุณในหน้าจอรายละเอียด
คลาสฐานข้อมูลของแอปพลิเคชันของคุณอาจกำหนดคอลัมน์ดังนี้
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(): MapS<tring, 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
ระบุข้อมูลการแนะนำการค้นหา
ใช้ผู้ให้บริการเนื้อหา
เพื่อแสดงการแนะนำข้อความค้นหาในกล่องโต้ตอบการค้นหาของ Android TV ระบบจะค้นหาเนื้อหาของคุณ
ผู้ให้บริการเครือข่ายเพื่อขอคำแนะนำโดยการเรียกใช้เมธอด query()
ทุกครั้ง
มีการพิมพ์ข้อความตัวอักษร ในการใช้งาน query()
เนื้อหาของคุณ
ผู้ให้บริการค้นหาข้อมูลคำแนะนำของคุณและแสดง 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 ผู้ให้บริการเนื้อหาจะได้รับการดำเนินการเป็นพิเศษ แทนที่จะเป็น
ติดแท็กเป็นกิจกรรม ซึ่งอธิบายว่าเป็น
<provider>
จะมีแอตทริบิวต์ android:authorities
เพื่อบอกระบบว่า
ของผู้ให้บริการเนื้อหา นอกจากนี้ คุณต้องตั้งค่าแอตทริบิวต์ android:exported
เป็น
"true"
เพื่อให้การค้นหาทั่วโลกของ Android ใช้ผลลัพธ์ที่ได้จากการค้นหาได้
<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 แล้ว แอปต้องระบุข้อมูล Intent ซึ่งคุณระบุด้วย
android:searchSuggestIntentData
นี่คือส่วนแรกของ URI ที่ชี้
ในเนื้อหา ซึ่งจะอธิบายถึงส่วนของ URI ร่วมของทุกแถวในตารางการแมป
เนื้อหา ส่วนของ URI ที่ไม่ซ้ำกันสำหรับแต่ละแถวนั้นสร้างขึ้นด้วยช่อง SUGGEST_COLUMN_INTENT_DATA_ID
ตามที่อธิบายไว้ในส่วนระบุคอลัมน์
ดูวิธีการอื่นๆ ในการประกาศข้อมูลความตั้งใจสำหรับคำแนะนำได้ที่
การประกาศ
ข้อมูล Intent
แอตทริบิวต์ 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
คุณกำหนด
กิจกรรมที่จัดการ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
ช่องตามที่อธิบายไว้ใน
ส่วนระบุคอลัมน์
ลิงก์ในรายละเอียดไปยังการดำเนินการรับชมสำหรับเนื้อหาของคุณจะปรากฏในหน้าจอรายละเอียดที่เปิดขึ้นเมื่อ
ผู้ใช้เลือกผลการค้นหา
![ลิงก์ในรายละเอียดในหน้าจอรายละเอียด](https://developer.android.com/static/images/tv/deep-link.png?authuser=4&hl=th)
เมื่อผู้ใช้เลือกลิงก์สำหรับแอปของคุณ ซึ่งระบุโดยปุ่ม **พร้อมใช้งาน** ใน
ระบบจะเปิดกิจกรรมที่จัดการ ACTION_VIEW
ตั้งค่าเป็น
android:searchSuggestIntentAction
ที่มีค่า "android.intent.action.VIEW"
ใน
ไฟล์ searchable.xml
คุณยังตั้งค่าความตั้งใจที่กำหนดเองเพื่อเริ่มกิจกรรมได้ด้วย ซึ่งแสดงให้เห็นใน
แอปตัวอย่าง Leanback
ที่ใช้เวลาเพียง 2 นาที โปรดทราบว่าแอปตัวอย่างจะเปิดตัว LeanbackDetailsFragment
ของตนเองเพื่อ
แสดงรายละเอียดของสื่อที่เลือก ในแอปของคุณ ให้เปิดกิจกรรมที่เล่นสื่อ
ทันทีเพื่อบันทึกผู้ใช้อีกคลิกหนึ่งหรือสองคลิก
พฤติกรรมการค้นหา
การค้นหาใน Android TV พร้อมใช้งานจากหน้าจอหลักและจากภายในแอป ผลการค้นหา จะต่างกันใน 2 กรณีนี้
ค้นหาจากหน้าจอหลัก
เมื่อผู้ใช้ค้นหาจากหน้าจอหลัก ผลลัพธ์แรกจะปรากฏในการ์ดเอนทิตี หากมี แอปที่สามารถเล่นเนื้อหานั้นได้ ลิงก์ไปยังแต่ละแอปจะแสดงที่ด้านล่างของการ์ด
![การเล่นผลการค้นหาทีวี](https://developer.android.com/static/images/tv/tv-search-playback.png?authuser=4&hl=th)
วางแอปลงในการ์ดเอนทิตีแบบเป็นโปรแกรมไม่ได้ เพื่อรวมเป็น ตัวเลือกการเล่น ผลการค้นหาของแอปจะต้องตรงกับชื่อ ปี และระยะเวลาของ เนื้อหาที่ค้นหา
อาจมีผลการค้นหาเพิ่มเติมอยู่ใต้การ์ด ผู้ใช้ต้องกดลูกศรลง จากระยะไกลและเลื่อนลง ผลลัพธ์ของแต่ละแอปจะปรากฏในแถวแยกกัน คุณไม่สามารถควบคุม การเรียงลำดับแถว แอปที่รองรับ การดำเนินการรับชมจะแสดงขึ้นก่อน
![ผลการค้นหารายการทีวี](https://developer.android.com/static/images/tv/tv-search-results.gif?authuser=4&hl=th)
ค้นหาจากแอปของคุณ
นอกจากนี้ ผู้ใช้ยังเริ่มการค้นหาจากภายในแอปได้โดยการเริ่มใช้ไมโครโฟนจากรีโมตหรือ ตัวควบคุมแพดเกม ผลการค้นหาจะแสดงในแถวเดียวที่ด้านบนของเนื้อหาแอป แอปของคุณสร้างผลการค้นหาโดยใช้ผู้ให้บริการค้นหาทั่วโลกของตนเอง
![ผลการค้นหาในแอปทางทีวี](https://developer.android.com/static/images/tv/tv-search-in-app.png?authuser=4&hl=th)
ดูข้อมูลเพิ่มเติม
หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการค้นหาแอป TV โปรดอ่าน ผสานรวมฟีเจอร์การค้นหาของ Android ในแอปของคุณ และ เพิ่มฟังก์ชันการค้นหา
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีปรับแต่งประสบการณ์การค้นหาในแอปด้วย SearchFragment
โปรดอ่าน
ค้นหาภายในแอป TV