Bu bölümde, Control Center referans uygulamasına özgü teknik ayrıntılar verilmektedir.
Denetim Merkezi, minimum SDK sürümü 35 (Android V (API düzeyi 35)) gerektiren, paketlenmemiş, ayrıcalıklı ve sistem tarafından imzalanmış bir uygulamadır. System APIs özelliğini kullanmak için uygulama system/priv-app konumuna yüklenir. Uygulamanın medya bilgilerini okuyabilmesi için platform imzalı olması gerekir. Uygulamayı kablosuz olarak (OTA) güncelleyebilirsiniz.
Arka plan hizmeti
Kontrol Merkezi uygulaması, işlevselliği için arka plan hizmetini kullanır.
Control Center Service, Vendor ServiceController tarafından kullanıcı yaşam döngüsündeki user-post-unlocked durumunda başlatılır. Kontrol Merkezi her zaman etkin olmalı ve arka planda iletişim kurmalıdır. Uygulama, kullanıcının uygulamayı açmasına bağlı olamaz.
Control Center Service, Communication API'yi kullanarak diğer yolcu bölgelerindeki diğer örnekleriyle bağlantı kurar ve iletişim kurar. Her kullanıcının Kontrol Merkezi örneklerinin nasıl bağlantı kurduğunu, veri gönderip aldığını anlamak için entegrasyon kılavuzunu okumanız gerekir.
İletişim
Bağlandıktan sonra Control Center Service, bilgi aktaran protobuf nesneleriyle iletişim kurar. protobuf ile Communication APIs'yi başka bir yolcu bölgesine aktarmak için protobuf, byte array'ye dönüştürülür, payload object oluşturulur ve Payload, CarOccupantConnectionManager#sendPayload üzerinden gönderilir.
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
}
}
//…
}
Veri
Yolcu bölgeleriyle ilgili bilgiler, Kontrol Merkezi'nde OccupantZoneData nesneleri şeklinde saklanır. Yerel OccupantZoneData dosyasında yapılan değişiklikler, Comms API üzerinden diğer Kontrol Merkezi örneklerine gönderilir.
Alınan Payload ayrıştırıldığında, ayrıştırılan veriler yerel OccupantZoneStateRepository aktarılır. Bu da görünümlere değişiklik hakkında bildirim gönderir. Verilerin çoğu, sınıflar arasında Kotlin flows on Android ile aktarılır.
Kabin hoparlör ses isteklerini yönetme
Sürücünün, oluşturulduğunda Control Center Service yolcuların kabin hoparlörlerinde ses çalma isteklerini her zaman alabilmesi için sürücünün Control Center Service Primary ZoneMedia Audio RequestCallback kaydını yapar.
Geri çağırma işlevi, CarAudioManager#requestMediaAudioOnPrimaryZone için yapılan aramalar hakkında bilgilendirilir. Sürücü, Control Center Service aracılığıyla istekleri, CarAudioManager#allowMediaAudioOnPrimaryZone(boolean) üzerinden kabul edilebilen veya reddedilebilen bir uyarı bildirimi (HUN) oluşturarak işler.
Diğer ekranlarla birlikte video izleme
Birlikte izleme özelliği, CarActivityManager içindeki Task Mirroring APIs sayesinde çalışır. TaskMirroringManager, önce oynatılan MediaSession uygulamasının CarActivityManager#getVisibleTasks içindeki paketini arar, ardından VirtualDisplay oluşturur ve görünür görevi CarActivityManager#moveRootTaskToDisplay aracılığıyla bu ekrana taşır.
Bu, MirroredSurfaceView öğesinin görevi MirroredSurfaceView#mirrorSurface aracılığıyla göstermek için bir düzende kullanabileceği IBinder jetonunu döndürür.
Communication API Payload nesnesi, jetonu diğer işgalci bölgelere iletti.
Bu işgalci bölgelerindeki her Kontrol Merkezi örneği bir Mirroring activity başlatır ve MirroredSurfaceView öğesini doldurmak için bu jetonu kullanır.
Görev yansıtma API'leri
Kontrol Merkezi şu görev yansıtma API'lerini kullanır:
CarActivityManager#getVisibleTasks(int displayId)<ActivityManager.RunningTaskInfo>, gönderen ekranı için çağrıldı.CarActivityManager#moveRootTaskToDisplay(int virtualDisplayId)CarActivityManager#createTaskMirroringToken(int taskId)IBinder jetonunu yansıtacak bir görev oluşturur ve görev sanal ekrana taşındıktan sonra çağrılmalıdır.MirroredSurfaceView#mirrorSurface(IBinder token)Kontrol Merkezi'ndeki görev yansıtma özelliğinin sınırlamaları
Kontrol Merkezi yalnızca MediaSession uygulamalarında görev yansıtmayı destekler.
Ancak API, herhangi bir görevi yansıtabilir. Sanal ekran, gönderen ekranının boyutlarıyla oluşturulur. Alıcının ekranı farklı çözünürlükler ve boyutlar kullanıyorsa sanal ekran, ekranın ortasında görünür.
Yüzeyde görünen görevler
Kontrol Merkezi, şasiyi Theme.CarUi.NoToolbar yarı saydam bir pencere olacak şekilde genişletir. Bu, bir görevin üzerinde Kontrol Merkezi açıldığında görevin CarActivityManager#getVisibleTasks olarak döndürüldüğü anlamına gelir. Bu sayede görev yansıtılabilir.
Yansıtma bilgilerini alma
Kontrol Merkezi, diğer uygulamaları yansıtma oturumları hakkında bilgilendirir. Güncellemeleri alabilmek için uygulamaların Control Center Service hizmetine bağlanması ve Handler sınıfını istemci olarak göndermesi gerekir. Bu sınıf, Control
Center Service hizmetinden Messages alır ve işler.
İstemci uygulamaları, yansıtılan uygulamanın paket adını alabilir ve yansıtılan uygulamayı barındıran Kontrol Merkezi'ndeki etkinlik için şu anahtarlarla bir intent URI başlatabilir:
_config_msg_mirroring_pkg_name_key__config_msg_mirroring_redirect_uri_key_
Bu yapılandırmalar, istemci uygulaması kaynaklarında ve Kontrol Merkezi kaynaklarında bulunmalıdır.
Hata Ayıklama Kontrol Merkezi
Logger sınıfı, günlükleri zorunlu kılacak şekilde yapılandırılabilen Kontrol Merkezi günlüklerini işler.
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)
}
}
...
Sistem uygulaması ve güncellenebilirlik
Kontrol Merkezi, sistem uygulaması olduğundan ve yalnızca imza izni kullanıldığı için platform imzalı olduğundan Kontrol Merkezi'nin cihaza önceden yüklenmesi gerekir. Ayrıca, Araba Medya Uygulaması'na benzer şekilde yalnızca OTA üzerinden güncellenebilir.
Kontrol Merkezi'ni kaynaktan derleme
Denetim Merkezi kaynak kodunu almak için Paketlenmemiş uygulamaları entegre etme başlıklı makaleyi inceleyin.
Çoklu ekranlarda kullanıcı gizliliği
Kontrol Merkezi, araçtaki tüm yolcuların tüm ekranlarda medya bilgilerini görüntülemesine olanak tanır. Google, kullanıcıları bilgilendirmek için engelleyici olmayan bir gizlilik bildirimi eklemenizi önerir. Google, bunu bir ekranda oturum açtığınızda sistem düzeyinde yapmanızı önerir.