Park edilmiş uygulamanıza Android Automotive OS desteği ekleme

Uygulamanızı Android Automotive OS cihazlara dağıtırken form faktörüne özgü bazı hususları göz önünde bulundurmanız gerekir. Bu kılavuzda bu hususlar açıklanmaktadır.

Mevcut uygulamanızı Android Automotive OS emülatöründe test etme

Uygulamanızı Android Automotive OS için oluşturmaya başlamak üzere önce mevcut uygulamanızı bir Android Automotive OS emülatöründe test edin. Bir emülatör ayarlamak için Android Automotive OS emülatörünü kullanarak test etme başlıklı makaledeki adımları uygulayın. Ardından, Uygulamanızı emülatörde çalıştırma başlıklı makaledeki talimatları uygulayarak uygulamayı çalıştırabilirsiniz.

Uygulamanızı çalıştırırken aşağıdakiler gibi uyumluluk sorunlarına dikkat edin:

  • Bilgi-eğlence ekranlarının yönü sabittir. Araba uygulaması kalite yönergelerini karşılamak için uygulamaların hem dikey hem de yatay yönleri desteklemesi gerekir.
  • Diğer cihazlarda kullanılabilen API'ler Android Automotive OS'te kullanılamayabilir. Örneğin, bazı Google Play Hizmetleri API'leri Android Automotive OS'te kullanılamaz. Bu sorunların nasıl ele alınacağı hakkında ayrıntılı bilgi için Özellikleri devre dışı bırakma bölümüne bakın.

Uygulamanızın manifest dosyasını yapılandırma

Android Automotive OS cihazları hedeflemek için uygulamanızda belirli manifest girişleri olmalıdır. Android Automotive OS cihazlara dağıtım özelliğini etkinleştirdikten sonra, uyumlu uygulamalar arabalarda kullanıma uygun olduklarından emin olmak için manuel bir inceleme sürecinden geçer. Daha fazla bilgi için Araçlara dağıtın başlıklı makaleyi inceleyin.

Gerekli Android Automotive OS özellikleri

Android Automotive OS için oluşturulan tüm uygulamaların Google Play kullanılarak dağıtılabilmesi için belirli koşulları karşılaması gerekir. Daha fazla bilgi için Google Play özellik koşullarını karşılama başlıklı makaleyi inceleyin.

Kategoriye özel manifest girişleri

Park edilmiş tüm uygulamalar için geçerli olan önceki şartlara ek olarak, video ve oyun kategorileri için ek şartlar vardır:

Sürücünün dikkatinin dağılmasıyla ilgili koşulları karşılama

Uygulamanızı arabalara sunarken sürücünün dikkatinin dağılmaması çok önemlidir. Park edilmiş uygulamalarda bu, öncelikle DD-2 ve DD-3 kalite yönergelerinde belirtildiği gibi, kullanıcı deneyimi (UX) kısıtlamaları etkinken uygulamanızın kullanılmasının veya ses çalmasının engellenmesi yoluyla gerçekleştirilir.

Kullanıcı deneyimi kısıtlamaları etkinken kullanımı engelleme

Varsayılan olarak, kullanıcı deneyimi kısıtlamaları etkinken etkinlikler kullanılamaz veya başlatılamaz. Bu davranışın uygulamanız için geçerli olması amacıyla, manifest dosyanızdaki herhangi bir <activity> öğesinde aşağıdaki <meta-data> öğesi bulunmamalıdır:

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

Kullanıcı deneyimi kısıtlamaları etkinleştiğinde uygulamanızdaki bir etkinlik Devam ettirilirse bu etkinlik, işletim sisteminin sahip olduğu bir etkinlik tarafından gizlenir.

En azından uygulamanızın etkinliği Duraklatıldı yaşam döngüsü durumuna geçer. Bu, uygulamanızdan hem video hem de ses oynatmayı duraklatmanız gereken bir onPause() yaşam döngüsü geri çağırma işlevi olarak gerçekleşir.

Android Automotive OS uyumluluk modunu içeren cihazlarda sistem engellemesi, uygulamanızın etkinliklerinin Duraklatıldı durumundan Durdurulandı durumuna geçiş yapmasına neden olur.

Oynatma işlemini durdurma ve oynatmanın devam etmesini engelleme

Bazı uygulamalarda, sürücünün dikkatini dağıtma şartlarını karşılamak için onPause() sırasında oynatmayı duraklatma ve onResume()'a kadar oynatmanın devam etmesini engellemek üzere izleme durumu yeterlidir.

Yaşam döngüsü geri çağırmalarına yanıt vermek uygulamanız için yeterli değilse aşağıdaki bölümde açıklandığı gibi doğrudan kullanıcı deneyimi kısıtlama durumunu dinleyebilirsiniz. Örneğin, pencere içinde pencere özelliğini destekleyen uygulamalar, yaşam döngüsü geri çağırmalarında koşullu kontroller yapmak yerine doğrudan dinlemeyi tercih edebilir.

Kullanıcı deneyimi kısıtlamalarını dinleyin

Kullanıcı deneyimi kısıtlamalarını dinlemek için önce uygulama modülünüzün build.gradle dosyasına android.car kitaplığına bağımlılık ekleyin. Bu, Android Automotive OS'e özgü API'ler sağlayan Android SDK'sının bir uzantısıdır.

android {
    ...
    useLibrary("android.car")
}

Kullanıcı deneyimi kısıtlama durumunu okumak için CarUxRestrictionsManager simgesini kullanın. Kullanıcı deneyimi kısıtlamaları bir araçtaki ekrandan ekrana değişebileceğinden, kullanıcı deneyimi kısıtlama durumunu vites veya hız gibi diğer donanım durumlarından belirlemeye çalışmayın.

val car = Car.createCar(context)
val carUxRestrictionsManager =
    car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE) as CarUxRestrictionsManager

// You can either read the state directly ...
val currentUxRestrictions = carUxRestrictionsManager.currentUxRestrictions

// or listen to state changes
carUxRestrictionsManager.registerListener { carUxRestrictions: CarUxRestrictions -> ...}

// Don't forget to teardown and release resources when they're no longer needed
carUxRestrictionsManager.unregisterListener()
car.disconnect()

CarUxRestrictions tarafından sağlanan ve uygulamanızın referans vermesi gereken tek değer, isRequiresDistractionOptimization() işlevinin döndürdüğü değerdir. Diğer değerler yalnızca dikkat dağıtıcı unsurlar için optimize edilmiş olarak işaretlenen etkinliklerle ilgilidir.

Uygulamanızı test etme

Uygulamanızın sürücünün dikkatini dağıtan unsurlarla ilgili koşulları karşıladığını doğrulamak için aşağıdaki prosedürü uygulayın:

  1. Uygulamanızı Google Play Store veya Uyumluluk modu olmadan bir sistem resmine yükleyin.
  2. Başlatıcı uygulama ızgarası açıkken araç kullanmayı simüle edin ve uygulamanızın açılamadığını doğrulayın.
  3. Sürüş simülasyonunu durdurun, uygulamanızı oynatma ekranına getirin ve oynatmaya başlayın.
  4. Sürüş simülasyonunu tekrar yapın ve oynatmanın duraklatıldığını doğrulayın.
    1. Uygulamanız MediaSession ile entegrasyonu destekliyorsa adb shell cmd media_session dispatch play'ü kullanın ve oynatmanın devam etmediğini doğrulayın.

Uygulamanızı Android Automotive OS için optimize etme

Kullanıcılarınıza arabalarda mümkün olan en iyi deneyimi sunmak için Android Automotive OS için uygulamanızı oluştururken aşağıdakileri göz önünde bulundurun:

Pencere içe eklemeleri ve ekran kesikleriyle çalışma

Diğer form faktörlerinde olduğu gibi Android Automotive OS de durum ve gezinme çubukları gibi sistem kullanıcı arayüzü öğelerini ve dikdörtgen olmayan ekranları destekler.

Varsayılan olarak uygulamalar, sistem çubuklarıyla veya ekran kesikleriyle çakışmayan bir alanda çizilir. Ancak uygulamanızın sistem çubuklarını gizlemesini, arkalarında içerik çizmesini veya Uygulamanızı pencere içlerinde düzenleyin bölümünde açıklandığı gibi ekranda bir kesitte içerik göstermesini isteyebilirsiniz. Uygulamanız bu işlemlerin herhangi birini yapıyorsa uygulamanızın Android Automotive OS cihazlarının ekosisteminde sorunsuz şekilde çalışması için aşağıdaki alt bölümlere bakın.

Sistem çubukları, tam ekran modu ve uçtan uca oluşturma

Araçlardaki sistem çubukları, diğer form faktörlerine göre farklı boyut ve konumda olabilir. Örneğin, gezinme çubukları ekranın sol, sağ veya alt tarafına yerleştirilebilir. Üstte bir durum çubuğu ve altta bir gezinme çubuğu olsa bile (çoğu telefon ve tablette olduğu gibi), bu öğelerin boyutu arabalarda muhtemelen çok daha büyük olacaktır.

Ayrıca Android Automotive OS, OEM'lerin uygulamaların tam sayfa moduna girmek ve bu moddan çıkmak için sistem çubuklarını gösterip gizlemeyeceğini kontrol etmesine olanak tanır. Örneğin, OEM'ler uygulamaların sistem çubuklarını gizlemesini engelleyerek klima kontrolleri gibi araç kontrollerinin ekranda her zaman erişilebilir olmasını sağlayabilir. Bir OEM, uygulamaların sistem çubuklarını kontrol etmesini engellediyse bir uygulama, sistem çubuklarını göstermek veya gizlemek için WindowInsetsController (veya WindowInsetsControllerCompat) API'lerini çağırdığında hiçbir şey olmaz. Uygulamanızın içe eklemeleri değiştirip değiştiremediğini nasıl algılayacağınız hakkında daha fazla bilgi edinmek için show ve hide dokümanlarına bakın.

Benzer şekilde OEM'ler, sistem çubuklarının ve barların içerdiği öğelerin her zaman net bir şekilde görülebilmesi için uygulamaların sistem çubuklarının rengini ve saydamlığını ayarlayıp ayarlayamayacağını da kontrol edebilir. Uygulamanız kenardan kenara çiziyorsa sistem çubuklarının arkasında yalnızca kritik olmayan içeriğin çizildiğinden emin olun. Cihaz OEM'si çubukların rengini veya saydamlığını ayarlamayı engelliyorsa bu içerik görünmeyebilir.

<!-- Depending on OEM configuration, these style declarations
     (and the corresponding runtime calls) may be ignored -->
<style name="...">
  <item name="android:statusBarColor">...</item>
  <item name="android:navigationBarColor">...</item>
  <item name="android:windowTranslucentStatus">...</item>
  <item name="android:windowTranslucentNavigation">...</status>
</style>

Uygulamanız kenardan kenara uzanıyorsa sistem çubuklarının boyutu, sayısı, türü veya konumu hakkında varsayımlarda bulunmayın. Bunun yerine, uygulamanızın içeriğini sistem çubuklarına göre yerleştirmek için pencere içe ekleme API'lerini kullanın. Bu API'lerin nasıl kullanılacağı hakkında daha fazla bilgi için Uygulamanızda içeriği kenarlara kadar görüntüleme başlıklı makaleyi inceleyin. Sabit kodlanmış dolgu değerleri hiçbir form faktörü için önerilmez ancak arabalarda içeriği güvenli alanda tutmak için muhtemelen işe yaramaz.

Düzensiz şekilli ekranlara uyum sağlama

Bazı araçlarda dikdörtgen ekranlara ek olarak Şekil 1'de gösterildiği gibi düzensiz şekilli ekranlar da bulunabilir:

Sağ tarafı kavisli bir ekrana sahip Android Automotive OS cihazın şeması.
Şekil 1: Sağ tarafı kavisli bir ekrana sahip Android Automotive OS cihaz. Yeşil alan, eğrinin ekrandaki kesiğinin sınır kutusuyla çakışmayan güvenli dikdörtgendir.

Uygulamanız kenardan kenara oluşturulmuyorsa güvenli alanda oluşturulması için herhangi bir işlem yapmanız gerekmez.

Uygulamanız uçtan uca oluşturuluyorsa ekrandaki kesiklerle ilgili nasıl davranmasını istediğinizi seçebilirsiniz. Bunu, uygulamanızın teması için android:windowLayoutInDisplayCutoutMode özelliğini ayarlayarak veya çalışma zamanında pencerenin layoutInDisplayCutoutMode özelliğini değiştirerek kaynaklardan yararlanarak yapabilirsiniz.

Android Automotive OS cihazlarındaki ekran kesiklerinin türleri mobil cihazlardaki kesiklerden farklı olduğundan, mobil cihazlardaki kesiklerle uyumlu şekilde optimize edilmiş davranışa sahip LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT veya LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES öğelerini kullanmayın. Bunun yerine, kesme noktasını her zaman atlamak veya her zaman girmek için LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER veya LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS kullanın. İkincisini seçerken, ekran kesikleriyle ilgili API'ler hakkında daha fazla bilgi için Ekran kesiklerini destekleme başlıklı makaleyi inceleyin.

Uygulamanız ekrandaki kesik alana oluşturuluyorsa ve Android Automotive OS ile mobil cihazlar arasında farklı bir davranış olmasını istiyorsanız uygulamanız bu davranışı çalışma zamanında ayarlıyorsa Özellikleri devre dışı bırakma başlıklı makaleyi, uygulamanız bu davranışı kaynak dosyaları kullanarak ayarlıyorsa Alternatif kaynaklar kullanma başlıklı makaleyi inceleyin.

Özellikleri devre dışı bırakma

Mevcut bir mobil uygulamayı Android Automotive OS'te kullanıma sunuyorsanız belirli özellikler ve işlevler alakalı olmayabilir veya kullanılamayabilir. Örneğin, arabalar genellikle kameralara erişim sağlamaz. Ayrıca Android Automotive OS'te yalnızca Google Play Hizmetleri'nin bir alt kümesi kullanılabilir. Daha fazla bilgi için Arabalar için Google Play Hizmetleri başlıklı makaleyi inceleyin.

Uygulamanın Android Automotive OS'te çalışıp çalışmadığını tespit etmek için PackageManager.hasSystemFeature API'sini kullanabilirsiniz. Bunun için aşağıdaki örnekte gösterildiği gibi FEATURE_AUTOMOTIVE özelliğini kontrol edebilirsiniz:

Kotlin

val packageManager: PackageManager = ... // Get a PackageManager from a Context
val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

Java

PackageManager packageManager = ... // Get a PackageManager from a Context
boolean isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
  // Enable or disable a given feature
}

Alternatif olarak, uygulamanızda Android Auto bileşeni de varsa uygulamanın Android Automotive OS'te mi yoksa Android Auto'da mı çalıştığını ya da hiç araca bağlı olup olmadığını tespit etmek için Arabalar için Android Uygulama Kitaplığı'ndaki CarConnection API'sini kullanabilirsiniz.

Resim içinde resim (PiP) özelliğinin kullanılabilir olup olmadığını kontrol etmek ve uygun şekilde tepki vermek için belirlenmiş en iyi uygulamaları uygulayın.

Çevrimdışı senaryoları işleme

Arabalar giderek daha fazla internete bağlansa da uygulamaların internet bağlantısı olmadan çalışmasını sağlamak önerilir. Örneğin, aşağıdaki durumlarda:

  • Kullanıcılar, otomobil üreticisinin abonelik paketi kapsamında sunulan mobil verileri devre dışı bırakabilir.
  • Mobil verilere erişim bazı bölgelerde sınırlı olabilir.
  • Kablosuz radyo bulunan araçlar kablosuz kapsama alanında olmayabilir veya OEM, mobil ağ tercih ettiği için kablosuz bağlantıyı kapatmış olabilir.

İnternet erişimine bağlı işlevleri (ör. çevrimdışı içerik sunarak) uygun şekilde azaltarak uygulamanızda bu senaryoları ele almaya hazır olun. Daha fazla bilgi için ağları optimize etmeyle ilgili en iyi uygulamalara bakın.

Alternatif kaynaklar kullanma

Uygulamanızı arabalara uyarlamak için Android Automotive OS aracında çalışırken alternatif kaynaklar sağlamak amacıyla car kaynak tanımlayıcısı kullanabilirsiniz. Örneğin, dolgu değerlerini depolamak için boyut kaynaklarını kullanıyorsanız dokunma hedeflerini büyütmek için car kaynak kümesi için daha büyük bir değer kullanabilirsiniz.