ช่องต่างๆ ในหน้าจอหลัก

หน้าจอหลักของ Android TV หรือเรียกง่ายๆ ว่าหน้าจอหลัก มี UI ที่ แสดงเนื้อหาที่แนะนำเป็นตารางที่แสดงแชแนลและโปรแกรม แต่ละแถวคือช่อง ช่องประกอบด้วยการ์ดสำหรับทุกโปรแกรมที่มีอยู่ในช่องนั้น

หน้าจอหลักของทีวี

เอกสารนี้แสดงวิธีเพิ่มช่องและโปรแกรมลงในหน้าจอหลัก อัปเดตเนื้อหา จัดการการดำเนินการของผู้ใช้ และมอบประสบการณ์การใช้งานที่ดีที่สุดให้แก่ผู้ใช้ของคุณ (หากต้องการเจาะลึกเกี่ยวกับ API ให้ลอง Codelab หน้าจอหลัก และดูเซสชัน Android TV ในงาน I/O 2017)

หมายเหตุ: ช่องทางแนะนำมีให้บริการเฉพาะในภาษา Android 8.0 (API ระดับ 26) ขึ้นไป คุณต้องใช้ส่วนขยายดังกล่าวเพื่อจัดหา คำแนะนำสำหรับแอปที่ทำงานใน Android 8.0 (API ระดับ 26) ขึ้นไป ถึง ให้คำแนะนำสำหรับแอปที่ทำงานใน Android เวอร์ชันก่อนหน้า แอปของคุณ ต้องใช้เมธอด แถวคำแนะนำ แทน

UI หน้าจอหลัก

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

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

ช่องแนะนำให้รับชม

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

ช่องทางของแอป

แชแนลที่แอปของคุณสร้างขึ้นทั้งหมดจะเป็นไปตามวงจรชีวิตนี้

  1. ผู้ใช้ค้นพบช่องในแอปของคุณและขอเพิ่มช่องดังกล่าวในหน้าจอหลัก
  2. แอปสร้างช่องและเพิ่มลงใน TvProvider (ณ จุดนี้ ช่องจะไม่ปรากฏ)
  3. แอปขอให้ระบบแสดงช่อง
  4. ระบบขอให้ผู้ใช้อนุมัติช่องใหม่
  5. ช่องใหม่จะปรากฏในแถวสุดท้ายของหน้าจอหลัก

ช่องเริ่มต้น

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

สิ่งที่ต้องมีก่อน

หน้าจอหลักของ Android TV ใช้ API ของ TvProvider ของ Android เพื่อจัดการช่องและโปรแกรมที่แอปของคุณสร้างขึ้น หากต้องการเข้าถึงข้อมูลของผู้ให้บริการ ให้เพิ่มสิทธิ์ต่อไปนี้ลงในไฟล์ Manifest ของแอป

<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />

ไลบรารีการสนับสนุน TvProvider ช่วยให้คุณใช้ผู้ให้บริการได้ง่ายขึ้น เพิ่มค่าดังกล่าวลงในทรัพยากร Dependency ในไฟล์ build.gradle ดังนี้

ดึงดูด

implementation 'androidx.tvprovider:tvprovider:1.0.0'

Kotlin

implementation("androidx.tvprovider:tvprovider:1.0.0")

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

Kotlin

import android.support.media.tv.Channel
import android.support.media.tv.TvContractCompat
import android.support.media.tv.ChannelLogoUtils
import android.support.media.tv.PreviewProgram
import android.support.media.tv.WatchNextProgram

Java

import android.support.media.tv.Channel;
import android.support.media.tv.TvContractCompat;
import android.support.media.tv.ChannelLogoUtils;
import android.support.media.tv.PreviewProgram;
import android.support.media.tv.WatchNextProgram;

ช่อง

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

การสร้างช่อง

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

หากต้องการสร้างช่อง ให้ทำตามขั้นตอนต่อไปนี้

  1. สร้างเครื่องมือสร้างช่องและตั้งค่าแอตทริบิวต์ โปรดทราบว่า ประเภทแชแนลต้องเป็น TYPE_PREVIEW เพิ่มอีก attribute ตามที่กำหนด

    Kotlin

    val builder = Channel.Builder()
    // Every channel you create must have the type TYPE_PREVIEW
    builder.setType(TvContractCompat.Channels.TYPE_PREVIEW)
            .setDisplayName("Channel Name")
            .setAppLinkIntentUri(uri)
    

    Java

    Channel.Builder builder = new Channel.Builder();
    // Every channel you create must have the type TYPE_PREVIEW
    builder.setType(TvContractCompat.Channels.TYPE_PREVIEW)
            .setDisplayName("Channel Name")
            .setAppLinkIntentUri(uri);
    
  2. แทรกช่องลงในผู้ให้บริการโดยทำดังนี้

    Kotlin

    var channelUri = context.contentResolver.insert(
            TvContractCompat.Channels.CONTENT_URI, builder.build().toContentValues())
    

    Java

    Uri channelUri = context.getContentResolver().insert(
            TvContractCompat.Channels.CONTENT_URI, builder.build().toContentValues());
    
  3. คุณต้องบันทึกรหัสช่องเพื่อเพิ่มรายการลงในช่อง ในภายหลัง ดึงรหัสช่องจาก URI ที่แสดงผลด้วยคำสั่งต่อไปนี้

    Kotlin

    var channelId = ContentUris.parseId(channelUri)
    

    Java

    long channelId = ContentUris.parseId(channelUri);
    
  4. คุณต้องเพิ่มโลโก้สำหรับช่อง โปรดใช้ Uri หรือ Bitmap โลโก้ ควรมีขนาด 80dp x 80dp และต้องเป็นสีทึบ โดยจะแสดงภายใต้ มาสก์วงกลม:

    มาสก์ไอคอนหน้าจอหลักของทีวี

    Kotlin

    // Choose one or the other
    storeChannelLogo(context: Context, channelId: Long, logoUri: Uri) // also works if logoUri is a URL
    storeChannelLogo(context: Context, channelId: Long, logo: Bitmap)
    

    Java

    // Choose one or the other
    storeChannelLogo(Context context, long channelId, Uri logoUri); // also works if logoUri is a URL
    storeChannelLogo(Context context, long channelId, Bitmap logo);
    
  5. สร้างแชแนลเริ่มต้น (ไม่บังคับ): เมื่อแอปของคุณสร้างช่องแรก คุณก็สามารถทำให้ช่อง ช่องเริ่มต้นเพื่อให้ปรากฏในหน้าแรก ทันทีโดยที่ผู้ใช้ไม่ต้องดำเนินการใดๆ ช่องอื่นๆ ที่คุณสร้าง ไม่ปรากฏจนกว่าผู้ใช้จะ เลือก

    Kotlin

    TvContractCompat.requestChannelBrowsable(context, channelId)
    

    Java

    TvContractCompat.requestChannelBrowsable(context, channelId);
    

  6. ทำให้ช่องเริ่มต้นปรากฏขึ้นก่อนที่แอปจะเปิด คุณสามารถ ทำให้ลักษณะการทำงานนี้เกิดขึ้นโดยการเพิ่ม BroadcastReceiver ที่รอฟังฟังก์ชัน android.media.tv.action.INITIALIZE_PROGRAMS ซึ่งหน้าจอหลัก ส่งหลังจากติดตั้งแอปแล้ว
    <receiver
      android:name=".RunOnInstallReceiver"
      android:exported="true">
        <intent-filter>
          <action android:name="android.media.tv.action.INITIALIZE_PROGRAMS" />
          <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
    
    เมื่อโหลดแอปจากแหล่งที่ไม่รู้จักระหว่างการพัฒนา คุณทดสอบขั้นตอนนี้ได้โดยทำดังนี้ กระตุ้นความตั้งใจผ่าน adb โดยที่ your.package.name/.YourReceiverName คือแอปของคุณ BroadcastReceiver:

    adb shell am broadcast -a android.media.tv.action.INITIALIZE_PROGRAMS -n \
        your.package.name/.YourReceiverName
    

    ในบางกรณีที่เกิดขึ้นไม่บ่อยนัก แอปอาจได้รับการออกอากาศในเวลาเดียวกัน เริ่มต้นแอป ตรวจสอบว่ารหัสไม่ได้พยายามเพิ่มช่องเริ่มต้น มากกว่า 1 ครั้ง

การอัปเดตช่อง

การอัปเดตช่องจะคล้ายกับการสร้างช่องเหล่านั้น

ใช้ Channel.Builder อื่นเพื่อตั้งค่าแอตทริบิวต์ที่ต้องเปลี่ยนแปลง

ใช้ ContentResolver เพื่ออัปเดตช่อง ใช้รหัสช่องที่คุณบันทึกไว้เมื่อตอนเพิ่มช่องในตอนแรก

Kotlin

context.contentResolver.update(
        TvContractCompat.buildChannelUri(channelId),
        builder.build().toContentValues(),
        null,
        null
)

Java

context.getContentResolver().update(TvContractCompat.buildChannelUri(channelId),
    builder.build().toContentValues(), null, null);

หากต้องการอัปเดตโลโก้ของช่อง ให้ใช้ storeChannelLogo()

การลบช่อง

Kotlin

context.contentResolver.delete(TvContractCompat.buildChannelUri(channelId), null, null)

Java

context.getContentResolver().delete(TvContractCompat.buildChannelUri(channelId), null, null);

โปรแกรม

การเพิ่มรายการลงในช่องของแอป

สร้าง PreviewProgram.Builder และตั้งค่าแอตทริบิวต์ ดังนี้

Kotlin

val builder = PreviewProgram.Builder()
builder.setChannelId(channelId)
        .setType(TvContractCompat.PreviewPrograms.TYPE_CLIP)
        .setTitle("Title")
        .setDescription("Program description")
        .setPosterArtUri(uri)
        .setIntentUri(uri)
        .setInternalProviderId(appProgramId)

Java

PreviewProgram.Builder builder = new PreviewProgram.Builder();
builder.setChannelId(channelId)
        .setType(TvContractCompat.PreviewPrograms.TYPE_CLIP)
        .setTitle("Title")
        .setDescription("Program description")
        .setPosterArtUri(uri)
        .setIntentUri(uri)
        .setInternalProviderId(appProgramId);

เพิ่มแอตทริบิวต์เพิ่มเติมโดยขึ้นอยู่กับประเภทโปรแกรม (หากต้องการดูแอตทริบิวต์ ที่ใช้ได้กับรายการแต่ละประเภท โปรดดูตารางด้านล่าง)

แทรกโปรแกรมในผู้ให้บริการ

Kotlin

var programUri = context.contentResolver.insert(TvContractCompat.PreviewPrograms.CONTENT_URI,
        builder.build().toContentValues())

Java

Uri programUri = context.getContentResolver().insert(TvContractCompat.PreviewPrograms.CONTENT_URI,
      builder.build().toContentValues());

เรียกข้อมูลรหัสโปรแกรมเพื่อใช้อ้างอิงในภายหลัง:

Kotlin

val programId = ContentUris.parseId(programUri)

Java

long programId = ContentUris.parseId(programUri);

การเพิ่มรายการลงในช่องแนะนำให้รับชม

หากต้องการแทรกรายการลงในช่องแนะนำให้รับชม โปรดดูเพิ่มรายการไปยังช่องแนะนำให้รับชม ช่องถัดไป

การอัปเดตโปรแกรม

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

ใช้ PreviewProgram.Builder เพื่อตั้งค่าแอตทริบิวต์ที่ต้องการเปลี่ยนแปลง จากนั้นโทรไปที่ getContentResolver().update เพื่ออัปเดตโปรแกรม ระบุรหัสโปรแกรมที่คุณบันทึกไว้ตอนที่เพิ่มโปรแกรมไว้ในตอนแรก

Kotlin

context.contentResolver.update(
        TvContractCompat.buildPreviewProgramUri(programId),
                builder.build().toContentValues(), null, null
)

Java

context.getContentResolver().update(TvContractCompat.buildPreviewProgramUri(programId),
    builder.build().toContentValues(), null, null);

การลบโปรแกรม

Kotlin

context.contentResolver
        .delete(TvContractCompat.buildPreviewProgramUri(programId), null, null)

Java

context.getContentResolver().delete(TvContractCompat.buildPreviewProgramUri(programId), null, null);

การจัดการการดำเนินการของผู้ใช้

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

การค้นพบและเพิ่มช่อง

แอปของคุณมีองค์ประกอบ UI ที่ให้ผู้ใช้เลือกและเพิ่มช่องได้ (เช่น ปุ่มที่ขอให้เพิ่มช่อง)

หลังจากที่ผู้ใช้ขอช่องที่เฉพาะเจาะจงแล้ว ให้เรียกใช้โค้ดนี้เพื่อขออนุญาตจากผู้ใช้ในการเพิ่มช่องลงใน UI ของหน้าจอหลัก

Kotlin

val intent = Intent(TvContractCompat.ACTION_REQUEST_CHANNEL_BROWSABLE)
intent.putExtra(TvContractCompat.EXTRA_CHANNEL_ID, channelId)
try {
  activity.startActivityForResult(intent, 0)
} catch (e: ActivityNotFoundException) {
  // handle error
}

Java

Intent intent = new Intent(TvContractCompat.ACTION_REQUEST_CHANNEL_BROWSABLE);
intent.putExtra(TvContractCompat.EXTRA_CHANNEL_ID, channelId);
try {
   activity.startActivityForResult(intent, 0);
} catch (ActivityNotFoundException e) {
  // handle error
}

ระบบจะแสดงกล่องโต้ตอบที่ขอให้ผู้ใช้อนุมัติช่อง จัดการผลลัพธ์ของคำขอในเมธอด onActivityResult ของกิจกรรม (Activity.RESULT_CANCELED หรือ Activity.RESULT_OK)

เหตุการณ์บนหน้าจอหลักของ Android TV

เมื่อผู้ใช้โต้ตอบกับโปรแกรม/ช่องทางที่แอปเผยแพร่ หน้าจอหลักจะส่ง Intent ไปยังแอป

  • หน้าจอหลักจะส่ง Uri ที่จัดเก็บไว้ในแอตทริบิวต์ APP_LINK_INTENT_URI ของช่องไปยังแอปเมื่อผู้ใช้เลือกโลโก้ของช่อง แอปควรเปิดตัว UI หลักหรือมุมมองที่เกี่ยวข้องกับช่องที่เลือก
  • หน้าจอหลักจะส่ง Uri ที่จัดเก็บไว้ในแอตทริบิวต์ INTENT_URI ของโปรแกรมไปยังแอปเมื่อผู้ใช้เลือกโปรแกรม แอปควรเล่นเนื้อหาที่เลือก
  • ผู้ใช้สามารถระบุว่าไม่สนใจโปรแกรมแล้วและต้องการให้นำโปรแกรมออกจาก UI ของหน้าจอหลัก ระบบจะนำโปรแกรมออกจาก UI และส่ง Intent (android.media.tv.ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED หรือ android.media.tv.ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED) แก่แอปที่เป็นเจ้าของโปรแกรม แอปควรนำโปรแกรมออกจากผู้ให้บริการ และไม่ควรแทรกโปรแกรมอีกครั้ง

อย่าลืมสร้างตัวกรอง Intent สำหรับ Uris ทั้งหมดที่หน้าจอหลักส่งสำหรับการโต้ตอบของผู้ใช้ เช่น

<receiver
   android:name=".WatchNextProgramRemoved"
   android:enabled="true"
   android:exported="true">
   <intent-filter>
       <action android:name="android.media.tv.ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED" />
   </intent-filter>
</receiver>

แนวทางปฏิบัติแนะนำ

  • แอปทีวีจำนวนมากกำหนดให้ผู้ใช้เข้าสู่ระบบ ในกรณีนี้ BroadcastReceiver ที่ฟัง android.media.tv.action.INITIALIZE_PROGRAMS ควรแนะนำ เนื้อหาของช่องสำหรับผู้ใช้ที่ไม่ได้ตรวจสอบสิทธิ์ตัวอย่างเช่น ในตอนแรก แอปของคุณสามารถ แสดงเนื้อหาที่ดีที่สุด หรือเนื้อหาที่กำลังได้รับความนิยมในปัจจุบัน หลังจากที่ผู้ใช้เข้าสู่ระบบแล้ว แสดงเนื้อหาที่ปรับเปลี่ยนในแบบของคุณได้ นี่เป็นโอกาสที่ดีสำหรับการขายอัปเซลแอป ผู้ใช้ก่อนเข้าสู่ระบบ
  • เมื่อแอปไม่ได้ทำงานอยู่เบื้องหน้าและคุณต้องอัปเดตช่องทางหรือ ให้ใช้ JobScheduler เพื่อกำหนดเวลางาน (ดู JobScheduler และ JobService)
  • ระบบอาจเพิกถอนสิทธิ์ของผู้ให้บริการแอปหากแอปทำงานผิดปกติ (เช่น การสแปมผู้ให้บริการด้วยข้อมูลอย่างต่อเนื่อง) โปรด ห่อโค้ดที่เข้าถึงผู้ให้บริการด้วยวลีคำสั่ง "ลองจับ" เพื่อจัดการ ข้อยกเว้นด้านความปลอดภัย
  • ก่อนอัปเดตโปรแกรมและช่องทาง โปรดค้นหาข้อมูลจากผู้ให้บริการ ต้องอัปเดตและปรับยอดข้อมูล ตัวอย่างเช่น คุณไม่จำเป็นต้องอัปเดต โปรแกรมที่ผู้ใช้ต้องการนำออกจาก UI ใช้งานเบื้องหลังที่ จะแทรก/อัปเดตข้อมูลลงในผู้ให้บริการหลังจากสืบค้นข้อมูล จากนั้นจึงขออนุมัติสำหรับช่องของคุณ คุณจะเรียกใช้งานนี้ได้เมื่อ แอปจะเริ่มทำงานและเมื่อใดก็ตามที่จำเป็นต้องอัปเดตข้อมูลของแอป

    Kotlin

    context.contentResolver
      .query(
          TvContractCompat.buildChannelUri(channelId),
              null, null, null, null).use({
                  cursor-> if (cursor != null and cursor.moveToNext()) {
                               val channel = Channel.fromCursor(cursor)
                               if (channel.isBrowsable()) {
                                   //update channel's programs
                               }
                           }
              })
    

    Java

    try (Cursor cursor = context.getContentResolver()
          .query(
              TvContractCompat.buildChannelUri(channelId),
              null,
              null,
              null,
              null)) {
                  if (cursor != null && cursor.moveToNext()) {
                      Channel channel = Channel.fromCursor(cursor);
                      if (channel.isBrowsable()) {
                          //update channel's programs
                      }
                  }
              }
    
  • ใช้ URI ที่ไม่ซ้ำกันสำหรับรูปภาพทั้งหมด (โลโก้ ไอคอน รูปภาพเนื้อหา) โปรดใช้ URI อื่นเมื่อคุณอัปเดตรูปภาพ รูปภาพทั้งหมดได้รับการแคชไว้ หากคุณไม่เปลี่ยน URI เมื่อคุณเปลี่ยนรูปภาพ รูปภาพเก่าจะยังปรากฏอยู่

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

แอตทริบิวต์

ส่วนนี้จะอธิบายแอตทริบิวต์ของช่องและโปรแกรมแยกกัน

แอตทริบิวต์ของช่อง

คุณต้องระบุแอตทริบิวต์เหล่านี้สำหรับทุกช่อง

แอตทริบิวต์ หมายเหตุ
ประเภท ตั้งค่าเป็น TYPE_PREVIEW
DISPLAY_NAME ตั้งเป็นชื่อช่อง
APP_LINK_INTENT_URI เมื่อผู้ใช้เลือกโลโก้ของช่อง ระบบจะส่งความตั้งใจให้เริ่มกิจกรรมซึ่งนำเสนอเนื้อหาที่เกี่ยวข้องกับช่อง ตั้งค่าแอตทริบิวต์นี้เป็น URI ที่ใช้ในตัวกรอง Intent สำหรับกิจกรรมนั้น

นอกจากนี้ ช่องยังมี 6 ช่องที่สงวนไว้สำหรับการใช้งานแอปภายใน ช่องเหล่านี้ใช้จัดเก็บคีย์หรือค่าอื่นๆ ที่ช่วยให้แอปแมปช่องกับโครงสร้างข้อมูลภายในของช่องได้

  • รหัสภายในผู้ให้บริการ
  • ข้อมูลภายใน
  • ข้อมูลภายในผู้ให้บริการ FLAG1
  • ข้อมูลภายในของผู้ให้บริการ FLAG2
  • ข้อมูลภายในผู้ให้บริการ FLAG3
  • ข้อมูลภายในผู้ให้บริการ FLAG4

แอตทริบิวต์ของโปรแกรม

ดูหน้าแต่ละหน้าสำหรับแอตทริบิวต์ของโปรแกรมแต่ละประเภท ดังนี้

โค้ดตัวอย่าง

ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างแอปที่โต้ตอบกับหน้าจอหลัก รวมถึงเพิ่มช่องและรายการลงในหน้าจอหลักของ Android TV ได้ที่ Codelab ในหน้าจอหลัก