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

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

Deep Link ในหน้าจอรายละเอียด
รูปที่ 1 Deep Link ในหน้าจอรายละเอียด

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

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

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

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

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

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

การเล่นผลการค้นหาในทีวี
รูปที่ 2 ผลการค้นหาจากการค้นหาในหน้าจอหลัก

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

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

ผลการค้นหารายการทีวีเพิ่มเติม
รูปที่ 3 การดูผลการค้นหาเพิ่มเติม

ค้นหาจากแอป

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

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

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

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

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