Phần này cung cấp thông tin chi tiết về kỹ thuật dành riêng cho ứng dụng tham chiếu Trung tâm điều khiển.
Trung tâm điều khiển là một ứng dụng không đi kèm, có đặc quyền và được hệ thống ký. Ứng dụng này yêu cầu phiên bản SDK tối thiểu là 35 (Android V (API cấp 35)). Ứng dụng được cài đặt trong system/priv-app để sử dụng System APIs. Để đọc thông tin về nội dung nghe nhìn, ứng dụng phải được nền tảng ký. Bạn có thể cập nhật ứng dụng qua mạng không dây (OTA).
Dịch vụ nền
Ứng dụng Trung tâm điều khiển dựa vào một dịch vụ chạy ở chế độ nền để hoạt động.
Control Center Service được bắt đầu ở trạng thái user-post-unlocked trong vòng đời của người dùng bằng Vendor ServiceController. Trung tâm điều khiển phải luôn hoạt động và giao tiếp ở chế độ nền. Ứng dụng không thể dựa vào việc người dùng mở ứng dụng.
Control Center Service kết nối và giao tiếp với các thực thể khác của chính nó ở các khu vực của những người khác bằng cách sử dụng Communication API. Bạn cần đọc hướng dẫn tích hợp để hiểu cách các phiên bản Trung tâm điều khiển trên mỗi người dùng thiết lập kết nối cũng như gửi và nhận dữ liệu.
Liên lạc
Sau khi kết nối, Control Center Service sẽ giao tiếp với các đối tượng protobuf truyền tải thông tin. Để truyền protobuf sang một vùng cư trú khác bằng Communication APIs, protobuf sẽ được chuyển đổi thành byte array, payload object sẽ được tạo và Payload sẽ được gửi qua 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
}
}
//…
}
Dữ liệu
Thông tin về các vùng của người dùng được lưu trữ trong Control Center dưới dạng các đối tượng OccupantZoneData. Các thay đổi đối với OccupantZoneData cục bộ sẽ được gửi đến các phiên bản Control Center khác thông qua Comms API.
Khi Payload nhận được được phân tích cú pháp, dữ liệu đã phân tích cú pháp sẽ được truyền đến OccupantZoneStateRepository cục bộ. OccupantZoneStateRepository này sẽ thông báo cho các khung hiển thị về thay đổi. Hầu hết dữ liệu được truyền giữa các lớp bằng Kotlin flows on Android.
Xử lý yêu cầu về âm thanh loa buồng lái
Để tài xế luôn có thể nhận được yêu cầu của hành khách về việc phát âm thanh qua loa trong cabin, khi được tạo, Control Center Service của tài xế sẽ đăng ký Primary ZoneMedia Audio RequestCallback.
Lệnh gọi lại sẽ được thông báo về các lệnh gọi đến CarAudioManager#requestMediaAudioOnPrimaryZone. Trình điều khiển Control Center Service xử lý các yêu cầu bằng cách tạo một thông báo quan trọng (HUN) có thể được chấp nhận hoặc từ chối thông qua CarAudioManager#allowMediaAudioOnPrimaryZone(boolean).
Cùng xem video trên các màn hình khác
Tính năng cùng xem hoạt động nhờ Task Mirroring APIs trong CarActivityManager. TaskMirroringManager trước tiên sẽ tìm kiếm gói của ứng dụng MediaSession đang phát trong CarActivityManager#getVisibleTasks, sau đó tạo VirtualDisplay và di chuyển tác vụ hiển thị sang màn hình này thông qua CarActivityManager#moveRootTaskToDisplay.
Thao tác này sẽ trả về một mã thông báo IBinder mà MirroredSurfaceView có thể dùng trong một bố cục để hiển thị tác vụ thông qua MirroredSurfaceView#mirrorSurface.
Đối tượng Communication API Payload đã truyền mã thông báo đến các vùng khác có người cư trú.
Mỗi phiên bản Control Center trong các vùng cư trú đó sẽ khởi chạy một Mirroring activity và sử dụng mã thông báo đó để điền sẵn MirroredSurfaceView.
API phản chiếu tác vụ
Trung tâm điều khiển sử dụng các API phản chiếu tác vụ sau:
CarActivityManager#getVisibleTasks(int displayId)<ActivityManager.RunningTaskInfo> đã gọi cho tên người gửi hiển thị.CarActivityManager#moveRootTaskToDisplay(int virtualDisplayId)CarActivityManager#createTaskMirroringToken(int taskId)IBinder và phải được gọi sau khi tác vụ được chuyển sang màn hình ảo.MirroredSurfaceView#mirrorSurface(IBinder token)Các điểm hạn chế của tính năng phản chiếu tác vụ trong Trung tâm điều khiển
Trung tâm điều khiển chỉ hỗ trợ tính năng phản chiếu tác vụ cho các ứng dụng MediaSession.
Tuy nhiên, API này có thể phản ánh mọi tác vụ. Màn hình ảo được tạo bằng kích thước của màn hình người gửi. Nếu màn hình của thiết bị nhận sử dụng độ phân giải và kích thước khác, thì màn hình ảo sẽ xuất hiện ở giữa màn hình.
Việc cần làm xuất hiện trên giao diện
Trung tâm điều khiển mở rộng khung Theme.CarUi.NoToolbar thành một cửa sổ trong mờ. Điều này có nghĩa là khi Trung tâm điều khiển được mở trên một tác vụ, tác vụ đó sẽ được trả về trong CarActivityManager#getVisibleTasks, cho phép phản chiếu tác vụ.
Nhận thông tin phản chiếu
Trung tâm điều khiển sẽ thông báo cho các ứng dụng khác về phiên phản chiếu. Để nhận thông tin cập nhật, các ứng dụng phải liên kết với Control Center Service và gửi một lớp Handler làm ứng dụng khách, nhận và xử lý Messages từ Control
Center Service.
Các ứng dụng khách có thể nhận tên gói của ứng dụng được phản chiếu và khởi chạy một intent URI cho hoạt động trong Trung tâm điều khiển lưu trữ ứng dụng được phản chiếu bằng các khoá sau:
_config_msg_mirroring_pkg_name_key__config_msg_mirroring_redirect_uri_key_
Các cấu hình này phải có trong tài nguyên ứng dụng khách và trong tài nguyên của Trung tâm điều khiển.
Trung tâm điều khiển gỡ lỗi
Lớp Logger xử lý nhật ký của Trung tâm kiểm soát. Bạn có thể định cấu hình lớp này để buộc nhật ký.
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)
}
}
...
Ứng dụng hệ thống và khả năng cập nhật
Vì Trung tâm điều khiển là một ứng dụng hệ thống và được nền tảng ký do sử dụng các quyền chỉ dành cho chữ ký, nên Trung tâm điều khiển phải được cài đặt sẵn trên thiết bị và chỉ có thể cập nhật qua mạng (OTA), tương tự như Ứng dụng nội dung nghe nhìn trên ô tô.
Tạo Trung tâm điều khiển từ nguồn
Để lấy mã nguồn của Trung tâm điều khiển, hãy xem phần Tích hợp các ứng dụng không đi kèm.
Quyền riêng tư của người dùng khi sử dụng nhiều màn hình
Control Center (Trung tâm kiểm soát) cho phép tất cả hành khách trên xe xem thông tin về nội dung nghe nhìn trên mọi màn hình. Bạn nên chèn một thông báo về quyền riêng tư không chặn để thông báo cho người dùng. Bạn nên thực hiện việc này ở cấp hệ thống, khi đăng nhập vào một màn hình.