ส่วนนี้จะให้รายละเอียดทางเทคนิคที่เฉพาะเจาะจงกับแอปอ้างอิง Control Center
ศูนย์ควบคุมเป็นแอปที่ไม่ได้รวมไว้ ได้รับสิทธิ์ และระบบลงนาม ซึ่งต้องใช้ SDK เวอร์ชันขั้นต่ำ 35 (Android V (ระดับ API 35)) แอปนี้ติดตั้งไว้ใน
system/priv-app เพื่อใช้ System APIs หากต้องการอ่านข้อมูลสื่อ แอปต้อง
ได้รับการลงนามจากแพลตฟอร์ม คุณอัปเดตแอปผ่านอากาศ (OTA) ได้
บริการที่ทำงานอยู่เบื้องหลัง
แอปศูนย์ควบคุมใช้บริการที่ทำงานอยู่เบื้องหลังเพื่อฟังก์ชันการทำงาน
Control Center Service จะเริ่มในสถานะ user-post-unlocked ในวงจรผู้ใช้โดย Vendor ServiceController ศูนย์ควบคุมต้องทำงานและสื่อสารในเบื้องหลังอยู่เสมอ แอปไม่สามารถอาศัยการที่ผู้ใช้เปิดแอปได้
Control Center Service เชื่อมต่อและสื่อสารกับอินสแตนซ์อื่นๆ ของ
ตัวเองในโซนที่มีการเข้าใช้อื่นๆ โดยใช้ Communication API การอ่าน
คู่มือการผสานรวมเป็นสิ่งจำเป็นเพื่อให้เข้าใจวิธีที่อินสแตนซ์ของศูนย์ควบคุม
ในผู้ใช้แต่ละรายสร้างการเชื่อมต่อ รวมถึงส่งและรับข้อมูล
การสื่อสาร
เมื่อเชื่อมต่อแล้ว Control Center Service จะสื่อสารกับออบเจ็กต์ protobuf
ที่สื่อข้อมูล หากต้องการส่ง protobuf ไปยังโซนผู้โดยสารอื่น
ด้วย Communication APIs ระบบจะแปลง protobuf เป็น byte array
สร้าง payload object และส่ง Payload ผ่าน
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
}
}
//…
}
ข้อมูล
ระบบจะจัดเก็บข้อมูลเกี่ยวกับโซนผู้โดยสารไว้ในศูนย์ควบคุมในรูปแบบของออบเจ็กต์ OccupantZoneData การเปลี่ยนแปลง OccupantZoneData ในเครื่องจะถูกส่งไปยัง
อินสแตนซ์ Control Center อื่นๆ ผ่าน Comms API
เมื่อมีการแยกวิเคราะห์ Payload ที่ได้รับ ระบบจะส่งข้อมูลที่แยกวิเคราะห์แล้วไปยัง OccupantZoneStateRepository ในเครื่อง ซึ่งจะแจ้งให้มุมมองทราบถึงการเปลี่ยนแปลง ข้อมูลส่วนใหญ่จะส่งผ่านระหว่างคลาสด้วย Kotlin flows on Android
จัดการคำขอให้เล่นเสียงผ่านลำโพงในห้องโดยสาร
เมื่อสร้างแล้ว Control Center Service ของคนขับจะลงทะเบียน Primary ZoneMedia Audio RequestCallback เพื่อให้คนขับรับคำขอให้ผู้โดยสารเล่นเสียง
ผ่านลำโพงในห้องโดยสารได้เสมอ
การเรียกกลับจะได้รับการแจ้งเตือนการโทรไปยัง
CarAudioManager#requestMediaAudioOnPrimaryZone คนขับ
Control Center Serviceจัดการคำขอโดยสร้างการแจ้งเตือนล่วงหน้า
(HUN) ที่ยอมรับหรือปฏิเสธได้ผ่าน
CarAudioManager#allowMediaAudioOnPrimaryZone(boolean)
ดูวิดีโอร่วมกันกับหน้าจออื่นๆ
การดูร่วมกันจะทำงานได้เนื่องจาก Task Mirroring APIs ใน CarActivityManager โดย
TaskMirroringManager จะค้นหาแพ็กเกจของแอปที่กำลังเล่น MediaSession
ใน CarActivityManager#getVisibleTasks ก่อน แล้วจึงสร้าง
VirtualDisplay และย้ายงานที่มองเห็นได้ไปยังจอแสดงผลนี้ผ่าน
CarActivityManager#moveRootTaskToDisplay
ซึ่งจะแสดงผลโทเค็น IBinder ที่ MirroredSurfaceView ใช้ในเลย์เอาต์เพื่อแสดงงานผ่าน MirroredSurfaceView#mirrorSurface ได้
Communication API Payload ออบเจ็กต์ส่งโทเค็นไปยังโซนอื่นๆ ที่มีผู้ใช้
อินสแตนซ์ของศูนย์ควบคุมแต่ละรายการในโซนผู้เข้าพักจะเปิดตัว Mirroring activity และใช้โทเค็นนั้นเพื่อป้อนข้อมูลใน MirroredSurfaceView
API การมิเรอร์งาน
ศูนย์ควบคุมใช้ API การมิเรอร์งานต่อไปนี้
CarActivityManager#getVisibleTasks(int displayId)<ActivityManager.RunningTaskInfo> โทรหาเพื่อแสดงชื่อผู้ส่งCarActivityManager#moveRootTaskToDisplay(int virtualDisplayId)CarActivityManager#createTaskMirroringToken(int taskId)IBinder และควรเรียกใช้หลังจากย้ายงานไปยังจอแสดงผลเสมือนMirroredSurfaceView#mirrorSurface(IBinder token)ข้อจำกัดของการมิเรอร์งานในศูนย์ควบคุม
ศูนย์ควบคุมรองรับการมิเรอร์งานสำหรับแอป MediaSession เท่านั้น
อย่างไรก็ตาม API สามารถจำลองงานใดก็ได้ จอแสดงผลเสมือนสร้างขึ้นโดยใช้
ขนาดของจอแสดงผลของผู้ส่ง หากจอแสดงผลของเครื่องรับใช้ความละเอียดและขนาดที่แตกต่างกัน จอแสดงผลเสมือนจะปรากฏตรงกลางหน้าจอ
งานที่แสดงใน Surface
Control Center ขยายแชสซี Theme.CarUi.NoToolbar ให้เป็นหน้าต่างโปร่งแสง
ซึ่งหมายความว่าเมื่อเปิดศูนย์ควบคุมเหนืองาน ระบบจะส่งคืนงานใน CarActivityManager#getVisibleTasks ซึ่งจะช่วยให้สามารถมิเรอร์งานได้
รับข้อมูลการมิเรอร์
ศูนย์ควบคุมจะแจ้งให้แอปอื่นๆ ทราบถึงเซสชันการมิเรอร์ หากต้องการรับข้อมูลอัปเดต แอปต้องเชื่อมโยงกับ Control Center Service และส่งคลาส Handler
เป็นไคลเอ็นต์ที่รับและจัดการ Messages จาก Control
Center Service
แอปไคลเอ็นต์จะรับชื่อแพ็กเกจของแอปที่มิเรอร์และเปิดใช้
intent URIสำหรับกิจกรรมในศูนย์ควบคุมที่โฮสต์แอปที่มิเรอร์ด้วย
คีย์ต่อไปนี้ได้
_config_msg_mirroring_pkg_name_key__config_msg_mirroring_redirect_uri_key_
การกำหนดค่าเหล่านี้ต้องอยู่ในทรัพยากรของแอปไคลเอ็นต์และทรัพยากรของศูนย์ควบคุม
ศูนย์ควบคุมการแก้ไขข้อบกพร่อง
คลาส Logger จัดการบันทึกของศูนย์ควบคุม ซึ่งกำหนดค่าให้บังคับบันทึกได้
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)
}
}
...
แอปของระบบและความสามารถในการอัปเดต
เนื่องจากศูนย์ควบคุมเป็นแอปของระบบและมีการลงนามในแพลตฟอร์มเนื่องจากการใช้สิทธิ์แบบลายเซ็นเท่านั้น จึงต้องติดตั้งศูนย์ควบคุมไว้ล่วงหน้าในอุปกรณ์ และอัปเดตผ่าน OTA ได้เท่านั้น เช่นเดียวกับแอปสื่อในรถยนต์
สร้างศูนย์ควบคุมจากแหล่งที่มา
หากต้องการดูซอร์สโค้ดของศูนย์ควบคุม โปรดดูผสานรวมแอปที่ไม่ได้รวมกลุ่ม
ความเป็นส่วนตัวของผู้ใช้เมื่อใช้หลายจอภาพ
ศูนย์ควบคุมช่วยให้ผู้โดยสารทุกคนในรถดูข้อมูลสื่อบนจอแสดงผลทั้งหมดได้ Google ขอแนะนําให้คุณแทรกประกาศเกี่ยวกับนโยบายความเป็นส่วนตัวที่ไม่บล็อกเพื่อแจ้งให้ผู้ใช้ทราบ Google ขอแนะนำให้คุณดำเนินการนี้ที่ระดับระบบเมื่อลงชื่อเข้าใช้จอแสดงผล