Teknik ayrıntılar

Bu bölümde, Kontrol Merkezi referans uygulamasına özgü teknik ayrıntılar verilmektedir.

Kontrol 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 hizmetine bağlıdır. Control Center Service, Vendor ServiceController tarafından kullanıcı yaşam döngüsünün 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 ve veri gönderip aldığını anlamak için entegrasyon kılavuzunu okumanız gerekir.

Control Center Service'in Vendor ServiceController tarafından başlatıldığını gösteren şema.
Şekil 5. Control Center Service, Vendor ServiceController tarafından başlatıldı.

İletişim

Bağlandıktan sonra Control Center Service, bilgi aktaran protobuf nesneleriyle iletişim kurar. protobuf'yı Communication APIs ile 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
                 }
             }
             //…
}

Veriler

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 öğesine iletilir. Bu öğe de görünümlere değişikliği bildirir. Verilerin çoğu, sınıflar arasında Kotlin flows on Android ile aktarılır.

Kabin hoparlöründen gelen ses isteklerini yönetme

Sürücü, oluşturulduğunda Control Center Service yolcuların kabin hoparlörlerinde ses çalma isteklerini her zaman alabilmesi için Primary ZoneMedia Audio RequestCallback kaydeder.

Geri arama, CarAudioManager#requestMediaAudioOnPrimaryZone numarasına yapılan aramalar konusunda 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 üzerinden göstermek için bir düzende kullanabileceği bir IBinder jetonu döndürür. Communication API Payload nesnesi, jetonu diğer işgal bölümlerine iletti.

Bu işgalci bölgelerindeki her bir Kontrol Merkezi örneği bir Mirroring activity başlatır ve MirroredSurfaceView'yi doldurmak için bu jetonu kullanır.

Bir görevi başka bir ekranda göstermek için yansıtma jetonunun akışı.
Şekil 6. Jeton akışını yansıtma

Görev yansıtma API'leri

Denetim Merkezi şu görev yansıtma API'lerini kullanır:

CarActivityManager#getVisibleTasks(int displayId)
<ActivityManager.RunningTaskInfo>, gönderenin görünen adı için arandı.

CarActivityManager#moveRootTaskToDisplay(int virtualDisplayId)
Seçilen görünür görevi oluşturulan sanal ekrana taşır.

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)
|Sanal ekranın içeriğini görüntülemek için jetonu kullanan özel bir görünüm nesnesi.

Denetim Merkezi'nde görev yansıtmayla ilgili 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örev üzerinde Kontrol Merkezi açıldığında görevin CarActivityManager#getVisibleTasks içinde 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 Control Center Service hizmetinden Messages alan ve işleyen bir Handler sınıfı göndermesi gerekir.

İ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.

İstemci uygulamaları, Kontrol Merkezi&#39;nden yansıtma bilgileri alır.
Şekil 7. Kontrol Merkezi'nden yansıtma bilgileri alma.

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, yalnızca imza izinlerinin kullanılması nedeniyle sistem uygulaması ve platform imzalı olduğundan Kontrol Merkezi'nin cihaza önceden yüklenmesi gerekir ve Araba Medya Uygulaması'na benzer şekilde yalnızca OTA üzerinden güncellenebilir.

Kontrol Merkezi'ni kaynaktan derleme

Denetim Merkezi kaynak kodunu edinmek için Ayrı olarak sunulan 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 Uyarısı eklemenizi önerir. Google, bunu bir ekranda oturum açtığınızda sistem düzeyinde yapmanızı önerir.