สร้างแอปสื่อที่ใช้เทมเพลต

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

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

คู่มือนี้จะถือว่าคุณมีแอปสื่อที่เล่นเสียงในโทรศัพท์อยู่แล้วและแอปสื่อของคุณเป็นไปตามสถาปัตยกรรมแอปสื่อ Android ไลบรารีแอปรถยนต์ช่วยให้คุณแทนที่ประสบการณ์การใช้งานในแอปด้วยเทมเพลตแทนประสบการณ์การใช้งานที่สร้างขึ้นโดยใช้โครงสร้างข้อมูล สร้างแอปสื่อสำหรับรถยนต์ MediaBrowser ได้ คุณยังคงต้องระบุ MediaSession สำหรับการควบคุมการเล่น และ MediaBrowserService ซึ่งใช้สำหรับคำแนะนำและประสบการณ์การใช้งานอัจฉริยะอื่นๆ

กำหนดค่าไฟล์ Manifest ของแอป

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

ประกาศการรองรับหมวดหมู่ในไฟล์ Manifest

แอปของคุณต้องประกาศandroidx.car.app.category.MEDIA หมวดหมู่แอปรถยนต์ในตัวกรอง Intent ของ CarAppService

<application>
    ...
   <service
       ...
        android:name=".MyCarAppService"
        android:exported="true">
      <intent-filter>
        <action android:name="androidx.car.app.CarAppService" />
        <category android:name="androidx.car.app.category.MEDIA"/>
      </intent-filter>
    </service>
    ...
<application>

หากต้องการเข้าถึง MediaPlaybackTemplate แอปของคุณยังต้องประกาศสิทธิ์ androidx.car.app.MEDIA_TEMPLATES ในไฟล์ Manifest ด้วย

<manifest ...>
  ...
  <uses-permission android:name="androidx.car.app.MEDIA_TEMPLATES"/>
  ...
</manifest>

ตั้งค่าระดับ API ขั้นต่ำของแอปรถยนต์

แอปสื่อที่ใช้ MediaPlaybackTemplate ใช้ได้เฉพาะใน CAL API 8 เท่านั้น ตรวจสอบว่าได้ตั้งค่า Car App API level เป็น 8 เป็นอย่างน้อย

<application ...>
  ...
  <meta-data
    android:name="androidx.car.app.minCarApiLevel"
    android:value="8"/>
  ...
</application>

ประกาศการรองรับ Android Auto

ตรวจสอบว่าข้อมูลต่อไปนี้อยู่ในไฟล์ Manifest ของแอป

<application>
  ...
  <meta-data android:name="com.google.android.gms.car.application"
      android:resource="@xml/automotive_app_desc"/>
  ...
</application>

จากนั้นเพิ่มประกาศเทมเพลตลงใน automotive_app_desc.xml ในแหล่งข้อมูล xml ซึ่งควรมีลักษณะดังนี้

<automotiveApp xmlns:android="http://schemas.android.com/apk/res/android">
 <uses name="media"/>
 <uses name="template"/>
</automotiveApp>

ระบุไอคอนการระบุแหล่งที่มา

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

รองรับการสั่งงานด้วยเสียง

เปิดใช้เสียงในแอปเพื่อให้ผู้ใช้ดำเนินการทั่วไปได้แบบแฮนด์ฟรี ดูวิธีการติดตั้งใช้งานโดยละเอียดได้ที่รองรับการสั่งงานด้วยเสียงสำหรับสื่อ เมื่อใช้แอปสื่อที่มีเทมเพลต หากได้รับคําสั่งเสียง คุณไม่จําเป็นต้องอัปเดต MediaBrowserService ด้วยผลการค้นหา แต่ให้ลองเพิ่มการดําเนินการในเทมเพลตการเล่นสื่อเพื่อให้ผู้ใช้ค้นหาเนื้อหาเพิ่มเติมตามการเล่นหรือคําค้นหานั้น การรองรับคำสั่งเสียงต้องเป็นไปตามหลักเกณฑ์ด้านคุณภาพ VC-1

สร้างเทมเพลตการเล่น

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

เครื่องเล่นเพลงแสดง Sounds of Spring โดย Summer Fielding พร้อมภาพสี่เหลี่ยมจัตุรัสของผู้หญิงเล่นกีตาร์

รูปที่ 1: MediaPlaybackTemplate ที่มีการดำเนินการส่วนหัวเพื่อเปิดคิว ที่ด้านบน

ตัวอย่างโค้ดนี้แสดงวิธีสร้างเทมเพลตการเล่นตัวอย่างเพลงซึ่งตั้งค่าการดำเนินการส่วนหัวที่อนุญาตให้ผู้ใช้ไปยังหน้าจอที่มีคิวเพลง

val playbackTemplate = MediaPlaybackTemplate.Builder()
      .setHeader(
        Header.Builder()
          .setStartHeaderAction(Action.BACK)
          .addEndHeaderAction(
                Action.Builder()
                  .setTitle(model.context.getString(R.string.queue_button_title))
                  .setIcon(
                    CarIcon.Builder(
                        IconCompat.createWithResource(
                          model.context,
                          R.drawable.gs_queue_music_vd_theme_24,
                        ))
                      .build())
                  .setOnClickListener(showQueueScreen())
                  .build())
          .setTitle(model.context.getString(R.string.media_playback_view_title))
          .build())
      .build()

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

import androidx.car.app.media.MediaPlaybackManager


override fun onCreateSession(sessionInfo: SessionInfo): Session {
    return object : Session() {
        

        init {
          lifecycle.addObserver(
            LifecycleEventObserver { _, event ->
              if (event == ON_CREATE) {
                val token = ... // MediaSessionCompat.Token
                (carContext.getCarService(CarContext.MEDIA_PLAYBACK_SERVICE) as MediaPlaybackManager)
                  .registerMediaPlaybackToken(token)
              }
              ...
            }
          )
        }
    }
}

.registerMediaPlaybackToken จำเป็นสำหรับการเปิดเผยข้อมูลและการควบคุมการเล่นสื่อไปยัง Android Auto ข้อมูลนี้ยังช่วยให้โฮสต์สร้างการแจ้งเตือนสำหรับสื่อแต่ละประเภทได้อีกด้วย

จัดระเบียบสื่อโดยใช้เทมเพลต

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

อินเทอร์เฟซแอปเพลงแสดงเพลงและอัลบั้มที่เล่นล่าสุด รวมถึงแถวแนวตั้ง 2 แถวและภาพแนวนอนของอาร์ตเวิร์กอัลบั้ม 3 ภาพ

รูปที่ 2: A SectionedItemTemplate ที่มี RowSection followed by a GridSection

การใช้ SectionedItemTemplate ภายใน TabTemplate

วิธีหนึ่งที่สะดวกในการจัดหมวดหมู่สื่อภายในแอปคือการใช้ SectionedItemTemplate ภายใน TabTemplate

val template =
      SectionedItemTemplate.Builder()...build();
val tabTemplate = 
      TabTemplate.Builder(tabCallback)
          .setTabContents(TabContents.Builder(template).build)
          .setHeaderAction(Action.APP_ICON)
          
          .build();

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

เมื่อเรียกดูสื่อ ผู้ใช้ควรไปยัง MediaPlaybackTemplate ได้อย่างรวดเร็วโดยไม่มีการรบกวน แอปของคุณต้องมีวิธีเข้าถึง MediaPlaybackTemplate จากหน้าจอการเรียกดูสื่อทั้งหมดเพื่อให้เป็นไปตามข้อกำหนดด้านคุณภาพของ MFT-1

หากใช้ SectionedItemTemplate คุณจะทำสิ่งต่อไปนี้ได้โดยเพิ่มปุ่มการดำเนินการแบบลอยตัวที่นำทางคุณไปยังหน้าจอการเล่นสื่อ สําหรับเทมเพลตอื่นๆ การดำเนินการส่วนหัวเป็นอีกวิธีหนึ่งในการดําเนินการนี้