Medya uygulamanıza Android Automotive OS desteğini ekleyin

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 uygulamanız gerekir:

  1. Android Studio'da otomotiv özelliklerini etkinleştirme.
  2. Otomotiv modülü oluşturun.
  3. Gradle bağımlılıkları güncelleyin.
  4. İsteğe bağlı olarak Ayarları ve oturum açma etkinliklerini uygulayın.
  5. İsteğe bağlı olarak Medya barındırıcı ipuçları'nı okuyun.

Tasarımla ilgili dikkat edilmesi gereken noktalar

Android Automotive OS, uygulamanızın medya tarayıcısı hizmetinden aldığı medya içeriğini yerleştirir. Bu, kullanıcı medya oynatmayı tetiklediğinde uygulamanızın kullanıcı arayüzünü çizmediği ve etkinliklerinizin hiçbirini başlatmadığı anlamına gelir.

Ayar veya oturum açma etkinlikleri uyguluyorsanız bu etkinlikler araç için 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 birkaç bölümünü 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ü kullanın.

Otomotiv modülü oluşturma

Android Automotive OS'in manifest gibi bazı bileşenleri platforma özgü gereksinimlere sahiptir. Bu bileşenlerin kodunu, telefon uygulamanız için kullanılan kod gibi projenizdeki diğer kodlardan ayrı tutabilecek bir modül oluşturun.

Projenize otomotiv modülü eklemek için aşağıdaki adımları uygulayın:

  1. Android Studio'da Dosya > Yeni > Yeni Modül'ü tıklayın.
  2. Otomotiv Modülü'nü seçin ve İleri'yi tıklayın.
  3. Bir uygulama/kitaplık adı girin. Bu, Android Automotive OS'te kullanıcıların uygulamanız için gördüğü addır.
  4. Bir modül adı girin.
  5. Paket adını uygulamanızla eşleşecek şekilde ayarlayın.
  6. Minimum SDK için API 28: Android 9.0 (Pie)'i seçin ve ardından İleri'yi tıklayın.

    Android Automotive OS'i destekleyen tüm araçlar Android 9 (API seviyesi 28) veya sonraki sürümleri çalıştırır. Bu nedenle, bu değeri seçtiğinizde uyumlu tüm araçlar hedeflenir.

  7. Etkinlik yok'u seçin ve ardından 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 bilgileri ve Android Automotive OS desteğini beyan eden bir <uses-feature> öğesi bulunur. Manifestte tanımlanmış etkinlik olmadığını unutmayın.

Ayarlar veya oturum açma etkinlikleri uygularsanız bunları buraya ekleyin. Bu etkinlikler, sistem tarafından açık intent'ler kullanılarak tetiklenir ve Android Automotive OS uygulamanız için manifest dosyasında beyan ettiğiniz tek etkinliklerdir.

Herhangi bir ayar veya oturum açma etkinliği ekledikten sonra <application> öğesinin android:appCategory özelliğini "audio" olarak ayarlayarak manifest dosyanızı tamamlayın.

<application
  ...
  android:appCategory="audio" />

Özellik şartlarını belirtme

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.

Android Automotive OS için medya desteği beyan etme

Uygulamanızın Android Automotive OS'i desteklediğini beyan etmek 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 açıklayan bir XML dosyasını ifade eder.

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çeriği ekleyin:

<automotiveApp>
    <uses name="media"/>
</automotiveApp>

Niyet filtreleri

Android Automotive OS, medya uygulamanızdaki etkinlikleri tetiklemek için açık intent'leri kullanır. Manifest dosyasına CATEGORY_LAUNCHER veya ACTION_MAIN intent filtresi içeren etkinlikler eklemeyin.

Aşağıdaki örnekteki gibi etkinlikler genellikle bir telefonu veya başka bir mobil cihazı hedefler. Bu etkinlikleri, Android Automotive OS uygulamanızı oluşturan modülde değil, telefon uygulamasını oluşturan modülde beyan edin.

<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ı güncelleme

Medya tarayıcısı hizmetinizi, telefon uygulamanız ile otomotiv modülünüz arasında paylaştığınız ayrı bir modülde tutmanızı öneririz. Bu yaklaşımı kullanıyorsanız otomotiv modülünüzü, aşağıdaki snippet'te gösterildiği gibi paylaşılan modülü içerecek şekilde güncellemeniz gerekir:

my-auto-module/build.gradle

Groovy

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ısı hizmetinize ek olarak, Android Automotive OS uygulamanız için araca özel ayarlar ve oturum açma etkinlikleri de sağlayabilirsiniz. Bu etkinlikler, Android Media API'lerine dahil olmayan uygulama işlevleri 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 şemada, bir kullanıcının Android Automotive OS'i kullanarak ayarlarınız ve oturum açma etkinliklerinizle nasıl etkileşimde bulunduğu gösterilmektedir:

Ayarlar ve oturum açma etkinlikleri için iş akışları

Ş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ı engelleme

Ayarlarınızın ve/veya oturum açma etkinliklerinizin yalnızca kullanıcının aracı park halindeyken kullanılabilmesini sağlamak için <activity> öğelerinin aşağıdaki <meta-data> öğesini içermediğini doğrulayın. Bu tür bir öğe varsa uygulamanız inceleme sırasında reddedilir.

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

Ayar etkinliği ekleme

Kullanıcıların arabalarında uygulamanızın ayarlarını yapılandırabilmesi için araca özelleştirilmiş bir ayar etkinliği ekleyebilirsiniz. Ayarlar etkinliğiniz, kullanıcı 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 özelliği kullanmaz.

Ayarlar etkinliği beyan etme

Ayar etkinliğinizi, aşağıdaki kod snippet'inde gösterildiği gibi uygulamanızın manifest 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ınızı uygulama etkinliğinizi uygulama

Bir kullanıcı uygulamanızı başlattığında Android Automotive OS, beyan ettiğiniz ayarlar etkinliğini algılar ve bir simge gibi bir imkanı gösterir. Kullanıcı, etkinliğe gitmek için aracının ekranını kullanarak bu olanağa dokunabilir veya bu olanağı seçebilir. Android Automotive OS, uygulamanıza ayarlar etkinliğinizi başlatmasını söyleyen ACTION_APPLICATION_PREFERENCES intent'ini 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 repository
git clone https://github.com/android/uamp.git

# Fetch the appropriate pull request to your local repository
git fetch origin pull/323/head:NEW_LOCAL_BRANCH_NAME

# Switch to the new branch
git checkout NEW_LOCAL_BRANCH_NAME

Etkinliğinizi uygulamak için aşağıdaki adımları uygulayın:

  1. automotive/automotive-lib klasörünü otomotiv modülünüze kopyalayın.
  2. automotive/src/main/res/xml/preferences.xml'te gösterildiği gibi bir tercih ağacı tanımlayın.
  3. Ayarlarınızın gösterildiği bir PreferenceFragmentCompat uygulayın. Daha fazla bilgi için UAMP'deki SettingsFragment.kt ve SettingsActivity.kt dosyalarını ve Android Ayarları kılavuzunu inceleyin.

Ayar 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 düzey derinlik olmalıdır.
  • DropDownPreference kullanmayın. Bunun yerine ListPreference kullanın.
  • Kuruluş bileşenleri:
  • Aşağıdaki bileşenlerin tümüne bir key ve title ekleyin. Ayrıca summary, icon veya her ikisini de ekleyebilirsiniz:
    • Preference
      • PreferenceFragmentCompat uygulamanızın onPreferenceTreeClick() geri çağırma işlevindeki mantığı özelleştirin.
    • CheckBoxPreference
      • Koşullu metin için summary yerine summaryOn veya summaryOff olabilir.
    • SwitchPreference
      • Koşullu metin için summary yerine summaryOn veya summaryOff olabilir.
      • switchTextOn veya switchTextOff olabilir.
    • SeekBarPreference
      • min, max ve defaultValue ekleyin.
    • EditTextPreference
      • dialogTitle, positiveButtonText ve negativeButtonText öğelerini dahil edin.
      • dialogMessage ve/veya dialogLayoutResource içerebilir.
    • com.example.android.uamp.automotive.lib.ListPreference
      • Çoğunlukla ListPreference'ten türetilir.
      • Preference nesnelerinin tek seçimli listesini görüntülemek için kullanılır.
      • entries dizisi ve ilgili entryValues olmalıdır.
    • com.example.android.uamp.automotive.lib.MultiSelectListPreference
      • Çoğunlukla MultiSelectListPreference kaynağından türetilir.
      • Preference nesnelerinin çoklu seçim listesini görüntülemek için kullanılır.
      • entries dizisi ve ilgili entryValues olmalıdır.

Oturum açma etkinliği ekleme

Uygulamanızı kullanabilmek için kullanıcıların oturum açması gerekiyorsa uygulamanızda oturum açma ve oturumu kapatma işlemlerini yöneten, araçlara yönelik bir oturum açma etkinliği ekleyebilirsiniz. Oturum açma ve oturumu kapatma iş akışlarını bir ayarlar etkinliğine de ekleyebilirsiniz ancak kullanıcı oturum açana kadar uygulamanız 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.

Uygulamanın başlatılmasında oturum açmayı zorunlu kılma

Kullanıcıların uygulamanızı kullanabilmeleri için oturum açmalarını zorunlu kılmak istiyorsanız medya tarayıcısı hizmetinizin aşağıdakileri yapması gerekir:

  1. Hizmetinizin onLoadChildren() yönteminde, sendResult() yöntemini kullanarak null sonucunu gönderin.
  2. setState() yöntemini kullanarak medya oturumunun PlaybackStateCompat değerini STATE_ERROR olarak ayarlayın. Bu, Android Automotive OS'e hata düzeltilene kadar başka işlem yapılamayacağını bildirir.
  3. Medya oturumunun PlaybackStateCompat hata kodunu ERROR_CODE_AUTHENTICATION_EXPIRED olarak ayarlayın. Bu, Android Automotive OS'e kullanıcının kimlik doğrulaması yapması gerektiğini bildirir.
  4. setErrorMessage() yöntemini kullanarak medya oturumunun PlaybackStateCompathata mesajını ayarlayın. Bu hata mesajı kullanıcıya yönelik olduğundan, kullanıcının mevcut yerel diline göre yerelleştirin.
  5. setExtras() yöntemini kullanarak medya oturumunun PlaybackStateCompat ek özelliklerini ayarlayın. Aşağıdaki iki anahtarı ekleyin:

Aşağıdaki kod snippet'inde, uygulamanızın kullanıcıdan uygulamanızı 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 değere 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ç paketleri 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.

Aşağıdaki araçlar, 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ı olabilir:

  • One Tap ile Oturum Açma ve Kaydolma: Telefon uygulamanız gibi diğer cihazlar için One Tap'ı zaten uyguladıysanız mevcut One Tap kullanıcılarını desteklemek için 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ız için 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 Doldur, ilgili kayıtlı kimlik bilgilerini önerir. Google ile otomatik doldurma özelliğini kullanmak için uygulama geliştirme çalışması gerekmez. Ancak uygulama geliştiriciler uygulamaları için daha kaliteli sonuçlar elde edecek şekilde optimizasyon yapabilir. Google ile otomatik doldurma özelliği, 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'ı kullanma

Kimlik doğrulaması olan Android Automotive OS uygulamaları, aşağıdaki nedenlerle AccountManager'ı kullanmalıdır:

  • Daha iyi kullanıcı deneyimi ve hesap yönetimi kolaylığı: Kullanıcılar, oturum açma ve oturum kapatma dahil olmak üzere tüm hesaplarını sistem ayarlarındaki hesap menüsünden kolayca yönetebilir.
  • "Konuk" deneyimleri: Arabalar paylaşılan cihazlardır. Bu nedenle OEM'ler, hesap eklenemeyecek şekilde araçta "konuk" deneyimleri etkinleştirebilir. Bu kısıtlama, AccountManager için DISALLOW_MODIFY_ACCOUNTS kullanılarak elde edilir.

İzinler

Kullanıcıdan izin istemeniz gerekiyorsa önceki bölümde gösterilen etkinlik iş akışları şemasında kimlik doğrulama etkinliği veya ayarlar etkinliği ile aynı akışı kullanın.

Medya barındırma uygulamasını başlatma

Medya barındırma uygulamasını uygulamanızda veya uygulamanızdaki içerikte açmak için intent'ler 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 bekleyen bir intent içeren bir bildirim yayınlayabilir.
  • Uygulamanız derin bağlantıları işleyebilir ve barındıran uygulamayı 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. Barındıranlar, aşağıdaki intent işlemleri için intent filtreleri ekleyerek farklı özellikler için destek belirtir:

Tüm medya barındıran uygulamalar MEDIA_TEMPLATE intent'lerini destekler. Medya barındırıcının MEDIA_TEMPLATE_V2 intent'lerini destekleyip desteklemediğini belirlemek için queryIntentActivities()'i 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ı tarafından desteklenen intent işlemlerine ve belirli kullanım alanınıza bağlı olarak, medya barındırıcı uygulamasını başlatmak için kullandığınız intent'i 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ırıcı uygulamasının bağlanması gereken MediaBrowserService öğesinin düzleştirilmiş bileşen adı (genellikle uygulamanıza ait olan). Bu ek belirtilmezse medya barındırıcı varsayılan olarak etkin medya kaynağını kullanır. MEDIA_TEMPLATE, MEDIA_TEMPLATE_V2
EXTRA_KEY_SEARCH_QUERY String Arama yapılırken 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 makinede aşağıdaki kod, medya ana makinesi uygulamasını açar, MyMediaBrowserService'a bağlanır, "Jazz" için arama yapar ve ardından arama sonuçlarından ilk öğeyi çalar. Diğer tüm ana makinelerde ise yalnızca medya ana makinesi uygulamasını açar ve "Jazz" için arama yapar. Kullanıcının, sonuçlardan çalacağı bir öğe seçmesi gerekir.

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)

Medya uygulamanızın Android Automotive OS cihazlardaki 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 Hızlı Paylaşım'ı kullanarak telefondan paylaşılan bir URL aldığında açabilir.

Derin bağlantı intent filtreleri ekleme

Uygulamanızın derin bağlantıları işleyebileceğ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çimi hakkında bilgi edinmek üzere Gelen bağlantılar için intent filtreleri ekleme başlıklı makaleyi inceleyin.

En iyi kullanıcı deneyimi için, araç içi uygulamanız tarafından makul bir şekilde desteklenebilirlerse mobil uygulamanızın desteklediği tüm derin bağlantıları destekleyin. Uygulamanızda ayarlar veya oturum açma etkinlikleri varsa ayarlar ve oturum açma derin bağlantılarını işlemek için intent filtreleri ilgili <activity> manifest öğelerinde tanımlanmalıdır. Medya oynatma ve derin bağlantılara göz atma için bu bölümde daha sonra açıklandığı gibi bir trampolin etkinliği kullanabilirsiniz.

Uygulamanızın etkinliğini başlatmak için kullanılan intent'i nasıl okuyacağınız ve buna nasıl tepki vereceğiniz konusunda yol gösterici bilgiler için Gelen intent'lerden veri okuma başlıklı makaleyi inceleyin.

Tarama ve oynatma kullanıcı arayüzü, barındıran uygulama tarafından çizildiğinden, oynatma ve tarama 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 intent oluşturmak ve kullanmak üzere kullanılmalıdır. Gerekirse, uygulamanızın durumundaki ek değişiklikleri (ör. sıraya medya öğesi ekleme) de yönetebilir. Aşağıdaki snippet'te örnek bir trambolin etkinliği uygulaması gösterilmektedir:

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ısı hizmetinize bağlanan sistem uygulamasına (sürümü dahil) bağlı olarak uygulamanız aşağıdaki ek bilgileri alabilir:

Hata İşleme

Android Automotive OS'teki medya uygulamalarındaki hatalar, medya oturumunun PlaybackStateCompat aracılığıyla iletilir. Tüm hatalar için PlaybackStateCompat öğesinde uygun bir hata kodu ve hata mesajı ayarlayın. Bu durum, kullanıcı arayüzünde bir Toast görünmesine neden olur.

Hata oluştuğunda ancak oynatma devam edebiliyorsa önemli olmayan bir hata gönderin. Örneğin, bir kullanıcı oturum açmadan önce uygulamada müzik çalabilir ancak şarkı atlamak için oturum açması gerekir. Ölümcül olmayan bir hata kullandığınızda sistem, kullanıcının mevcut medya öğesinin oynatılmasını kesintiye uğratmadan giriş yapmasını önerebilir.

Önemli olmayan bir hata gönderdiğinizde, hata kodu ve hata mesajı dışında PlaybackStateCompat'ün geri kalanını olduğu gibi koruyun. Bu yaklaşım, kullanıcı oturum açıp açmayacağına karar verirken mevcut medya öğesinin oynatılmasının devam etmesini sağlar.

İnternet bağlantısı olmadığında ve çevrimdışı içerik olmadığında oynatma mümkün olmadığında PlaybackStateCompat durumunu STATE_ERROR olarak ayarlayın.

PlaybackStateCompat'ünüzde yapılan 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ı yükleyemezseniz (ör. kimlik doğrulama gerekiyorsa ve kullanıcı oturum açmadıysa) boş bir göz atma ağacı gönderin. Bunu belirtmek için kök medya düğümü için onLoadChildren() kaynağından null sonuç döndürün. Bu durumda sistem, PlaybackStateCompat'te ayarlanan hata mesajını içeren tam ekran bir hata mesajı gösterir.

Eyleme dönüştürülebilir hatalar

Bir hata düzeltilebilir durumdaysa PlaybackStateCompat bölümünde aşağıdaki iki ek ayarı da yapın:

Düzeltilebilir hatalar Dialog olarak görünür ve yalnızca araç durdurulduğunda kullanıcılar tarafından çözülebilir.

Hata örneklerini test etme

Uygulamanızın aşağıdakiler de dahil olmak üzere tüm senaryolarda hataları sorunsuz bir şekilde ele aldığını doğrulayın:

  • Ürününüzün farklı katmanları: Örneğin, ücretsiz ve premium veya oturum açmış ve oturum kapatmış
  • Farklı sürüş durumları: Örneğin, park edilmiş ve sürüş sırasında
  • Farklı bağlantı durumları: Örneğin, online ve çevrimdışı

Dikkat edilmesi gereken diğer noktalar

Android Automotive OS uygulamanızı geliştirirken aşağıdaki hususları da göz önünde bulundurun:

Çevrimdışı içerik

Mümkünse çevrimdışı oynatma desteğini uygulayın. Android Automotive OS yüklü araçların kendi veri bağlantılarına sahip olması beklenir. Yani veri planı, aracın maliyetine dahildir veya kullanıcı tarafından ödenir. Ancak arabaların mobil cihazlardan daha değişken bir bağlantıya sahip olması da bekleniyor.

Çevrimdışı destek stratejinizi belirlerken göz önünde bulundurmanız gereken birkaç nokta aşağıda verilmiştir:

  • İçerik indirmek için en uygun zaman, uygulamanız kullanımdaykendir.
  • Kablosuz bağlantının kullanılabileceğini varsaymayın. Bir araba hiçbir zaman kablosuz aralığa giremeyebilir veya OEM, hücresel ağ için kablosuz bağlantıyı devre dışı bırakmış olabilir.
  • Kullanıcıların kullanmasını beklediğiniz içeriği akıllıca önbelleğe almak sorun olmasa da kullanıcının ayarlar etkinliğiniz aracılığıyla bu davranışı değiştirmesine izin vermenizi öneririz.
  • Araçlardaki disk alanı değişiklik gösterir. Bu nedenle, kullanıcılara çevrimdışı içerikleri silmeleri için bir yol sunun (ör. ayarlar etkinliğinizdeki bir seçenek aracılığıyla).

WebView desteği

WebView'ler Android Automotive OS'te desteklenir ancak yalnızca ayarlarınız ve oturum açma etkinlikleriniz için izin verilir. WebView kullanan etkinliklerde, WebView dışında bir "kapat" veya "geri" olanağı bulunmalıdır.

Web Görünümü'nün kabul edilebilir kullanım alanlarına dair bazı örnekler:

  • Gizlilik politikanızı, hizmet şartlarınızı veya yasal konularla ilgili diğer bağlantıları ayarlarınız etkinliğinde gösterme
  • Oturum açma etkinliğinizde web tabanlı bir akış.

WebView kullanırken JavaScript'i etkinleştirebilirsiniz.

WebView'inizin güvenliğini sağlama

Web Görünümü'nüzün daha geniş internete giriş noktası olmaması için mümkün olan tüm önlemleri alın. WebView'in loadUrl() çağrısında kullanılan URL'ye nasıl kilitleneceği ve yönlendirmelerin nasıl önleneceğiyle ilgili örnek için aşağıdaki kod snippet'ine bakın. Mümkün olduğunda (ör. yasal konularla ilgili bağlantılar gösterirken) 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 Paketi 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ıyorsanız uygulamanızın iki ayrı Play Store girişi vardır. Mevcut paket adınızı yeniden kullanırsanız uygulamanız her iki platformda da tek bir girişe sahip olur.

Bu, esas olarak işletmeyle ilgili bir karardır. Ö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ı kullanmak ve her ekibin kendi Play Store girişini yönetmesine izin vermek 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ı kullanmaya devam etmek ile yeni bir paket adı kullanmak arasındaki diğer bazı temel farklılıklar ö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 "hızlı uygulama yeniden yükleme" Hayır
Play Store inceleme süreci İncelemeleri engelleme: Bir APK'nın incelemesi başarısız olursa aynı sürümde gönderilen diğer APK'lar engellenir Bağımsız yorumlar
İstatistikler, metrikler ve önemli metrikler Birleştirilmiş: Otomotiv sektörüne özgü verileri filtreleyebilirsiniz. Ayır
Dizine ekleme ve arama sıralaması Mevcut konumdan yararlanma Aktarım yapılamaz.
Diğer uygulamalarla entegrasyon Medya kodunun her iki APK arasında paylaşıldığı varsayıldığında büyük olasılıkla değişiklik gerekmez. İlgili uygulamayı (ör. Google Asistan ile URI oynatma) 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 araç API'lerine nasıl erişebiliriz?

OEM tarafından kullanıma sunulan API'lerle sınırlısınız. Bu API'lere erişim şeklinizi standartlaştırmak için süreçler geliştirilmektedir.

Uygulamalar, CarPropertyManager içinde SetProperty() ve GetProperty() öğelerini kullanarak araba API'lerine erişebilir. Mevcut tüm özelliklerin listesini görmek için kaynak koda veya referans dokümanlarına bakın. Mülk, @SystemApi ile notlandırılmışsa ö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ı kullanmayla ilgili herhangi bir kısıtlama veya öneri var mı?

Üçüncü taraf SDK'ları ve kitaplıklarının kullanımıyla ilgili özel yönergelerimiz yoktur. Üçüncü taraf SDK'ları ve kitaplıklarını kullanmayı seçseniz bile tüm araç uygulaması kalite koşullarına uymaktan sorumlusunuz.

Ön plan hizmeti kullanabilir miyim?

Ön plan hizmetlerinin yalnızca çevrimdışı kullanım için içerik indirme amacıyla kullanılmasına izin verilir. Ön plan hizmetleriyle ilgili destek görmek istediğiniz başka bir kullanım alanı varsa Android Automotive OS tartışma grubunu kullanarak bizimle iletişime geçin.

Android Automotive OS uygulamalarını yayınlama

Android Automotive OS uygulamamı Google Play Console'u kullanarak nasıl yayınlayabilirim?

Android Automotive OS uygulamanızı Google Play Console'u kullanarak yayınlama hakkında ayrıntılı bilgi için Arabalara dağıtma başlıklı makaleyi inceleyin.

Ek kaynaklar

Android Automotive OS hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.

Örnekler

Kılavuzlar

Bloglar

Videolar

Android Automotive OS medyasıyla ilgili sorunları bildirme

Android Automotive OS için medya uygulamanızı geliştirirken sorunla karşılaşırsanız Google Sorun Takip Aracı'nı kullanarak sorunu bildirebilirsiniz. Sorun şablonunda istenen tüm bilgileri doldurduğunuzdan emin olun.

Yeni bir sorun oluşturma

Yeni bir sorun bildirmeden önce, sorunun sorun 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.