Şablonlu medya uygulaması oluşturma

Şablonlu medya uygulamaları beta sürümündedir
Şu anda herkes, Google Play Store'daki dahili test ve kapalı test kanallarında şablonlu medya uygulamaları yayınlayabilir. Açık kanallara ve üretim kanallarına yayınlama daha sonraki bir tarihte mümkün olacaktır.

Araba Uygulama Kitaplığı şablonlarını kullanan medya uygulamaları, medya tarama ve oynatma deneyimlerini özelleştirebilir. Bu uygulamalar, deneyimin araba ekranları için optimize edilmesini ve sürüş sırasında dikkat dağıtıcı unsurların en aza indirilmesini sağlar.

Bu kılavuzda, telefonda ses oynatan bir medya uygulamanızın olduğu ve medya uygulamanızın Android medya uygulaması mimarisine uygun olduğu varsayılmaktadır. Araba Uygulama Kitaplığı, uygulama içi deneyimi Build media apps for cars MediaBrowser veri yapısı kullanılarak oluşturulanlar yerine şablonlarla değiştirmenize olanak tanır. Yine de oynatma kontrolleri için MediaSession, öneriler ve diğer akıllı deneyimler için kullanılan MediaBrowserService veya MediaLibraryService sağlamanız gerekir.

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

Arabalar için Android uygulama kitaplığını kullanma başlıklı makalede açıklanan adımlara ek olarak, şablonlu medya uygulamaları için aşağıdakiler gereklidir:

Manifest dosyanızda kategori desteğini bildirin

Uygulamanız, CarAppService manifest dosyasının intent filtresinde androidx.car.app.category.MEDIA araba uygulaması kategorisini beyan etmelidir.

<application>
    ...
   <service
       ...
        android:name=".MyCarAppService"
        android:exported="true">
      <intent-filter>
        <action android:name="androidx.car.app.CarAppService" />
        <category android:name="androidx.car.app.category.MEDIA"/>
      </intent-filter>
    </service>
    ...
<application>

MediaPlaybackTemplate özelliğine erişmek için uygulamanızın manifest dosyasında androidx.car.app.MEDIA_TEMPLATES iznini de beyan etmesi gerekir:

<manifest ...>
  ...
  <uses-permission android:name="androidx.car.app.MEDIA_TEMPLATES"/>
  ...
</manifest>

Minimum Car App API düzeyini ayarlama

MediaPlaybackTemplate kullanan medya uygulamaları yalnızca CAL API 8 ve sonraki sürümlerde desteklenir. Minimum Car App API level değerinizin 8 olarak ayarlandığından emin olun.

<application ...>
  ...
  <meta-data
    android:name="androidx.car.app.minCarApiLevel"
    android:value="8"/>
  ...
</application>

Atıf simgesi sağlama

Car App Library kullanılarak oluşturulan medya uygulamaları için atfetme simgesi eklediğinizden emin olun.

Android Auto desteğini beyan etme

Uygulamanızın manifest dosyasına aşağıdakilerin eklendiğinden emin olun:

<application>
  ...
  <meta-data android:name="com.google.android.gms.car.application"
      android:resource="@xml/automotive_app_desc"/>
  ...
</application>

Ardından, xml kaynaklarınızdaki automotive_app_desc.xml öğesine şablon bildirimini ekleyin. Şu şekilde görünmelidir:

<automotiveApp xmlns:android="http://schemas.android.com/apk/res/android">
 <uses name="media"/>
 <uses name="template"/>
</automotiveApp>

Android Automotive OS desteğini beyan etme

Android Automotive OS'te Car App Library'nin etkinleştirildiği bir medya uygulamasını dağıtmanın iki farklı yolu vardır: tek bir APK olarak veya iki ayrı APK olarak. Tek bir APK dağıtıyorsanız bu APK, Android Automotive OS için etkinleştirilmiş ve Car App Library ana makinesiyle birlikte gelen araçları destekler. Bu araçlar desteklenmiyorsa daha eski Android sürümlerinde (Android 10 - Android 13) bile MediaBrowserService veya MediaLibraryService uygulamasına geri döner. İki ayrı APK dağıtmayı seçerseniz uygulamanızın MediaBrowserService veya MediaLibraryService sürümünü etkileme endişesi olmadan Car App Library sürümüne eklenen yeni özellikleri güncelleyebilirsiniz.

Tek bir APK dağıtma

Uygulamanızın Car App Library ve MediaBrowserService veya MediaLibraryService sürümleri için tek bir APK dağıtırken android.software.car.templates_host.media değerini android:required="false" olarak ayarlamanız çok önemlidir.

<uses-feature android:name="android.software.car.templates_host.media" android:required="false"/>

Ardından, AAOS için Araba Uygulaması Kitaplığı kurallarını uygulayın ve başlatılabilir bir CarAppActivity (veya trambolin etkinliği) kullanıma sunun. Manifest dosyasında etkinliği android:enabled="false" olarak ayarlamanız gerekir. Ardından, MediaBrowserService bileşenini yedek olarak belirten bir meta veri etiketi ekleyin.CarAppActivity Aşağıdaki örnek manifesti inceleyin:

<service android:name=".media.MyMediaService"
    android:exported="true"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="androidx.media3.session.MediaLibraryService"/>
    </intent-filter>

    <!-- Link to Car App Library Activity -->
    <meta-data
        android:name="androidx.car.app.media.CalMediaActivityComponent"
        android:value="com.example.mediaapp.LaunchableTrampoline"/>
</service>

<activity
    android:name=".LaunchableTrampoline"
    android:exported="true"
    android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
    android:launchMode="singleTask"
    android:label="@string/app_name_cal"
    android:enabled="false"> <!-- Set to false -->

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

    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

Play dağıtımı

Araba uygulama kitaplığını içeren ve MediaBrowserService veya MediaLibraryService izinlerinin etkinleştirildiği APK'nızda daha yüksek bir sürüm kodu ve Android 14'ü (34) hedefleyen bir minSdk olmalıdır.

İki APK ile dağıtım

Biri Car App Library'yi, diğeri MediaBrowserService veya MediaLibraryService'yi kullanan iki ayrı APK dağıtmak için doğru araç özelliklerinin doğru şekilde hedeflendiğinden emin olmak üzere aşağıdaki adımları uygulayın.

Uygulamanızın Arabalar için Android uygulama kitaplığı sürümü için ayrı bir APK oluştururken android.software.car.templates_host.media değerini android:required=true olarak ayarlamanız gerekir. Bu, uygulamanın yalnızca Car App Library ana makinesi desteğiyle sertifikalandırılmış Android Automotive OS derlemelerinde dağıtılmasını sağlar.

<uses-feature android:name="android.software.car.templates_host.media" android:required="true"/>

android.software.car.templates_host.media kullanıp android:required=true olarak ayarlamanın yanı sıra, başlatılabilir Car App Library etkinliğiniz için Android Automotive OS'i etkinleştirmek üzere aşağıdaki adımları uygulayın.

Play Dağıtımı

Araba Uygulaması Kitaplığı'nı kullanan APK, Automotive OS'e özel kanalda dağıtılmalıdır.

Sesli işlemleri destekleme

Kullanıcıların yaygın işlemleri ellerini kullanmadan tamamlamasına olanak tanımak için uygulamanızda sesli komut özelliğini etkinleştirin. Daha ayrıntılı uygulama talimatları için medya için sesli işlemleri destekleme başlıklı makaleyi inceleyin. Şablonlu bir medya uygulamasında sesli komut aldığınızda MediaBrowserService veya MediaLibraryService öğelerinizi arama sonuçlarıyla güncellemeniz gerekmez. Bunun yerine, medya oynatma şablonunuza kullanıcının bu oynatma veya arama sorgusuna göre daha fazla içerik bulmasına olanak tanıyan bir işlem eklemeyi düşünebilirsiniz. VC-1 kalite yönergesini karşılamak için sesli komutları desteklemek gerekir.

Oynatma şablonunuzu oluşturma

MediaPlaybackTemplate, araba uygulaması kitaplığınızdaki medya uygulamasında medya oynatma bilgilerini gösterir. Bu şablon, başlık içeren bir üstbilgi ve özelleştirilebilir işlemler ayarlamaya olanak tanır. Medya bilgileri ve oynatma kontrolleri ise uygulamanızın MediaSession durumuna göre ana makine tarafından doldurulur.

Bir müzik çalar, Summer Fielding'in Sounds of Spring adlı şarkısını çalarken gitar çalan bir kadının kare portresini gösteriyor.

Şekil 1: Üst kısımda sırayı açmak için başlık işlemi içeren MediaPlaybackTemplate.

Bu kod örneğinde, kullanıcının şarkı sırasının bulunduğu ekrana gitmesine olanak tanıyan bir başlık işlemi ayarlayan örnek bir oynatma şablonunun nasıl oluşturulacağı gösterilmektedir.

val playbackTemplate = MediaPlaybackTemplate.Builder()
      .setHeader(
        Header.Builder()
          .setStartHeaderAction(Action.BACK)
          .addEndHeaderAction(
                Action.Builder()
                  .setTitle(model.context.getString(R.string.queue_button_title))
                  .setIcon(
                    CarIcon.Builder(
                        IconCompat.createWithResource(
                          model.context,
                          R.drawable.gs_queue_music_vd_theme_24,
                        ))
                      .build())
                  .setOnClickListener(showQueueScreen())
                  .build())
          .setTitle(model.context.getString(R.string.media_playback_view_title))
          .build())
      .build()

MediaPlaybackTemplate kullanırken CarAppService içindeki MediaPlaybackManager kullanarak MediaSession jetonu kaydedin. Aksi takdirde, ana makineye MediaPlaybackTemplate gönderildiğinde hata gösterilir.

import androidx.car.app.media.MediaPlaybackManager
…

override fun onCreateSession(sessionInfo: SessionInfo): Session {
    return object : Session() {
        …

        init {
          lifecycle.addObserver(
            LifecycleEventObserver { _, event ->
              if (event == ON_CREATE) {
                val token = ... // MediaSessionCompat.Token
                (carContext.getCarService(CarContext.MEDIA_PLAYBACK_SERVICE) as MediaPlaybackManager)
                  .registerMediaPlaybackToken(token)
              }
              ...
            }
          )
        }
    }
}

.registerMediaPlaybackToken, medya oynatma bilgilerini ve kontrollerini Android Auto'da göstermek için gereklidir. Bu, düzenleyenin medyaya özel bildirimler oluşturması için de önemlidir.

Standart MediaSessionCompat.Token yerine PlatformToken kullanan Media3 kitaplığını kullanan uygulamalarda, oturumun temel platform jetonunu (session.platformToken) döndüren MediaLibrarySession.Callback içinde özel bir SessionCommand uygulamanız gerekir. Oturuma şu özel komutu gönderin:CarAppService Platform jetonunu aldıktan sonra MediaSessionCompat.Token.fromToken(platformToken) kullanarak dönüştürün ve bu uyumluluk jetonunu .registerMediaPlaybackToken() içinde Car App Library'ye iletin.

Şablonları kullanarak medyaları düzenleme

Şarkılar veya albümler gibi göz atma amaçlı medyaları düzenlemek için SectionedItemTemplate özelliğini kullanmanızı öneririz. Bu özellik, GridSection ve RowSection öğelerini birlikte kullanarak resim listeleri ve metin öğelerini karıştıran düzenler oluşturmanıza olanak tanır.

Bir müzik uygulaması arayüzünde, iki dikey sıra ve üç yatay albüm kapağı portresi olmak üzere son çalınan şarkılar ve albümler gösteriliyor.

Şekil 2: RowSection ve ardından GridSection içeren bir A SectionedItemTemplate

TabTemplate içinde SectionedItemTemplate kullanma

Uygulamanızdaki medyayı kategorize etmenin kolay bir yolu, TabTemplate içinde SectionedItemTemplate kullanmaktır.

val template =
      SectionedItemTemplate.Builder()...build();
val tabTemplate =
      TabTemplate.Builder(tabCallback)
          .setTabContents(TabContents.Builder(template).build)
          .setHeaderAction(Action.APP_ICON)
          …
          .build();

Araba uygulaması kitaplığı 1.9 bileşenleri ve özellikleri

Car App Library API 1.9 sürümü, çip, ilerleme çubukları, yoğunlaştırılmış öğeler, etkileşimli ve genişletilmiş başlık, öne çıkan bölümler ve banner'lar gibi benzersiz göz atma özellikleri için özelleştirilmiş bileşenler sunar.

Bir müzik uygulaması arayüzünde, iki dikey sıra ve üç yatay albüm kapağı portresi olmak üzere son çalınan şarkılar ve albümler gösteriliyor.

Şekil 3: Chips, Condensed Items, Interactive Header, Grid Items ve Minimized Control Panel içeren bir A SectionedItemTemplate

Bir müzik uygulaması arayüzünde, iki dikey sıra ve üç yatay albüm kapağı portresi olmak üzere son çalınan şarkılar ve albümler gösteriliyor.

Şekil 4: Expanded Header, Spotlight Sections ve Progress Bars simgelerini içeren iki medya tarama ekranı

Bu şablonları kullanarak medya uygulamanızın kullanıcı arayüzünü tasarlama hakkında daha fazla bilgi için Medya uygulamaları başlıklı makaleyi inceleyin.

Kullanıcının, medyaya göz atarken MediaPlaybackTemplate bölümüne en az dikkat dağıtıcı unsurla hızlıca gidebilmesi önemlidir.MFT-1 kalite şartını karşılamak için uygulamanızda tüm medya tarama ekranlarından MediaPlaybackTemplate bölümüne erişilebilmelidir.

SectionedItemTemplate kullanıyorsanız medya oynatma ekranına yönlendiren bir işlem düğmesi ekleyerek bunu yapabilirsiniz. Standart Car App Library Action.MEDIA_PLAYBACK işlemini kullanın. Medya uygulamaları bu işlemi küçültülmüş kontrol paneli olarak gösterir. Bu, Car App Library API 1.9 veya sonraki sürümlerini kullanıyorsanız MFT-1 kalite şartını karşılamak için gereklidir. Diğer şablonlarda ise bu işlemi yapmak için başlık işlemi kullanılabilir.

Sistem medya oynatma amaçlarını işleme

Bir uygulama, medya kartı gibi medya oynatan bir sistem yüzeyinden başlatıldığında kullanıcının MediaPlaybackTemplate simgesine yönlendirilmesi gerekir. Kullanıcılara sorunsuz bir deneyim sunmak için medya uygulamalarının bu Intent Action işlemesi gerekir.

androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK işlemini, Car App Library bileşeninizin intent-filter'ına (CarAppActivity veya trambolininiz Activity) ekleyin.

onNewIntent() işlevinin çağrılması için etkinliğinizin launchModesingleTask veya singleTop kullandığından emin olun.

<activity
    android:name=".LaunchableTrampoline"
    android:exported="true"
    android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
    android:launchMode="singleTask"
    android:label="@string/app_name_cal"
    android:enabled="false">

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

    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

Gelen amaçları ayrıştırmak için Session sınıfınızda onNewIntent()'i geçersiz kılın. Gelen amaç işlemi SHOW_MEDIA_PLAYBACK ile eşleşiyorsa kullanıcıyı Ne Çalıyor? ekranınıza yönlendirin.

@Override
public void onNewIntent(@NonNull Intent intent) {
    super.onNewIntent(intent);
    if (SHOW_MEDIA_PLAYBACK.equals(intent.getAction())) {
        ScreenManager screenManager = getCarContext().getCarService(ScreenManager.class);
        // Avoid redundant navigation if already on the playing screen
        if (screenManager.getTop() instanceof MyMediaPlayScreen) {
            return;
        }
        screenManager.push(MyMediaPlayScreen.createScreenFromPlaying(
                getCarContext(), mMediaSessionController));
    }
}

Trambolin etkinliği kullanıyorsanız onCreate() içinde intent işlemini kontrol edin. finish() işlevi çağrılmadan önce bu işlemi CarAppActivity oluşturma amacına iletin.

public class LaunchableTrampoline extends AppCompatActivity {
    private static final String SHOW_MEDIA_PLAYBACK = "androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent receivedIntent = getIntent();
        String action;

        if (SHOW_MEDIA_PLAYBACK.equals(receivedIntent.getAction())) {
            action = SHOW_MEDIA_PLAYBACK;
        } else {
            action = Intent.ACTION_MAIN;
        }

        Intent intent = new Intent(action);
        intent.setClassName(getPackageName(), "androidx.car.app.activity.CarAppActivity");
        startActivity(intent);
        finish();
    }
}