ทำให้แอปทีวีค้นหาได้

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 ช่องตามที่อธิบายไว้ใน ส่วนระบุคอลัมน์ ลิงก์ในรายละเอียดไปยังการดำเนินการรับชมสำหรับเนื้อหาของคุณจะปรากฏในหน้าจอรายละเอียดที่เปิดขึ้นเมื่อ ผู้ใช้เลือกผลการค้นหา

ลิงก์ในรายละเอียดในหน้าจอรายละเอียด

เมื่อผู้ใช้เลือกลิงก์สำหรับแอปของคุณ ซึ่งระบุโดยปุ่ม **พร้อมใช้งาน** ใน ระบบจะเปิดกิจกรรมที่จัดการ ACTION_VIEW ตั้งค่าเป็น android:searchSuggestIntentAction ที่มีค่า "android.intent.action.VIEW" ใน ไฟล์ searchable.xml

คุณยังตั้งค่าความตั้งใจที่กำหนดเองเพื่อเริ่มกิจกรรมได้ด้วย ซึ่งแสดงให้เห็นใน แอปตัวอย่าง Leanback ที่ใช้เวลาเพียง 2 นาที โปรดทราบว่าแอปตัวอย่างจะเปิดตัว LeanbackDetailsFragment ของตนเองเพื่อ แสดงรายละเอียดของสื่อที่เลือก ในแอปของคุณ ให้เปิดกิจกรรมที่เล่นสื่อ ทันทีเพื่อบันทึกผู้ใช้อีกคลิกหนึ่งหรือสองคลิก

พฤติกรรมการค้นหา

การค้นหาใน Android TV พร้อมใช้งานจากหน้าจอหลักและจากภายในแอป ผลการค้นหา จะต่างกันใน 2 กรณีนี้

ค้นหาจากหน้าจอหลัก

เมื่อผู้ใช้ค้นหาจากหน้าจอหลัก ผลลัพธ์แรกจะปรากฏในการ์ดเอนทิตี หากมี แอปที่สามารถเล่นเนื้อหานั้นได้ ลิงก์ไปยังแต่ละแอปจะแสดงที่ด้านล่างของการ์ด

การเล่นผลการค้นหาทีวี

วางแอปลงในการ์ดเอนทิตีแบบเป็นโปรแกรมไม่ได้ เพื่อรวมเป็น ตัวเลือกการเล่น ผลการค้นหาของแอปจะต้องตรงกับชื่อ ปี และระยะเวลาของ เนื้อหาที่ค้นหา

อาจมีผลการค้นหาเพิ่มเติมอยู่ใต้การ์ด ผู้ใช้ต้องกดลูกศรลง จากระยะไกลและเลื่อนลง ผลลัพธ์ของแต่ละแอปจะปรากฏในแถวแยกกัน คุณไม่สามารถควบคุม การเรียงลำดับแถว แอปที่รองรับ การดำเนินการรับชมจะแสดงขึ้นก่อน

ผลการค้นหารายการทีวี

ค้นหาจากแอปของคุณ

นอกจากนี้ ผู้ใช้ยังเริ่มการค้นหาจากภายในแอปได้โดยการเริ่มใช้ไมโครโฟนจากรีโมตหรือ ตัวควบคุมแพดเกม ผลการค้นหาจะแสดงในแถวเดียวที่ด้านบนของเนื้อหาแอป แอปของคุณสร้างผลการค้นหาโดยใช้ผู้ให้บริการค้นหาทั่วโลกของตนเอง

ผลการค้นหาในแอปทางทีวี

ดูข้อมูลเพิ่มเติม

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการค้นหาแอป TV โปรดอ่าน ผสานรวมฟีเจอร์การค้นหาของ Android ในแอปของคุณ และ เพิ่มฟังก์ชันการค้นหา

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีปรับแต่งประสบการณ์การค้นหาในแอปด้วย SearchFragment โปรดอ่าน ค้นหาภายในแอป TV