Teknik ayrıntılar

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.

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

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

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

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.

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