Bagian ini memberikan detail teknis khusus untuk aplikasi referensi Pusat Kontrol.
Pusat Kontrol adalah aplikasi yang tidak tergabung, memiliki hak istimewa, dan ditandatangani sistem yang memerlukan
versi SDK minimum 35 (Android V (level API 35)). Aplikasi diinstal di
system/priv-app untuk menggunakan System APIs. Untuk membaca informasi media, aplikasi harus ditandatangani platform. Anda dapat mengupdate aplikasi Over-the-Air (OTA).
Layanan latar belakang
Aplikasi Pusat Kontrol mengandalkan layanan latar belakang untuk fungsinya.
Control Center Service dimulai pada status user-post-unlocked dalam
siklus proses pengguna oleh Vendor ServiceController. Pusat Kontrol harus selalu
aktif dan berkomunikasi di latar belakang—aplikasi tidak dapat mengandalkan aplikasi yang
dibuka oleh pengguna.
Control Center Service terhubung dan berkomunikasi dengan instance lain dari
dirinya sendiri di zona penumpang lain menggunakan Communication API. Membaca panduan integrasi sangat penting untuk memahami cara instance Pusat Kontrol di setiap pengguna membuat koneksi serta mengirim dan menerima data.
Komunikasi
Setelah terhubung, Control Center Service berkomunikasi dengan objek protobuf
yang menyampaikan informasi. Untuk meneruskan protobuf ke zona penghuni lain
dengan Communication APIs, protobuf dikonversi menjadi byte array,
payload object dibuat, dan Payload dikirim melalui
CarOccupantConnectionManager#sendPayload.
message ControlCenterPayload {
required Type messageType = 1;
// ...
enum Type {
MEDIA_STATUS = 0;
MEDIA_COMMAND = 1;
INPUT_LOCK_COMMAND = 2;
INPUT_LOCK_SUCCESSFUL = 3;
CANCEL_AUDIO_REQUEST = 4;
MIRRORING_REQUEST_RECEIVER_DECISION = 5;
MIRRORING_SESSION_ENDED = 6;
}
}
private fun parsePayload(
senderZone: OccupantZoneInfo,
payload: Payload
) {
val parsedPayload =
ControlCenterPayload.parseFrom(payload.bytes)
when (parsedPayload.messageType) {
ControlCenterPayload.Type.MEDIA_STATUS -> {
// logic here
}
}
//…
}
Data
Informasi tentang zona hunian disimpan di Pusat Kontrol dalam bentuk objek OccupantZoneData. Perubahan pada OccupantZoneData lokal dikirim ke
instance Pusat Kontrol lainnya melalui Comms API.
Saat Payload yang diterima diuraikan, data yang diuraikan akan diteruskan ke
OccupantZoneStateRepository lokal yang, pada gilirannya, akan memberi tahu tampilan tentang perubahan tersebut. Sebagian besar data diteruskan antar-class dengan Kotlin flows on Android.
Menangani permintaan audio speaker kabin
Agar pengemudi selalu dapat menerima permintaan penumpang untuk memutar audio
melalui speaker kabin, saat dibuat, Control Center Service
pengemudi mendaftarkan Primary ZoneMedia Audio RequestCallback.
Callback akan diberi tahu tentang panggilan ke
CarAudioManager#requestMediaAudioOnPrimaryZone. Driver
Control Center Service menangani permintaan dengan membuat notifikasi pendahuluan
(HUN) yang dapat diterima atau ditolak melalui
CarAudioManager#allowMediaAudioOnPrimaryZone(boolean).
Menonton bersama video dengan layar lain
Menonton bersama berfungsi karena Task Mirroring APIs di CarActivityManager. TaskMirroringManager menelusuri terlebih dahulu paket aplikasi MediaSession yang sedang diputar di CarActivityManager#getVisibleTasks, lalu membuat VirtualDisplay dan memindahkan tugas yang terlihat ke tampilan ini melalui CarActivityManager#moveRootTaskToDisplay.
Tindakan ini akan menampilkan token IBinder yang dapat digunakan MirroredSurfaceView dalam
tata letak untuk menampilkan tugas melalui MirroredSurfaceView#mirrorSurface.
Objek Communication API Payload meneruskan token ke zona penghuni lainnya.
Setiap instance Pusat Kontrol di zona penghuni tersebut meluncurkan
Mirroring activity dan menggunakan token tersebut untuk mengisi MirroredSurfaceView.
API pencerminan tugas
Pusat Kontrol menggunakan API pencerminan tugas berikut:
CarActivityManager#getVisibleTasks(int displayId)<ActivityManager.RunningTaskInfo> dipanggil untuk tampilan pengirim.CarActivityManager#moveRootTaskToDisplay(int virtualDisplayId)CarActivityManager#createTaskMirroringToken(int taskId)IBinder dan harus dipanggil setelah
tugas dipindahkan ke tampilan virtual.MirroredSurfaceView#mirrorSurface(IBinder token)Batasan pencerminan tugas di Pusat Kontrol
Pusat Kontrol hanya mendukung pencerminan tugas untuk aplikasi MediaSession.
Namun, API dapat mencerminkan tugas apa pun. Tampilan virtual dibuat dengan dimensi tampilan pengirim. Jika layar penerima menggunakan resolusi dan dimensi yang berbeda, layar virtual akan muncul di tengah layar.
Menampilkan tugas yang terlihat
Pusat Kontrol memperluas sasis Theme.CarUi.NoToolbar menjadi jendela
transparan. Artinya, saat Pusat Kontrol dibuka di atas tugas, tugas
akan ditampilkan di CarActivityManager#getVisibleTasks, sehingga tugas dapat
dicerminkan.
Menerima informasi pencerminan
Pusat Kontrol memberi tahu aplikasi lain tentang sesi pencerminan. Untuk menerima
update, aplikasi harus terikat ke Control Center Service dan mengirim class Handler
sebagai klien, yang menerima dan menangani Messages dari Control
Center Service.
Aplikasi klien dapat menerima nama paket aplikasi yang dicerminkan dan meluncurkan
intent URI untuk aktivitas di Pusat Kontrol yang menghosting aplikasi yang dicerminkan dengan
kunci ini:
_config_msg_mirroring_pkg_name_key__config_msg_mirroring_redirect_uri_key_
Konfigurasi ini harus ada di resource aplikasi klien dan di resource Control Center.
Pusat Kontrol Debug
Class Logger menangani log Pusat Kontrol, yang dapat dikonfigurasi untuk
memaksa log.
class Logger(cls: Class<*>) {
companion object {
private const val FORCE_LOGS = false
}
private val tag: String
init {
tag = cls.simpleName
}
fun v(message: String) {
if (Log.isLoggable(tag, Log.VERBOSE) || FORCE_LOGS) {
Log.v(tag, message)
}
}
...
Aplikasi sistem dan kemampuan update
Karena Pusat Kontrol adalah aplikasi sistem dan ditandatangani platform karena penggunaan izin khusus tanda tangan, Pusat Kontrol harus diinstal sebelumnya di perangkat dan hanya dapat diupdate melalui OTA, mirip dengan Aplikasi Media Mobil.
Membangun Pusat Kontrol dari sumber
Untuk mendapatkan kode sumber Pusat Kontrol, lihat Mengintegrasikan aplikasi yang tidak tergabung.
Privasi pengguna dengan multi-tampilan
Control Center memungkinkan semua penumpang mobil melihat informasi media di semua layar. Google merekomendasikan agar Anda menyisipkan pemberitahuan privasi non-blocking untuk memberi tahu pengguna. Google merekomendasikan agar Anda melakukannya di tingkat sistem, saat Anda login ke layar.