Android Automotive OS, kullanıcıların arabaya uygulama yüklemesine olanak tanır. Bu platformda kullanıcılara ulaşabilmek için Android Automotive OS ile uyumlu ve sürücüye göre optimize edilmiş uygulamalar dağıtmanız gerekir. Android Auto uygulamanızda hemen hemen tüm kod ve kaynakları yeniden kullanabilirsiniz. Ancak bu sayfadaki şartları karşılayan ayrı bir derleme oluşturmanız gerekir.
Geliştirmeye genel bakış
Android Automotive OS desteği eklemek için aşağıdaki bölümlerde açıklandığı gibi yalnızca birkaç adım gerekir:
- Android Studio'da otomotiv özelliklerini etkinleştirin.
- Otomotiv modülü oluşturun.
- Gradle bağımlılıklarınızı güncelleyin.
- İsteğe bağlı olarak, ayarları uygulayın ve oturum açma etkinliklerini gerçekleştirin.
- İsteğe bağlı olarak, Medya barındırıcısı ipuçlarını okuyun.
Tasarım konusunda dikkat edilmesi gereken noktalar
Android Automotive OS, uygulamanızın medya tarayıcı hizmetinden aldığı medya içeriklerini yerleştirir. Bu, uygulamanızın kullanıcı medya oynatmayı tetiklediğinde kullanıcı arayüzünü çizmediği ve etkinliklerinizden herhangi birini başlatmadığı anlamına gelir.
Ayarları veya oturum açma etkinliklerini uyguluyorsanız bu etkinlikler araca göre optimize edilmiş olmalıdır. Uygulamanızın bu alanlarını tasarlarken Android Automotive OS için Tasarım yönergeleri'ne bakın.
Projenizi oluşturma
Android Automotive OS desteğini etkinleştirmek için uygulamanızın projesinin çeşitli bölümlerini ayarlamanız gerekir.
Android Studio'da otomotiv özelliklerini etkinleştirme
Tüm Automotive OS özelliklerinin etkinleştirildiğinden emin olmak için Android Studio 4.0 veya sonraki bir sürümünü kullanın.
Otomotiv modülü oluşturma
Android Automotive OS'in bazı bileşenleri (ör. manifest) platforma özel gereksinimlere sahiptir. Bu bileşenlerin kodunu, projenizdeki diğer kodlardan (ör. telefon uygulamanız için kullanılan kod) ayrı tutabilecek bir modül oluşturun.
Projenize otomotiv modülü eklemek için aşağıdaki adımları uygulayın:
- Android Studio'da File > New > New Module'u (Dosya > Yeni > Yeni Modül) tıklayın.
- Otomotiv Modülü'nü seçin ve Sonraki'yi tıklayın.
- Bir Uygulama/Kitaplık adı girin. Bu, kullanıcıların Android Automotive OS'te uygulamanız için gördüğü addır.
- Bir Modül adı girin.
- Paket adını uygulamanızla eşleşecek şekilde ayarlayın.
Minimum SDK için API 28: Android 9.0 (Pie)'yi seçin ve Sonraki'yi tıklayın.
Android Automotive OS'i destekleyen tüm arabalar Android 9 (API düzeyi 28) veya sonraki sürümlerde çalışır. Bu nedenle, bu değeri seçtiğinizde tüm uyumlu arabalar hedeflenir.
Etkinlik Yok'u seçin ve Son'u tıklayın.
Android Studio'da modülünüzü oluşturduktan sonra yeni otomotiv modülünüzde AndroidManifest.xml dosyasını açın:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.media">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" />
<uses-feature
android:name="android.hardware.type.automotive"
android:required="true" />
</manifest>
<application> öğesinde bazı standart uygulama bilgilerinin yanı sıra Android Automotive OS desteğini bildiren bir <uses-feature> öğesi bulunur.
Manifest'te herhangi bir etkinlik tanımlanmadığını unutmayın.
Ayarları veya oturum açma etkinliklerini uyguluyorsanız bunları buraya ekleyin. Bu etkinlikler, sistem tarafından açık amaçlar kullanılarak tetiklenir ve Android Automotive OS uygulamanızın manifest dosyasında bildirdiğiniz tek etkinliklerdir.
Ayarları veya oturum açma etkinliklerini ekledikten sonra, <application> öğesinin android:appCategory özelliğini "audio" olarak ayarlayarak manifest dosyanızı tamamlayın.
<application
...
android:appCategory="audio" />
Özellik şartlarını beyan etme
Android Automotive OS için oluşturulan tüm uygulamaların Google Play üzerinden dağıtılabilmesi için belirli koşulları karşılaması gerekir. Daha fazla bilgi için Google Play özellikleriyle ilgili koşulları karşılama başlıklı makaleyi inceleyin.
Android Automotive OS için medya desteği beyan etme
Uygulamanızın Android Automotive OS'i desteklediğini belirtmek için aşağıdaki manifest girişini kullanın:
<application>
...
<meta-data android:name="com.android.automotive"
android:resource="@xml/automotive_app_desc"/>
...
</application>
Bu manifest girişi, uygulamanızın desteklediği otomotiv özelliklerini bildiren bir XML dosyasını ifade eder.
Bir medya uygulamanız olduğunu belirtmek için projenizdeki res/xml/ dizinine automotive_app_desc.xml adlı bir XML dosyası ekleyin. Bu dosyaya aşağıdaki içerikleri ekleyin:
<automotiveApp>
<uses name="media"/>
</automotiveApp>
Niyet filtreleri
Android Automotive OS, medya uygulamanızdaki etkinlikleri tetiklemek için açık amaçları kullanır. Manifesto dosyasına CATEGORY_LAUNCHER veya ACTION_MAIN amaç filtrelerine sahip etkinlikler eklemeyin.
Aşağıdaki örnekteki gibi etkinlikler genellikle bir telefonu veya başka bir mobil cihazı hedef alır. Bu etkinlikleri, Android Automotive OS uygulamanızı oluşturan modülde değil, telefon uygulamasını oluşturan modülde bildirin.
<activity android:name=".MyActivity">
<intent-filter>
<!-- You can't use either of these intents for Android Automotive OS -->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<!--
In their place, you can include other intent filters for any activities
that your app needs for Android Automotive OS, such as settings or
sign-in activities.
-->
</intent-filter>
</activity>
Gradle bağımlılıklarınızı güncelleme
Medya tarayıcı hizmetinizi telefon uygulamanız ve otomotiv modülünüz arasında paylaştığınız ayrı bir modülde tutmanızı öneririz. Bu yaklaşımı kullanıyorsanız aşağıdaki snippet'te gösterildiği gibi, paylaşılan modülü içerecek şekilde otomotiv modülünüzü güncellemeniz gerekir:
my-auto-module/build.gradle
Modern
buildscript { ... dependencies { ... implementation project(':shared_module_name') } }
Kotlin
buildscript { ... dependencies { ... implementation(project(":shared_module_name")) } }
Ayarları ve oturum açma etkinliklerini uygulama
Medya tarayıcı hizmetinize ek olarak, Android Automotive OS uygulamanız için araca göre optimize edilmiş ayarlar ve oturum açma etkinlikleri de sağlayabilirsiniz. Bu etkinlikler, Android Media API'lerinde yer almayan uygulama işlevselliğini sunmanıza olanak tanır.
Bu etkinlikleri yalnızca Android Automotive OS uygulamanızın kullanıcıların oturum açmasına veya uygulama ayarlarını belirtmesine izin vermesi gerekiyorsa uygulayın. Bu etkinlikler Android Auto tarafından kullanılmaz.
Etkinlik iş akışları
Aşağıdaki diyagramda, kullanıcının Android Automotive OS kullanarak ayarlarınızla ve oturum açma etkinliklerinizle nasıl etkileşimde bulunduğu gösterilmektedir:
Şekil 1. Ayarlar ve oturum açma etkinliği iş akışları.
Ayarlarınızda ve oturum açma etkinliklerinizde dikkat dağıtıcı unsurları azaltma
Ayarlarınızın ve oturum açma etkinliklerinizin yalnızca kullanıcının aracı park hâlindeyken kullanılabilmesini sağlamak için <activity> öğelerinin aşağıdaki <meta-data> öğesini içermediğini doğrulayın. Böyle bir öğe varsa uygulamanız inceleme sırasında reddedilir.
<!-- NOT ALLOWED -->
<meta-data
android:name="distractionOptimized"
android:value="true"/>
Ayarlar etkinliği ekleme
Kullanıcıların uygulamanızın ayarlarını arabalarında yapılandırabilmesi için araca göre optimize edilmiş bir ayarlar etkinliği ekleyebilirsiniz. Ayarlarınızdaki etkinlik, kullanıcının hesabında oturum açma veya kapatma ya da kullanıcı hesapları arasında geçiş yapma gibi başka iş akışları da sağlayabilir. Bu etkinliğin yalnızca Android Automotive OS'te çalışan bir uygulama tarafından tetiklendiğini unutmayın. Android Auto'ya bağlı telefon uygulamaları bu izni kullanmaz.
Ayarlar etkinliği bildirme
Aşağıdaki kod snippet'inde gösterildiği gibi, ayarlar etkinliğinizi uygulamanızın manifesto dosyasında beyan etmeniz gerekir:
<application>
...
<activity android:name=".AppSettingsActivity"
android:exported="true"
android:theme="@style/SettingsActivity"
android:label="@string/app_settings_activity_title">
<intent-filter>
<action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
</intent-filter>
</activity>
...
</application>
Ayarlar etkinliğinizi uygulama
Bir kullanıcı uygulamanızı başlattığında Android Automotive OS, bildirdiğiniz ayarlar etkinliğini algılar ve bir simge gibi bir kolaylık gösterir.
Kullanıcı, Activity kitaplığı'na gitmek için arabanın ekranını kullanarak bu uygunluk'a dokunabilir veya uygunluk'u seçebilir. Android Automotive OS, uygulamanıza ayarlar etkinliğinizi başlatmasını söyleyen ACTION_APPLICATION_PREFERENCES amacını gönderir.
Bu bölümün geri kalanında, uygulamanız için bir ayarlar etkinliği uygulamak üzere Universal Android Music Player (UAMP) örnek uygulamasındaki kodu nasıl uyarlayabileceğiniz gösterilmektedir.
Başlamak için örnek kodu indirin:
# Clone the UAMP repositorygit clone https://github.com/android/uamp.git# Fetch the appropriate pull request to your local repositorygit fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME# Switch to the new branchgit checkout NEW_LOCAL_BRANCH_NAME
Etkinliğinizi uygulamak için aşağıdaki adımları uygulayın:
automotive/automotive-libklasörünü otomotiv modülünüze kopyalayın.automotive/src/main/res/xml/preferences.xmlbölümünde gösterildiği gibi bir tercihler ağacı tanımlayın.Ayarlar etkinliğinizin gösterildiği bir
PreferenceFragmentCompatuygulayın. Daha fazla bilgi için UAMP'dekiSettingsFragment.ktveSettingsActivity.ktdosyaları ile Android Ayarları Kılavuzu'nu inceleyin.
Ayarlar etkinliğinizi uygularken Tercih kitaplığındaki bazı bileşenleri kullanmayla ilgili aşağıdaki en iyi uygulamaları göz önünde bulundurun:
- Ayarlar etkinliğinizde ana görünümün altında en fazla iki derinlik düzeyi olmalıdır.
DropDownPreferencekullanmayın. Bunun yerineListPreferencekullanın.- Kuruluş bileşenleri:
PreferenceScreen- Bu, tercih ağacınızın en üst düzeyi olmalıdır.
PreferenceCategoryPreferencenesnelerini gruplandırmak için kullanılır.titleekleyin.
- Aşağıdaki tüm bileşenlere
keyvetitleekleyin. Ayrıcasummaryveyaiconya da her ikisini de ekleyebilirsiniz:PreferenceonPreferenceTreeClick()UygulamanızınPreferenceFragmentCompatgeri çağırma işlevindeki mantığı özelleştirin.
CheckBoxPreference- Koşullu metin için
summaryyerinesummaryOnveyasummaryOffolabilir.
- Koşullu metin için
SwitchPreference- Koşullu metin için
summaryyerinesummaryOnveyasummaryOffolabilir. switchTextOnveyaswitchTextOffolabilir.
- Koşullu metin için
SeekBarPreferencemin,maxvedefaultValueekleyin.
EditTextPreferencedialogTitle,positiveButtonTextvenegativeButtonText'ı ekleyin.dialogMessagevedialogLayoutResourceözelliklerinden birini veya her ikisini içerebilir.
com.example.android.uamp.automotive.lib.ListPreference- Çoğunlukla
ListPreferencekaynaklıdır. Preferencenesnelerin tek seçenekli listesini göstermek için kullanılır.entriesdizisi ve buna karşılık gelenentryValuesolmalıdır.
- Çoğunlukla
com.example.android.uamp.automotive.lib.MultiSelectListPreference- Çoğunlukla
MultiSelectListPreferencekaynaklıdır. Preferencenesnelerinin çoktan seçmeli listesini görüntülemek için kullanılır.entriesdizisi ve buna karşılık gelenentryValuesolmalıdır.
- Çoğunlukla
Oturum açma etkinliği ekleme
Uygulamanızın kullanılabilmesi için kullanıcının oturum açması gerekiyorsa uygulamanızda oturum açma ve kapatma işlemlerini gerçekleştiren, araca göre optimize edilmiş bir oturum açma etkinliği ekleyebilirsiniz. Ayrıca, oturum açma ve kapatma iş akışlarını bir ayarlar etkinliğine de ekleyebilirsiniz. Ancak uygulamanız, kullanıcı oturum açana kadar kullanılamıyorsa özel bir oturum açma etkinliği kullanın. Bu etkinliğin yalnızca Android Automotive OS'te çalışan bir uygulama tarafından tetiklendiğini unutmayın. Android Auto'ya bağlı telefon uygulamaları bu özelliği kullanmaz.
Uygulama başlatılırken oturum açılmasını zorunlu kılma
Kullanıcının uygulamanızı kullanabilmesi için önce oturum açmasını zorunlu tutmak istiyorsanız medya tarayıcı hizmetiniz aşağıdakileri yapmalıdır:
- Hizmetinizin
onLoadChildren()yönteminde,sendResult()yöntemini kullanaraknullsonucunu gönderin. setState()yöntemini kullanarak medya oturumununPlaybackStateCompatözelliğiniSTATE_ERRORolarak ayarlayın. Bu, Android Automotive OS'e hata çözülene kadar başka işlem yapılamayacağını bildirir.- Medya oturumunun
PlaybackStateCompathata kodunuERROR_CODE_AUTHENTICATION_EXPIREDolarak ayarlayın. Bu, Android Automotive OS'e kullanıcının kimlik doğrulaması yapması gerektiğini bildirir. setErrorMessage()yöntemini kullanarak medya oturumununPlaybackStateCompathata mesajını ayarlayın. Bu hata mesajı kullanıcıya gösterildiği için kullanıcının mevcut yerel ayarına göre yerelleştirin.setExtras()yöntemini kullanarak medya oturumununPlaybackStateCompatekstralarını ayarlayın. Aşağıdaki iki anahtarı ekleyin:PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL: Oturum açma iş akışını başlatan düğmede gösterilen dize. Bu dize kullanıcıya yönelik olduğundan kullanıcının geçerli yerel ayarına göre yerelleştirin.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT: KullanıcıPendingIntent,PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABELile belirtilen düğmeye dokunduğunda kullanıcıyı oturum açma etkinliğinize yönlendiren birPendingIntent.
Aşağıdaki kod snippet'inde, uygulamanızın kullanıcıdan uygulamayı kullanmadan önce oturum açmasını nasıl isteyebileceği gösterilmektedir:
Kotlin
import androidx.media.utils.MediaConstants val signInIntent = Intent(this, SignInActivity::class.java) val signInActivityPendingIntent = PendingIntent.getActivity(this, 0, signInIntent, 0) val extras = Bundle().apply { putString( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL, "Sign in" ) putParcelable( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT, signInActivityPendingIntent ) } val playbackState = PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f) .setErrorMessage( PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED, "Authentication required" ) .setExtras(extras) .build() mediaSession.setPlaybackState(playbackState)
Java
import androidx.media.utils.MediaConstants; Intent signInIntent = new Intent(this, SignInActivity.class); PendingIntent signInActivityPendingIntent = PendingIntent.getActivity(this, 0, signInIntent, 0); Bundle extras = new Bundle(); extras.putString( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL, "Sign in"); extras.putParcelable( MediaConstants.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT, signInActivityPendingIntent); PlaybackStateCompat playbackState = new PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_ERROR, 0, 0f) .setErrorMessage( PlaybackStateCompat.ERROR_CODE_AUTHENTICATION_EXPIRED, "Authentication required" ) .setExtras(extras) .build(); mediaSession.setPlaybackState(playbackState);
Kullanıcının kimliği başarıyla doğrulandıktan sonra PlaybackStateCompat
değerini STATE_ERROR dışında bir duruma ayarlayın,
ardından etkinliğin finish()
yöntemini çağırarak kullanıcıyı Android Automotive OS'e geri götürün.
Oturum açma etkinliğinizi uygulama
Google, kullanıcıların arabalarında uygulamanızda oturum açmasına yardımcı olmak için kullanabileceğiniz çeşitli kimlik araçları sunar. Firebase Authentication gibi bazı araçlar, özelleştirilmiş kimlik doğrulama deneyimleri oluşturmanıza yardımcı olabilecek tam yığın araç kitleri sağlar. Diğer araçlar, kullanıcılar için sorunsuz oturum açma deneyimleri oluşturmanıza yardımcı olmak amacıyla kullanıcının mevcut kimlik bilgilerinden veya diğer teknolojilerden yararlanır.
Daha önce başka bir cihazda oturum açmış kullanıcılar için daha kolay bir oturum açma deneyimi oluşturmanıza yardımcı olabilecek araçlar:
- One Tap ile Oturum Açma ve Kaydolma: One Tap'i telefon uygulamanız gibi diğer cihazlar için zaten uyguladıysanız mevcut One Tap kullanıcılarını desteklemek amacıyla Android Automotive OS uygulamanız için de uygulayın.
- Google ile oturum açma: Telefon uygulamanız gibi diğer cihazlar için Google ile oturum açma özelliğini zaten uyguladıysanız mevcut Google ile oturum açma kullanıcılarını desteklemek için Android Automotive OS uygulamanızda Google ile oturum açma özelliğini uygulayın.
- Google ile otomatik doldurma: Kullanıcılar diğer Android cihazlarında Google ile otomatik doldurma özelliğini etkinleştirdiyse kimlik bilgileri Google Şifre Yöneticisi'ne kaydedilir. Bu kullanıcılar Android Automotive OS uygulamanızda oturum açtığında Google ile Otomatik Doldurma, ilgili kayıtlı kimlik bilgilerini önerir. Google ile otomatik doldurma özelliğini kullanmak için uygulama geliştirme çalışması gerekmez. Ancak uygulama geliştiricileri, uygulamalarını daha kaliteli sonuçlar için optimize edebilir. Google ile otomatik doldurma, Android Automotive OS dahil olmak üzere Android 8.0 (API düzeyi 26) veya sonraki sürümleri çalıştıran tüm cihazlarda desteklenir.
AccountManager cihazını kullan
Kimlik doğrulama içeren Android Automotive OS uygulamaları, aşağıdaki nedenlerden dolayı AccountManager kullanmalıdır:
- Daha iyi kullanıcı deneyimi ve kolay hesap yönetimi: Kullanıcılar, oturum açma ve kapatma dahil olmak üzere tüm hesaplarını sistem ayarlarındaki hesaplar menüsünden yönetebilir.
- "Konuk" deneyimleri: Arabalar, paylaşılan cihazlardır. Bu nedenle OEM'ler, araca hesap eklenemeyen "konuk" deneyimlerini etkinleştirebilir. Bu kısıtlama,
AccountManageriçinDISALLOW_MODIFY_ACCOUNTSkullanılarak uygulanır.
İzinler
Kullanıcıdan izin istemeniz gerekiyorsa önceki bölümde gösterilen etkinlik iş akışları şemasındaki kimlik doğrulama etkinliği veya ayarlar etkinliği ile aynı akışı kullanın.
Medya barındırma uygulamasını başlatın
Medya barındıran uygulamayı, uygulamanızda veya uygulamanızdaki içeriğinizde açmak için niyetler oluşturabilirsiniz. Örneğin:
- Uygulamanız, kullanıcının yeni bir içeriği dinlemek için uygulamanızı açmasına olanak tanıyan beklemede olan intent ile bildirim yayınlayabilir.
- Uygulamanız derin bağlantıları işleyebilir ve ana makine uygulamasını en uygun görünümde açabilir.
Medya barındırma özelliklerini belirleme
Medya barındırma uygulamasının sürümleri farklı özellikleri destekler. Ana makineler, aşağıdaki amaç işlemleri için amaç filtreleri ekleyerek farklı özellikler için destek gösterir:
Tüm medya barındırma uygulamaları MEDIA_TEMPLATE amaçlarını destekler. Medya barındırıcının MEDIA_TEMPLATE_V2 amaçlarını destekleyip desteklemediğini belirlemek için queryIntentActivities() öğesini aşağıdaki gibi kullanabilirsiniz:
val isMediaTemplateV2Supported = packageManager.queryIntentActivities(
Intent(MediaIntentExtras.ACTION_MEDIA_TEMPLATE_V2),
// MATCH_DEFAULT_ONLY since the host should be started with implicit intents
// MATCH_SYSTEM_ONLY excludes any apps that aren't preinstalled
PackageManager.MATCH_DEFAULT_ONLY or PackageManager.MATCH_SYSTEM_ONLY
).size > 0
Intent oluşturma ve kullanma
Medya barındırıcısı tarafından hangi amaç işlemleri desteklendiğine ve özel kullanım alanınıza bağlı olarak, medya barındırıcısı uygulamasını başlatmak için kullandığınız amacı oluştururken aşağıdaki ekstraları sağlayabilirsiniz.
| Ek anahtar | Tür | Açıklama | Desteklenen işlemler |
|---|---|---|---|
EXTRA_KEY_MEDIA_COMPONENT |
String |
Medya barındıran uygulamanın bağlanması gereken MediaBrowserService düzleştirilmiş bileşen adı (genellikle uygulamanızın bileşen adı). Bu ek bilgi belirtilmezse medya barındıran uygulama, varsayılan olarak etkin medya kaynağını kullanır. |
MEDIA_TEMPLATE, MEDIA_TEMPLATE_V2 |
EXTRA_KEY_SEARCH_QUERY |
String |
Arama sırasında kullanılacak arama sorgusu | MEDIA_TEMPLATE, MEDIA_TEMPLATE_V2 |
EXTRA_KEY_MEDIA_ID |
String |
Göz atma görünümünde açılacak medya kimliği. | MEDIA_TEMPLATE_V2 |
EXTRA_KEY_SEARCH_ACTION |
Integer |
EXTRA_KEY_SEARCH_QUERY araması tamamlandıktan sonra yapılacak işlem. |
MEDIA_TEMPLATE_V2 |
Örneğin, MEDIA_TEMPLATE_V2 işlemlerini destekleyen bir ana makineyle aşağıdaki kod, medya ana makinesi uygulamasını açar, MyMediaBrowserService'a bağlanmasını sağlar, "Jazz" araması yapar ve ardından arama sonuçlarındaki ilk öğeyi oynatır. Diğer tüm ana makinelerde ise yalnızca medya ana makinesi uygulamasını açar ve "Caz" araması yapar. Kullanıcı, sonuçlardan oynatılacak bir öğe seçer.
val startMediaHostIntent = Intent(ACTION_MEDIA_TEMPLATE)
.putExtra(MediaIntentExtras.EXTRA_KEY_MEDIA_COMPONENT, MyMediaBrowserService::class.java)
.putExtra(MediaIntentExtras.EXTRA_KEY_SEARCH_QUERY, "Jazz")
.putExtra(MediaIntentExtras.EXTRA_KEY_SEARCH_ACTION, MediaIntentExtras.EXTRA_VALUE_PLAY_FIRST_ITEM_FROM_SEARCH)
context.startActivity(startMediaHostIntent)
Derin bağlantıları destekleme
Android Automotive OS cihazlarda medya uygulamanızın deneyimini iyileştirmek için uygulamanıza derin bağlantı desteği ekleyebilirsiniz. Örneğin, bu sayede kullanıcılar uygulamanızı doğrudan bir tarayıcıdan veya Quick Share kullanılarak telefondan paylaşılan bir URL aldıklarında açabilir.
Derin bağlantı intent filtreleri ekleme
Uygulamanızın derin bağlantıları işleyebildiğini işletim sistemine bildirmek için uygun intent filtrelerine sahip etkinliklere sahip olması gerekir. Derin bağlantılar için kullanılan intent filtrelerinin biçimiyle ilgili yönergeler için Gelen bağlantılar için intent filtreleri ekleme başlıklı makaleyi inceleyin.
En iyi kullanıcı deneyimi için, mobil uygulamanızın desteklediği tüm derin bağlantıları, araba içi uygulamanız tarafından makul bir şekilde desteklenebiliyorsa destekleyin. Uygulamanızda ayarlar veya oturum açma etkinlikleri varsa ayarları ve oturum açma derin bağlantılarını işlemek için kullanılan intent filtreleri, ilgili <activity> manifest öğelerinde bildirilmelidir. Medya oynatma ve derin bağlantılara göz atma için bu bölümün ilerleyen kısımlarında açıklandığı gibi bir trambolin etkinliği kullanabilirsiniz.
Derin bağlantı amaçlarını işleme
Uygulamanızın etkinliğini başlatmak için kullanılan intent'i nasıl okuyacağınız ve buna nasıl tepki vereceğinizle ilgili yönergeler için Gelen intent'lerdeki verileri okuma başlıklı makaleyi inceleyin.
Medya oynatma ve derin bağlantılara göz atma işlemlerini yönetme
Göz atma ve oynatma için kullanıcı arayüzü, ana makine uygulaması tarafından çizildiğinden oynatma ve göz atma işlemleri için derin bağlantıları işlemek üzere kullanılan etkinliğin kendi kullanıcı arayüzü olmamalıdır.
Bunun yerine, öncelikle medya barındırma uygulamasını başlatmak için bir amaç oluşturmak ve kullanmak üzere kullanılmalıdır. Gerekirse uygulamanızın durumunda yapılan ek değişiklikleri de (ör. kuyruğa medya öğeleri ekleme) işleyebilir. Aşağıdaki snippet'te trambolin etkinliği uygulamasına bir örnek verilmiştir:
fun DeepLinkTrampolineActivity : ComponentActivity() {
override fun onCreate() {
handleIntent(intent)
}
override fun onNewIntent(intent: Intent) {
handleIntent(intent)
}
private fun handleIntent(intent: Intent) {
// Handle any side effects, such as adding a song to the queue
...
// Build the intent used to start the media host app
val startMediaHostIntent = ...
startActivity(intent)
// Finish the activity immediately so it isn't shown on screen
finish()
}
}
Medya barındırma ipuçlarını okuma
Medya tarayıcı hizmetinize bağlanan sistem uygulamasına (sürümü dahil) bağlı olarak uygulamanız aşağıdaki ek özellikleri alabilir:
Hata işleme
Android Automotive OS'teki medya uygulamalarındaki hatalar, medya oturumunun PlaybackStateCompat kullanılarak bildirilir. Tüm hatalar için PlaybackStateCompat içinde uygun bir hata kodu ve hata mesajı ayarlayın. Bu durum, kullanıcı arayüzünde Toast simgesinin görünmesine neden olur.
Bir hata oluştuğunda ancak oynatma devam edebildiğinde önemli olmayan bir hata yayınlayın. Örneğin, bir kullanıcı giriş yapmadan önce uygulamada müzik çalabilir ancak şarkı atlamak için giriş yapması gerekir. Önemli olmayan bir hata kullandığınızda sistem, kullanıcının mevcut medya öğesinin oynatılmasını kesintiye uğratmadan oturum açmasını önerebilir.
Önemli olmayan bir hata verdiğinizde hata kodu ve hata mesajı dışında PlaybackStateCompat'nın geri kalanını olduğu gibi koruyun. Bu yaklaşım, kullanıcının oturum açıp açmamaya karar verdiği sırada mevcut medya öğesinin oynatılmaya devam etmesini sağlar.
İnternet bağlantısı olmaması ve çevrimdışı içerik olmaması gibi durumlarda oynatma mümkün olmadığında PlaybackStateCompat durumunu STATE_ERROR olarak ayarlayın.
PlaybackStateCompat ile ilgili sonraki güncellemelerde, aynı hata için birden fazla uyarı gösterilmesini önlemek amacıyla tüm hata kodlarını ve hata mesajlarını temizleyin.
Herhangi bir noktada bir göz atma ağacını yükleyemezseniz (ör. kimlik doğrulama gerekiyorsa ve kullanıcı oturum açmamışsa) boş bir göz atma ağacı gönderin. Bunu belirtmek için kök medya düğümü için onLoadChildren() öğesinden boş sonuç döndürün. Bu durumda sistem, PlaybackStateCompat içinde ayarlanan hata mesajıyla birlikte tam ekran bir hata gösterir.
Eyleme dönüştürülebilir hatalar
Bir hata üzerinde işlem yapılabiliyorsa PlaybackStateCompat içinde aşağıdaki iki ek bilgiyi de ayarlayın:
PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL: Hatayı çözmek için tıklanacak düğmenin etiketi. Bu dize kullanıcıya yönelik olduğundan kullanıcının mevcut yerel ayarına göre yerelleştirin.PLAYBACK_STATE_EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT: Düğmenin, hatayı çözmek için çalıştırdığıPendingIntent(ör. oturum açma etkinliğinizi başlatarak).
İşleme alınabilir hatalar Dialog olarak görünür ve yalnızca araba durdurulduğunda kullanıcılar tarafından çözülebilir.
Hata durumlarını test etme
Uygulamanızın aşağıdakiler de dahil olmak üzere tüm senaryolarda hataları düzgün şekilde işlediğini doğrulayın:
- Ürününüzün farklı katmanları: Örneğin, ücretsiz ve premium veya oturum açılmış ve oturum açılmamış
- Farklı sürüş durumları: Örneğin, park edilmiş ve sürüş
- Farklı bağlantı durumları: Örneğin, online ve offline
Dikkat edilmesi gereken diğer noktalar
Android Automotive OS uygulamanızı geliştirirken aşağıdaki diğer hususları da göz önünde bulundurun:
Çevrimdışı içerik
Gerekirse çevrimdışı oynatma desteğini uygulayın. Android Automotive OS'li arabaların kendi veri bağlantısı olması beklenir. Bu nedenle, araç maliyetine bir veri planı dahildir veya kullanıcı tarafından ödenir. Ancak arabaların, mobil cihazlara kıyasla daha değişken bir bağlantıya sahip olması da bekleniyor.
Çevrimdışı destek stratejinizi değerlendirirken göz önünde bulundurmanız gereken birkaç nokta:
- İçerik indirmek için en uygun zaman, uygulamanızın kullanıldığı zamandır.
- Kablosuz bağlantının mevcut olduğunu varsaymayın. Araba hiçbir zaman kablosuz ağ menziline girmeyebilir veya OEM, mobil ağ lehine kablosuz ağı devre dışı bırakmış olabilir.
- Kullanıcıların kullanmasını beklediğiniz içeriği önbelleğe almanızda bir sakınca olmasa da bu davranışı kullanıcının ayarlar etkinliğiniz üzerinden değiştirmesine izin vermenizi öneririz.
- Arabaların disk alanı farklılık gösterdiğinden kullanıcılara, ayarlar etkinliğinizdeki bir seçenek gibi yollarla çevrimdışı içerikleri silme imkanı sunun.
WebView desteği
WebView'lar Android Automotive OS'de desteklenir ancak yalnızca ayarlarınız ve oturum açma etkinlikleriniz için izin verilir. WebView kullanan etkinliklerde, WebView'in dışında bir "kapat" veya "geri" işlevi bulunmalıdır.
Web görünümleri için kabul edilebilir kullanım alanlarına dair bazı örnekler:
- Gizlilik politikanızı, hizmet şartlarınızı veya diğer yasal bağlantılarınızı ayarlar etkinliğinizde gösterme
- Oturum açma etkinliğinizdeki web tabanlı akış.
WebView kullanırken JavaScript'i etkinleştirebilirsiniz.
WebView'unuzun güvenliğini sağlama
WebView'ınızın daha büyük internete giriş noktası olmamasını sağlamak için mümkün olan tüm önlemleri alın. WebView'u loadUrl() çağrısında kullanılan URL'ye kilitleme ve yönlendirmeleri engelleme örneği için aşağıdaki kod snippet'ine bakın. Mümkün olduğunda (ör. yasal konularla ilgili bağlantılar gösterilirken) bu tür önlemleri uygulamanızı önemle tavsiye ederiz.
Kotlin
override fun shouldOverrideUrlLoading(webView: WebView, webResourceRequest: WebResourceRequest): Boolean { val originalUri: Uri = Uri.parse(webView.originalUrl) // Check for allowed URLs if (originalUri.equals(Uri.parse(BLANK_URL)) || originalUri.equals(webResourceRequest.url)) { return false } if (webResourceRequest.isRedirect) { logger.w("Redirect detected, not following") return true } setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.url) logger.w( String.format( "Navigation prevented to %s original is %s", webResourceRequest.url, originalUri)) return true }
Java
@Override public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) { Uri originalUri = Uri.parse(webView.getOriginalUrl()); // Check for allowed URLs if (originalUri.equals(Uri.parse(BLANK_URL)) || originalUri.equals(webResourceRequest.getUrl())) { return false; } if (webResourceRequest.isRedirect()) { logger.w("Redirect detected, not following"); return true; } setupWizardWebViewClientListener.onUriBlocked(webResourceRequest.getUrl()); logger.w( String.format( "Navigation prevented to %s original is %s", webResourceRequest.getUrl(), originalUri)); return true; }
Paket adları
Android Automotive OS için ayrı bir Android Paket Kiti (APK) dağıttığınızdan mobil uygulamanızdaki paket adını yeniden kullanabilir veya yeni bir paket adı oluşturabilirsiniz. Farklı bir paket adı kullanırsanız uygulamanızın iki ayrı Play Store girişi olur. Mevcut paket adınızı yeniden kullanırsanız uygulamanızın her iki platformda da tek bir girişi olur.
Bu karar, büyük ölçüde işletmeyle ilgilidir. Örneğin, mobil uygulama üzerinde çalışan bir ekibiniz ve Android Automotive OS uygulamanız üzerinde çalışan ayrı bir ekibiniz varsa ayrı paket adları kullanmanız ve her ekibin kendi Play Store girişini yönetmesine izin vermeniz mantıklı olabilir. Her iki yaklaşımı kullanmak için gereken teknik çaba arasında büyük bir fark yoktur.
Aşağıdaki tabloda, mevcut paket adınızı korumak ile yeni bir paket adı kullanmak arasındaki diğer temel farklar özetlenmektedir:
| Özellik | Aynı paket adı | Yeni paket adı |
|---|---|---|
| Mağaza girişi | Tek | Birden çok |
| Yansıtılmış yükleme | Evet: Kurulum sihirbazı sırasında "uygulamaları hızlı yeniden yükleme" | Hayır |
| Play Store inceleme süreci | Yorumların engellenmesi: Bir APK için yorum başarısız olursa aynı sürümde gönderilen diğer APK'lar engellenir. | Bireysel incelemeler |
| İstatistikler, metrikler ve vitals | Birleştirilmiş: Otomotiv sektörüne özel verileri filtreleyebilirsiniz. | Ayır |
| Dizine ekleme ve arama sıralaması | Mevcut durumdan yararlanma | Devretme yok |
| Diğer uygulamalarla entegrasyon | Medya kodu her iki APK arasında paylaşıldığı sürece büyük olasılıkla herhangi bir değişiklik yapılması gerekmez. | Google Asistan ile URI oynatma gibi durumlarda ilgili uygulamayı güncellemeniz gerekebilir. |
Sık sorulan sorular
Android Automotive OS hakkında sık sorulan bazı soruların yanıtlarını aşağıdaki bölümlerde bulabilirsiniz.
Donanım
Uygulamam mikrofona erişebilir mi?
Android 10 (API düzeyi 29) veya sonraki sürümleri hedefleyen uygulamalar için ses girişini paylaşma belgelerine bakın. Bu, API düzeyi 29'dan önce mümkün değildir.
Hangi araba API'lerine erişebiliriz ve nasıl?
OEM tarafından kullanıma sunulan API'lerle sınırlısınız. Bu API'lere erişme şeklinizi standartlaştırmak için süreçler geliştirilmektedir.
Uygulamalar, SetProperty() ve GetProperty() kullanarak CarPropertyManager içindeki araba API'lerine erişebilir.
Kullanılabilir tüm özelliklerin listesini görmek için kaynak koduna veya referans dokümanlarına bakın. Özellik @SystemApi ile açıklama eklenmişse önceden yüklenmiş sistem uygulamalarıyla sınırlıdır.
Hangi ses codec'leri desteklenir?
Android CDD'deki ses codec'i ayrıntılarına bakın.
Widevine DRM destekleniyor mu?
Evet. Widevine DRM desteklenir.
Geliştirme ve test
Üçüncü taraf SDK'ları ve kitaplıklarının kullanımıyla ilgili herhangi bir kısıtlama veya öneri var mı?
Üçüncü taraf SDK'larının ve kitaplıklarının kullanımıyla ilgili özel kurallarımız yoktur. Üçüncü taraf SDK'ları ve kitaplıklarını kullanmayı tercih ederseniz tüm araba uygulaması kalite şartlarına uymakla yine de sorumlusunuz.
Ön plan hizmeti kullanabilir miyim?
Ön plan hizmeti için izin verilen tek kullanım alanı, içerikleri çevrimdışı kullanım için indirmektir. Desteklenmesini istediğiniz başka bir ön plan hizmeti kullanım alanınız varsa Android Automotive OS tartışma grubunu kullanarak bizimle iletişime geçin.
Android Automotive OS uygulamalarını yayınlama
Google Play Console'u kullanarak Android Automotive OS uygulamamı nasıl yayınlayabilirim?
Android Automotive OS uygulamanızı Google Play Console'u kullanarak nasıl yayınlayacağınız hakkında ayrıntılı bilgi için Arabalara dağıtma başlıklı makaleyi inceleyin.
özel Android Automotive OS kanalını kullanmanız gerekir.Ek kaynaklar
Android Automotive OS hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.
Örnekler
Rehberler
- Design for Driving
- Medya kumandası test uygulamasını kullanma
- Android Automotive OS'te bildirimler
- Arabalar için Android uygulama kalitesi
Bloglar
- Geliştiriciler için Android Automotive OS güncellemeleri
- Android Automotive OS için Uygulama Geliştirme
Videolar
- Arabalar İçin Medya Uygulamaları Oluşturma (Android Dev Summit '19)
- Arabalar İçin Android Uygulamaları Oluşturma (Google I/O'19)
Android Automotive OS'te medya ile ilgili sorun bildirme
Android Automotive OS için medya uygulamanızı geliştirirken sorunla karşılaşırsanız Google Sorun İzleyici'yi kullanarak sorunu bildirebilirsiniz. Sorun şablonunda istenen tüm bilgileri doldurduğunuzdan emin olun.
Yeni bir sorun kaydı oluşturmadan önce, sorunun sorunlar listesinde bildirilip bildirilmediğini kontrol edin. İzleyicideki bir sorunun yıldızını tıklayarak sorunlara abone olabilir ve oy verebilirsiniz. Daha fazla bilgi için Bir soruna abone olma başlıklı makaleyi inceleyin.