Aplikasi media yang menggunakan template Library Aplikasi Mobil dapat menyesuaikan pengalaman penjelajahan dan pemutaran media sekaligus memastikan pengalaman tersebut dioptimalkan untuk layar mobil dan meminimalkan gangguan saat mengemudi.
Panduan ini mengasumsikan bahwa Anda sudah memiliki aplikasi media yang memutar audio di ponsel
dan bahwa aplikasi media Anda sesuai dengan arsitektur aplikasi media Android. Library Aplikasi Mobil memberi Anda kemampuan untuk mengganti pengalaman dalam aplikasi dengan
template, bukan yang dibuat menggunakan struktur data Buat aplikasi media untuk mobil
MediaBrowser. Anda tetap harus menyediakan MediaSession untuk kontrol pemutaran, dan MediaBrowserService atau MediaLibraryService, yang digunakan untuk rekomendasi dan pengalaman smart lainnya.
Mengonfigurasi manifes aplikasi Anda
Selain langkah-langkah yang dijelaskan dalam Menggunakan Library Aplikasi Android untuk Mobil, hal berikut diperlukan untuk aplikasi media berbasis template:
Mendeklarasikan dukungan kategori dalam manifes Anda
Aplikasi Anda harus mendeklarasikan androidx.car.app.category.MEDIA
kategori aplikasi mobil dalam filter 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>
Untuk mendapatkan akses ke MediaPlaybackTemplate, aplikasi Anda juga
harus mendeklarasikan izin androidx.car.app.MEDIA_TEMPLATES dalam file
manifesnya:
<manifest ...>
...
<uses-permission android:name="androidx.car.app.MEDIA_TEMPLATES"/>
...
</manifest>
Menetapkan level API aplikasi mobil minimum
Aplikasi media yang menggunakan MediaPlaybackTemplate hanya didukung di CAL API 8 dan
yang lebih tinggi. Pastikan Car App API level minimum Anda ditetapkan ke 8.
<application ...>
...
<meta-data
android:name="androidx.car.app.minCarApiLevel"
android:value="8"/>
...
</application>
Menyediakan ikon atribusi
Pastikan untuk menambahkan ikon atribusi untuk aplikasi media yang dibuat menggunakan Library Aplikasi Mobil.
Mendeklarasikan dukungan Android Auto
Pastikan hal berikut disertakan dalam manifes aplikasi Anda:
<application>
...
<meta-data android:name="com.google.android.gms.car.application"
android:resource="@xml/automotive_app_desc"/>
...
</application>
Kemudian, tambahkan deklarasi template ke automotive_app_desc.xml di resource xml Anda. Tampilannya akan terlihat seperti berikut:
<automotiveApp xmlns:android="http://schemas.android.com/apk/res/android">
<uses name="media"/>
<uses name="template"/>
</automotiveApp>
Mendeklarasikan dukungan Android Automotive OS
Ada dua cara berbeda untuk mendistribusikan aplikasi media yang diaktifkan Library Aplikasi Mobil di Android Automotive OS: sebagai APK tunggal atau sebagai dua APK terpisah. Jika Anda mendistribusikan APK tunggal, APK tersebut akan mendukung kendaraan yang diaktifkan untuk Android Automotive OS dengan host Library Aplikasi Mobil dan kembali ke aplikasi MediaBrowserService atau MediaLibraryService jika tidak, bahkan untuk versi Android yang lebih lama (Android 10 - Android 13). Jika memilih untuk mendistribusikan dua APK terpisah, Anda dapat memperbarui penambahan baru ke versi Library Aplikasi Mobil dengan lebih mudah tanpa khawatir akan memengaruhi versi MediaBrowserService atau MediaLibraryService aplikasi Anda.
Mendistribusikan APK tunggal
Saat mendistribusikan APK tunggal untuk Library Aplikasi Mobil dan MediaBrowserService
atau MediaLibraryService versi aplikasi Anda, penting untuk menetapkan
"android:required="false".
<uses-feature android:name="android.software.car.templates_host.media" android:required="false"/>
Selanjutnya, ikuti panduan Library Aplikasi Mobil untuk AAOS dan
perkenalkan CarAppActivity yang dapat diluncurkan (atau aktivitas trampolin). Anda harus menetapkan aktivitas ke android:enabled="false" dalam manifes. Selanjutnya, tambahkan tag metadata ke deklarasi MediaBrowserService yang menunjukkan komponen CarAppActivity sebagai pengganti. Lihat contoh manifes di bawah:
<service android:name=".media.MyMediaService"
android:exported="true"
android:label="@string/app_name">
<intent-filter>
<action android:name="androidx.media3.session.MediaLibraryService"/>
</intent-filter>
<!-- Link to Car App Library Activity -->
<meta-data
android:name="androidx.car.app.media.CalMediaActivityComponent"
android:value="com.example.mediaapp.LaunchableTrampoline"/>
</service>
<activity
android:name=".LaunchableTrampoline"
android:exported="true"
android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
android:launchMode="singleTask"
android:label="@string/app_name_cal"
android:enabled="false"> <!-- Set to false -->
<meta-data android:name="distractionOptimized" android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
Distribusi Play
APK Anda dengan Library Aplikasi Mobil dan MediaBrowserService atau MediaLibraryService harus diaktifkan dengan kode versi yang lebih tinggi dan minSdk yang menargetkan Android 14 (34).
Mendistribusikan dengan dua APK
Untuk mendistribusikan dua APK terpisah, satu menggunakan Library Aplikasi Mobil dan yang lainnya menggunakan MediaBrowserService atau MediaLibraryService, ikuti langkah-langkah berikut untuk memastikan kemampuan kendaraan yang benar ditargetkan dengan benar.
Saat membuat APK terpisah untuk versi Library Aplikasi Mobil aplikasi Anda, Anda harus menetapkan android.software.car.templates_host.media ke android:required=true. Hal ini memastikan aplikasi hanya didistribusikan pada build Android Automotive OS yang disertifikasi dengan dukungan untuk host Library Aplikasi Mobil.
<uses-feature android:name="android.software.car.templates_host.media" android:required="true"/>
Selain menggunakan android.software.car.templates_host.media dan menetapkannya ke
android:required=true di atas, ikuti langkah-langkah berikut untuk mengaktifkan Android Automotive OS
untuk aktivitas Library Aplikasi Mobil yang dapat diluncurkan.
Distribusi Play
APK yang menggunakan Library Aplikasi Mobil harus didistribusikan di jalur khusus Automotive OS.
Mendukung voice action
Aktifkan suara di aplikasi Anda untuk memungkinkan pengguna menyelesaikan tindakan umum tanpa menggunakan tangan.
Lihat mendukung voice action untuk media guna mengetahui petunjuk penerapan yang lebih mendetail. Dengan aplikasi media berbasis template, jika Anda menerima perintah suara, Anda tidak perlu memperbarui MediaBrowserService atau MediaLibraryService dengan hasil penelusuran. Sebagai gantinya, pertimbangkan untuk menambahkan tindakan di template pemutaran media Anda agar pengguna dapat menemukan lebih banyak konten berdasarkan kueri pemutaran atau penelusuran tersebut. Mendukung perintah suara diperlukan untuk memenuhi VC-1 panduan kualitas.
Membuat Template Pemutaran
MediaPlaybackTemplate menampilkan informasi pemutaran media
di aplikasi media Library Aplikasi Mobil Anda. Template ini memungkinkan Anda menetapkan
header dengan judul dan tindakan yang dapat disesuaikan, sementara informasi media dan
kontrol pemutaran diisi oleh host berdasarkan status
MediaSession aplikasi Anda.
Gambar 1:
MediaPlaybackTemplate dengan tindakan header untuk membuka antrean di bagian atas.
Contoh kode ini menunjukkan cara membuat contoh template pemutaran yang menetapkan tindakan header yang memungkinkan pengguna membuka layar dengan antrean lagu.
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()
Saat menggunakan MediaPlaybackTemplate, daftarkan token
MediaSession menggunakan MediaPlaybackManager di
CarAppService Anda. Jika tidak melakukannya, error akan ditampilkan saat MediaPlaybackTemplate dikirim ke host.
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 diperlukan untuk menampilkan informasi dan kontrol pemutaran media ke Android Auto. Hal ini juga penting agar host dapat membuat notifikasi khusus media.
Untuk aplikasi yang menggunakan library Media3, yang menggunakan PlatformToken, bukan MediaSessionCompat.Token standar, Anda harus menerapkan SessionCommand kustom di MediaLibrarySession.Callback yang menampilkan token platform yang mendasarinya: session.platformToken. Di CarAppService, kirim perintah kustom ini ke sesi. Setelah menerima token platform, konversikan menggunakan MediaSessionCompat.Token.fromToken(platformToken) dan teruskan token kompatibilitas ini ke Library Aplikasi Mobil di .registerMediaPlaybackToken().
Mengatur media menggunakan template
Untuk mengatur media untuk penjelajahan seperti lagu atau album, sebaiknya gunakan
SectionedItemTemplate,
yang memungkinkan Anda menggunakan GridSection dan
RowSection bersama-sama untuk membuat tata letak yang menggabungkan daftar gambar
dan item teks.
Gambar 2: SectionedItemTemplate yang berisi RowSection diikuti oleh GridSection
Menggunakan SectionedItemTemplate di dalam TabTemplate
Salah satu cara mudah untuk mengategorikan media dalam aplikasi Anda adalah menggunakan yang
SectionedItemTemplate di dalam yang
TabTemplate.
val template =
SectionedItemTemplate.Builder()...build();
val tabTemplate =
TabTemplate.Builder(tabCallback)
.setTabContents(TabContents.Builder(template).build)
.setHeaderAction(Action.APP_ICON)
…
.build();
Komponen dan fitur library aplikasi mobil 1.9
Car App Library API Versi 1.9 memperkenalkan komponen yang disesuaikan untuk kemampuan penjelajahan yang unik, seperti Chip, Progress Bar, Item Ringkas, Header Interaktif dan Diperluas, Bagian Sorotan dan Banner.
.
Gambar 3: SectionedItemTemplate yang berisi Chips, Condensed Items, Interactive Header, Grid Items, dan Minimized Control Panel
Gambar 4: Dua layar penjelajahan media yang menampilkan Expanded Header, Spotlight Sections, dan Progress Bars
Untuk detail selengkapnya tentang cara mendesain antarmuka pengguna aplikasi media menggunakan template ini, lihat Aplikasi media.
Membuka kontrol pemutaran
Saat menjelajahi media, pengguna harus dapat dengan cepat
membuka MediaPlaybackTemplate dengan gangguan minimal.Untuk memenuhi
MFT-1 persyaratan kualitas, aplikasi Anda harus memiliki cara untuk mengakses
MediaPlaybackTemplate dari semua layar penjelajahan media.
Jika menggunakan SectionedItemTemplate, Anda dapat melakukannya dengan menambahkan tombol tindakan yang mengarahkan Anda ke layar pemutar media. Gunakan tindakan Action.MEDIA_PLAYBACK Library Aplikasi Mobil standar. Aplikasi media akan
menampilkan tindakan ini sebagai Panel kontrol yang diminimalkan,
yang diperlukan untuk memenuhi persyaratan kualitas MFT-1 jika Anda
menggunakan Car App Library API 1.9 atau yang lebih tinggi. Untuk template lainnya, tindakan header adalah cara lain untuk melakukannya.
Menangani intent pemutaran media sistem
Pengguna harus diarahkan ke MediaPlaybackTemplate saat aplikasi diluncurkan dari platform pemutaran media sistem, seperti kartu media. Kami mewajibkan aplikasi media menangani Intent Action ini untuk
memberikan pengalaman yang lancar bagi pengguna.
Tambahkan tindakan androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK ke
intent-filter komponen Library Aplikasi Mobil Anda (baik CarAppActivity maupun
Activity trampolin Anda).
Pastikan aktivitas Anda menggunakan launchMode singleTask atau singleTop sehingga onNewIntent() dipanggil.
<activity
android:name=".LaunchableTrampoline"
android:exported="true"
android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
android:launchMode="singleTask"
android:label="@string/app_name_cal"
android:enabled="false">
<meta-data android:name="distractionOptimized" android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
Di class Session, ganti onNewIntent() untuk mengurai intent masuk.
Jika tindakan intent masuk cocok dengan SHOW_MEDIA_PLAYBACK, arahkan pengguna ke layar yang sedang diputar.
@Override
public void onNewIntent(@NonNull Intent intent) {
super.onNewIntent(intent);
if (SHOW_MEDIA_PLAYBACK.equals(intent.getAction())) {
ScreenManager screenManager = getCarContext().getCarService(ScreenManager.class);
// Avoid redundant navigation if already on the playing screen
if (screenManager.getTop() instanceof MyMediaPlayScreen) {
return;
}
screenManager.push(MyMediaPlayScreen.createScreenFromPlaying(
getCarContext(), mMediaSessionController));
}
}
Jika Anda menggunakan aktivitas trampolin, periksa tindakan intent dalam onCreate(). Teruskan tindakan ini ke intent pembuatan CarAppActivity sebelum memanggil finish().
public class LaunchableTrampoline extends AppCompatActivity {
private static final String SHOW_MEDIA_PLAYBACK = "androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent receivedIntent = getIntent();
String action;
if (SHOW_MEDIA_PLAYBACK.equals(receivedIntent.getAction())) {
action = SHOW_MEDIA_PLAYBACK;
} else {
action = Intent.ACTION_MAIN;
}
Intent intent = new Intent(action);
intent.setClassName(getPackageName(), "androidx.car.app.activity.CarAppActivity");
startActivity(intent);
finish();
}
}