Arabalar için Android Uygulama Kitaplığı'nı kullanma

Arabalar için Android Uygulama Kitaplığı Navigasyon, önemli yer (ÖY) ve nesnelerin internetini (IOT) getirmenizi sağlar arabaya kolayca yükleyebilirsiniz. Bunu, sürücünün dikkatini dağıtan unsurlardan etkilenmemek için tasarlanmış şablonlar sunarak yapar. çeşitli ayrıntıları (ör. araba ekranı faktörleri) hesaba katarak gibi düşünmeye başladık.

Bu kılavuzda kitaplığın temel özellik ve kavramlarına genel bir bakış sunulmaktadır ve temel bir uygulamayı kurma sürecinde size yol gösterir.

Başlamadan önce

  1. Sürüş İçin Tasarlama başlıklı makaleyi inceleyin Araba Uygulama Kitaplığı ile ilgili sayfalar
  2. Aşağıda belirtilen önemli terimleri ve kavramları inceleyin bölümüne bakın.
  3. Android Auto Sistemi hakkında bilgi edinin Kullanıcı arayüzü ve Android Automotive OS tasarım.
  4. Sürüm Notları'nı inceleyin.
  5. Sana Özel'i inceleyin.

Anahtar terimler ve kavramlar

Modeller ve Şablonlar
Kullanıcı arayüzü, model nesnelerinin grafiğiyle temsil edilir. ait oldukları şablonun izin verdiği ölçüde farklı şekillerde bir araya getirilmiş . Şablonlar, söz konusu şablonlarda kök oluşturabilecek modellerin veya grafiğe dönüştürülebilir. Modeller, özelliklerini yapılandırmak için özelliklerin yanı sıra, metin ve bu tür bilgilerin görsel görünümü (örneğin, metin renkleri veya resim seçin. Ana makine, modellerin bu ekranlara sığması için tasarlanmış görünümlere sürücünün dikkatini dağıtan standartların belirlenmesini sağlar ve çeşitlilik, ve giriş modlarını da göz önünde bulundurduk.
Düzenleyen
Ana makine, sunulan işlevi uygulayan arka uç bileşenidir kitaplığın API'lerine göre değiştirmeniz gerekiyor. İlgili içeriği oluşturmak için kullanılan kullanıcıların sorumlulukları, uygulamanızı keşfederken ve yöneterek dönüşüm modelleme yaşam döngüsünü temsil etme ve uygulamanızı bilgilendirme bir veri kümesidir. Mobil cihazlarda, bu ana makine Android tarafından uygulanır Otomatik. Bu ana makine, Android Automotive OS'te sistem uygulaması olarak yüklenir.
Şablon kısıtlamaları
Farklı şablonlar modellerinin içeriğine dair kısıtlamalar uygular. Örneğin, Örneğin, liste şablonlarında belirli sayıda öğe için kullanıcıya sunulur. Şablonlar, önlerine eklenebilecek bağlantılı olmalı ve ortaya koymalıdır. Örneğin, uygulama yalnızca beş şablon kullanabilirsiniz. Görüntüleyin Ayrıntılı bilgi için şablon kısıtlamaları başlıklı makaleyi inceleyin.
Screen
Screen uygulamaların, Search Ads 360'a sunulan kullanıcı arayüzünü yönetmek için belirtir. Bir Screen, yaşam döngüsünü belirler ve uygulamanın Ekran görünür olduğunda görüntülenecek şablonu gönderin. Screen örnek de aktarılabilir ve bir Screen yığınına koyuluyor. şu politikalara bağlı kalmalarını sağlar: şablon akışı kısıtlamalarına dikkat edin.
CarAppService
CarAppService bir soyut Service sınıfı ana makine tarafından keşfedilmesi ve yönetilmesi için uygulanması ve dışa aktarılması gerekir. Uygulamanızın CarAppService metriği bir ana makine bağlantısının createHostValidator ve ardından Session her bir bağlantı için farklı örnekler onCreateSession
Session

Session şu soyut bir sınıftır: uygulamanız, DMAIC ve PDCA gibi CarAppService.onCreateSession. Bu, araç ekranında bilgi görüntülemek için giriş noktası görevi görür. Google bir yaşam döngüsüne sahip olduğundan uygulamanızın araç ekranındaki mevcut durumu (ör. görünür veya gizli olabilir.

Session başlatıldığında, örneğin Uygulama ilk kez başlatıldığında ana makine, Screen onCreateScreen yöntemidir.

Araba uygulaması kitaplığını yükleme

Jetpack kütüphanesini görün sürüm sayfası kitaplığı uygulamanıza eklemeyle ilgili talimatlar.

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

Araba uygulamanızı oluşturabilmek için öncelikle uygulamanızın manifest dosyalarını aşağıdaki gibi kullanın.

CarAppService'inizi tanımlama

Barındırıcı, uygulamanıza CarAppService uygulanması. Siz ana makinenin keşfetmesine ve bağlanmasına izin vermek için bu hizmeti manifest dosyanızda bildirin ekleyin.

Ayrıca, uygulamanızın kategorisini Uygulamanızın <category> öğesi intent filtresine dokunun. Şu listeye bakın: desteklenen uygulama kategorilerinde bulabilirsiniz. için geçerlidir.

Aşağıdaki kod snippet'i, belirli bir nokta için araba uygulaması hizmetinin nasıl beyan edileceğini gösterir. manifest dosyanızdaki ilgi uygulamasını seçin:

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

    ...
<application>

Desteklenen uygulama kategorileri

Aşağıdaki kategoriden bir veya daha fazlasını ekleyerek uygulamanızın kategorisini tanımlayın CarAppService metriğinizi açıklandığı şekilde bildirdiğinizde intent filtresinde değerler önceki bölümde:

ziyaret edin.

Aşağıdakiler için Arabalar için Android uygulama kalitesi bölümüne bakın her kategorinin ayrıntılı açıklaması ve uygulamaların o gruba ait olması için ölçütler.

Uygulama adını ve simgesini belirtme

Barındırıcının alan adınızı temsil etmesi için kullanabileceği bir uygulama adı ve inceleyebilirsiniz.

Uygulamanızı temsil etmek için kullanılan uygulama adını ve simgesini label ve icon özellikleri CarAppService:

...
<service
   android:name=".MyCarAppService"
   android:exported="true"
   android:label="@string/my_app_name"
   android:icon="@drawable/my_app_icon">
   ...
</service>
...

Etiket veya simge <service> öğesi, ana makine için belirtilen değerlere <application> öğesi.

Özel tema ayarlama

Araba uygulamanız için özel bir tema ayarlamak üzere bir <meta-data> öğesi aşağıdaki gibi bir manifest dosyası oluşturun:

<meta-data
    android:name="androidx.car.app.theme"
    android:resource="@style/MyCarAppTheme />

Ardından stil kaynağınızı özel araba uygulamanızın teması için aşağıdaki özellikleri ayarlayın:

<resources>
  <style name="MyCarAppTheme">
    <item name="carColorPrimary">@layout/my_primary_car_color</item>
    <item name="carColorPrimaryDark">@layout/my_primary_dark_car_color</item>
    <item name="carColorSecondary">@layout/my_secondary_car_color</item>
    <item name="carColorSecondaryDark">@layout/my_secondary_dark_car_color</item>
    <item name="carPermissionActivityLayout">@layout/my_custom_background</item>
  </style>
</resources>

Araba Uygulaması API düzeyi

Car App Library kendi API seviyelerini tanımlar. Böylece hangi seviyelerde kitaplık özellikleri, bir araçtaki şablon ana makinesi tarafından desteklenir. Bir ana makine tarafından desteklenen en yüksek Car App API Düzeyini almak için getCarAppApiLevel() yöntemidir.

Uygulamanızın desteklediği minimum Car App API Düzeyini AndroidManifest.xml dosyası:

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

Şuna ilişkin dokümanlara bakın: RequiresCarApi geriye dönük uyumluluğun nasıl korunacağı ve ilgili özelliklerin nasıl bildirileceği bir özelliği kullanmak için gereken minimum API düzeyi. Hangi API'nin Araba uygulaması kitaplığının belirli bir özelliğini kullanmak için seviye gerekir, referans belgeleme CarAppApiLevels.

CarAppService ve oturumunuzu oluşturma

Uygulamanız CarAppService sınıfını kullanma ve uygulama onun onCreateSession Session döndüren bir yöntem ana makineye mevcut bağlantıya karşılık gelen örnekle aynı olacaktır:

Kotlin

class HelloWorldService : CarAppService() {
    ...
    override fun onCreateSession(): Session {
        return HelloWorldSession()
    }
    ...
}

Java

public final class HelloWorldService extends CarAppService {
    ...
    @Override
    @NonNull
    public Session onCreateSession() {
        return new HelloWorldSession();
    }
    ...
}

Session örneği şunlardan sorumludur: öğesini kullanmak için Screen örneğini döndürme Uygulama ilk kez başlatıldığında:

Kotlin

class HelloWorldSession : Session() {
    ...
    override fun onCreateScreen(intent: Intent): Screen {
        return HelloWorldScreen(carContext)
    }
    ...
}

Java

public final class HelloWorldSession extends Session {
    ...
    @Override
    @NonNull
    public Screen onCreateScreen(@NonNull Intent intent) {
        return new HelloWorldScreen(getCarContext());
    }
    ...
}

Araba uygulamanızın farklı bir ekrandan başlaması gereken uygulamanızın ana veya açılış ekranında (ör. derin bağlantıları yönetme) bir grup ekranı ön başlangıç noktası olarak ScreenManager.push şuradan dönmeden önce: onCreateScreen. Ön başlangıç noktası, kullanıcıların ilk andan itibaren önceki ekranlara geri gitmelerine gösteren bir ekran görüntüsüdür.

Başlangıç ekranınızı oluşturun

Uygulamanız tarafından görüntülenen ekranları, Screen sınıfını kullanıyor ve onGetTemplate yöntemini döndürür. Template örneği araç ekranında görüntülenecek kullanıcı arayüzünün durumu.

Aşağıdaki snippet, bir Screen kullanan PaneTemplate şablonu basit bir "Merhaba dünya!" mesajı dize:

Kotlin

class HelloWorldScreen(carContext: CarContext) : Screen(carContext) {
    override fun onGetTemplate(): Template {
        val row = Row.Builder().setTitle("Hello world!").build()
        val pane = Pane.Builder().addRow(row).build()
        return PaneTemplate.Builder(pane)
            .setHeaderAction(Action.APP_ICON)
            .build()
    }
}

Java

public class HelloWorldScreen extends Screen {
    @NonNull
    @Override
    public Template onGetTemplate() {
        Row row = new Row.Builder().setTitle("Hello world!").build();
        Pane pane = new Pane.Builder().addRow(row).build();
        return new PaneTemplate.Builder(pane)
            .setHeaderAction(Action.APP_ICON)
            .build();
    }
}

CarContext sınıfı

CarContext sınıfı bir ContextWrapper alt sınıf Session ve Screen örnek. Erişim sağlar araba hizmetlerine, örneğin ScreenManager ekran yığını; "the" Uygulamayla ilgili genel için AppManager harita çizme için Surface nesnesine erişim gibi işlevler; ve NavigationManager Adım adım navigasyon uygulamaları tarafından navigasyonu bildirmek için kullanılır meta veriler ve diğer gezinmeyle ilgili sürecek bu bilgilerden faydalanabilirsiniz.

Gezinmeye erişme şablonları kullanarak gezinme uygulamalarında kullanılabilen kitaplık işlevlerinin kapsamlı bir listesidir.

CarContext başka fırsatlar da sunuyor yapılandırma ayarlarını kullanarak çekilebilir kaynakları yüklemenize izin verme gibi işlevler araba ekranından, niyetleri kullanarak arabada bir uygulama başlatabilir, ve uygulamanızın haritasını koyu tema içinde gösterip göstermeyeceğini belirtmek için de kullanılır.

Ekranda gezinme özelliğini uygulayın

Uygulamalarda genelde pek çok farklı ekran sunulur. Bu ekranların her birinde farklı bir ekran Kullanıcının etkileşimde bulunurken gezinebileceği farklı şablonlar ekranda görüntülenen arayüz.

ScreenManager sınıfı şunları sağlar: otomatik olarak açılabilen ekranları itmek için kullanabileceğiniz bir ekran yığını Kullanıcı araba ekranında bir geri düğmesini seçtiğinde veya donanımı geri kullandığında düğmesi bazı arabalarda bulunur.

Aşağıdaki snippet'te bir ileti şablonuna "geri" işleminin nasıl Ayrıca kullanıcı tarafından seçildiğinde yeni bir ekran iten bir işlem:

Kotlin

val template = MessageTemplate.Builder("Hello world!")
    .setHeaderAction(Action.BACK)
    .addAction(
        Action.Builder()
            .setTitle("Next screen")
            .setOnClickListener { screenManager.push(NextScreen(carContext)) }
            .build())
    .build()

Java

MessageTemplate template = new MessageTemplate.Builder("Hello world!")
    .setHeaderAction(Action.BACK)
    .addAction(
        new Action.Builder()
            .setTitle("Next screen")
            .setOnClickListener(
                () -> getScreenManager().push(new NextScreen(getCarContext())))
            .build())
    .build();

Action.BACK nesnesi bir otomatik olarak ayarlanmış standart Action ScreenManager.pop komutunu çağırır. Bu davranış, OnBackPressedDispatcher mevcut örneği CarContext.

Sürüş sırasında uygulamanın güvenli bir şekilde kullanılabilmesini sağlamak için ekran yığınında Maksimum derinliği olan beş ekran. Şablon kısıtlamaları'nı inceleyin. bölümüne bakın.

Şablonun içeriğini yenileme

Uygulamanız, Screen, Screen.invalidate yöntemini kullanabilirsiniz. Ardından, toplantıyı düzenleyen kullanıcı daha sonra Screen.onGetTemplate yöntemini kullanabilirsiniz.

Bir Screen yenilenirken şablonda güncellenebilecek belirli içerikleri Bu nedenle ana makine, yeni şablonu şablon kotasına dahil etmez. Daha fazla ayrıntı için Şablon kısıtlamaları bölümüne bakın.

Ekranlarınızı, bire bir gelecek şekilde yapılandırmanızı öneririz. Screen ile türü arasındaki eşleme şablonu onGetTemplate uygulaması aracılığıyla döndürüyor.

Harita çizin

Aşağıdaki şablonları kullanan navigasyon ve önemli yer (ÖY) uygulamaları şunları yapabilir: harita çizmek için bir Surfaceya erişin:

Şablon Şablon izni Kategori rehberliği
NavigationTemplate androidx.car.app.NAVIGATION_TEMPLATES Gezinme
MapWithContentTemplate androidx.car.app.NAVIGATION_TEMPLATES VEYA
androidx.car.app.MAP_TEMPLATES
Navigasyon, ÖY
MapTemplate (desteği sonlandırılmış) androidx.car.app.NAVIGATION_TEMPLATES Gezinme
PlaceListNavigationTemplate (desteği sonlandırılmış) androidx.car.app.NAVIGATION_TEMPLATES Gezinme
RoutePreviewNavigationTemplate (desteği sonlandırılmış) androidx.car.app.NAVIGATION_TEMPLATES Gezinme

Yüzey izni beyanı

Uygulamanızın kullandığı şablon için gereken izne ek olarak uygulamanız, androidx.car.app.ACCESS_SURFACE iznini Yüzeye erişmek için AndroidManifest.xml dosyası oluşturun:

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

Yüzeylere erişin

Barındırıcının sağladığı Surface öğesine erişmek için bir SurfaceCallback ve sağlayın AppManager uygulanmasına araba servisi. Geçerli Surface, SurfaceCallbackSurfaceContainer onSurfaceAvailable() ve onSurfaceDestroyed() geri arama.

Kotlin

carContext.getCarService(AppManager::class.java).setSurfaceCallback(surfaceCallback)

Java

carContext.getCarService(AppManager.class).setSurfaceCallback(surfaceCallback);

Yüzeyin görünür alanını anlama

Ana makine, tıklayın. Yayını düzenleyen, yüzeyin görüntü alanında olması garanti edilen alanını iletir bir engeli ortadan kaldırmadığı ve kullanıcının görebileceği şekilde SurfaceCallback.onVisibleAreaChanged yöntemidir. Ayrıca, değişiklik sayısını en aza indirmek için düzenleyen SurfaceCallback.onStableAreaChanged yöntemini kullanabilirsiniz; bu yöntem, boyuta göre her zaman mevcut şablona izin verir.

Örneğin, bir navigasyon uygulaması NavigationTemplate üst kısımda bir işlem şeridi olursa, işlem şeridi Kullanıcının bir süre ekranla etkileşimde bulunmadığı durumlara bir boşluk eklersiniz. Bu durumda, onStableAreaChanged ve aynı dikdörtgen ile onVisibleAreaChanged. İşlem şeridi gizlendiğinde daha geniş alanla yalnızca onVisibleAreaChanged çağrılır. Kullanıcı ekranla etkileşimde bulunduğunda yalnızca onVisibleAreaChanged ilk dikdörtgeni oluşturur.

Koyu temayı destekleyin

Uygulamalar, haritalarını Surface örneğine uygun koyu renkle yeniden çizmelidir koşulların uygun olduğunu belirlediğinde, aşağıdaki tablodan Arabalar için Android uygulama kalitesi.

Koyu bir harita çizilip çizilmeyeceğine karar vermek için CarContext.isDarkMode yöntemidir. Koyu tema durumu her değiştiğinde, Session.onCarConfigurationChanged.

Kullanıcıların haritanızla etkileşimde bulunmasına izin verme

Aşağıdaki şablonları kullanırken, kullanıcıların etkileşime girmesi için destek ekleyebilirsiniz kullanarak bir haritanın farklı bölümlerini görmesini sağlamak gibi, için de kullanabilirsiniz.

Şablon Car App API Düzeyinden beri desteklenen etkileşim
NavigationTemplate 2
PlaceListNavigationTemplate (kullanımdan kaldırıldı) 4
RoutePreviewNavigationTemplate (kullanımdan kaldırıldı) 4
MapTemplate (kullanımdan kaldırıldı) 5 (şablonun tanıtımı)
MapWithContentTemplate 7 (şablonun tanıtımı)

Etkileşime dayalı geri çağırmalar uygulayın

SurfaceCallback arayüzü Google Haritalar'da oluşturulan haritalara etkileşim eklemek için uygulayabileceğiniz aşağıdaki adımları izleyin:

Etkileşim SurfaceCallback yöntem Car App API düzeyinden itibaren desteklenir
Dokunun onClick 5
Yakınlaştırmak için sıkıştırın onScale 2
Tek dokunuşla sürükleme onScroll 2
Tek dokunuşla hızlıca kaydırma onFling 2
İki kez dokunun onScale (ölçek faktörü, şablon ana makinesi tarafından belirlenir) 2
Kaydırma modunda döner sürükle onScroll (mesafe faktörü şablon ana makinesi tarafından belirlenir) 2

Haritaya ilişkin işlem şeridi ekle

Bu şablonlar, aşağıdaki gibi haritayla ilgili işlemler için bir harita işlem şeridine sahip olabilir: yakınlaştırma ve uzaklaştırma, yeniden ortalama ve pusulayı görüntüleme gibi görüntülemeyi seçin. Harita işlem şeridinde en fazla dört tane yalnızca simge içeren düğme bulunabilir yenilenebilen zaman çizelgesine değinmelisiniz. Boştayken gizlenir ve etkin durumda yeniden görünür.

Harita etkileşimli geri çağırmaları almak için harita işlem şeridine Action.PAN düğmesi eklemelidir. Kullanıcı kaydırma düğmesine bastığında, ana makine aşağıda açıklandığı şekilde kaydırma moduna girer bölümüne bakın.

Uygulamanız Action.PAN kodunu atlarsa düğmesinden, SurfaceCallback yöntemlerinden birini alır ve ana makine, daha önce etkinleştirilmiş olan kaydırma modunu seçin.

Dokunmatik ekranda yatay kaydırma düğmesi gösterilmez.

Kaydırma modunu anlama

Kaydırma modunda, şablon ana makinesi dokunmatik olmayan girişten kullanıcı girişini çevirir çevirmeli kumandalar ve dokunmatik alanlar gibi cihazları uygun SurfaceCallback yöntem. Kaydırma moduna girmek veya kaydırma modundan çıkmak için kullanıcı işlemine yanıt verin şununla: setPanModeListener yöntemini NavigationTemplate.Builder kullanarak değiştirebilirsiniz. Ana makine diğer kullanıcı arayüzünü gizleyebilir kullanıcı, kaydırma modundayken şablona yerleştirebilir.

Kullanıcıyla etkileşim kurma

Uygulamanız, mobil uygulamaya benzer kalıplar kullanarak kullanıcıyla etkileşim kurabilir.

Kullanıcı girişini işleme

Uygulamanız uygun dinleyicileri modeller. Aşağıdaki snippet, Şunları ayarlayan Action modeli: OnClickListener uygulamanızın kodu tarafından tanımlanan bir yöntemi geri çağırır:

Kotlin

val action = Action.Builder()
    .setTitle("Navigate")
    .setOnClickListener(::onClickNavigate)
    .build()

Java

Action action = new Action.Builder()
    .setTitle("Navigate")
    .setOnClickListener(this::onClickNavigate)
    .build();

Ardından, onClickNavigate yöntemi varsayılan navigasyon araç uygulaması öğesini kullanarak CarContext.startCarApp yöntem:

Kotlin

private fun onClickNavigate() {
    val intent = Intent(CarContext.ACTION_NAVIGATE, Uri.parse("geo:0,0?q=" + address))
    carContext.startCarApp(intent)
}

Java

private void onClickNavigate() {
    Intent intent = new Intent(CarContext.ACTION_NAVIGATE, Uri.parse("geo:0,0?q=" + address));
    getCarContext().startCarApp(intent);
}

Uygulamaları nasıl başlatacağınızla ilgili daha fazla bilgi için ACTION_NAVIGATE kullanmak istiyorsanız Amacla araba uygulaması başlatma konusuna bakın. bölümüne bakın.

Kullanıcıları mobil cihazlarında etkileşime geçmelerine yalnızca araba park edildiğinde izin verilir. URL parametrelerinin Google tarafından nasıl ele alınmasını istediğinizi belirtmek için ParkedOnlyOnClickListener adım adım anlatacağız. Araba park edilmemişse barındırıcı, kullanıcıya söz konusu işleme izin verilmediğini gösterir. Araba park edilmişse kod normal şekilde çalışır. Aşağıdaki snippet'te ParkedOnlyOnClickListener bağlantısını kullanın Mobil cihazda bir ayarlar ekranı açmak için:

Kotlin

val row = Row.Builder()
    .setTitle("Open Settings")
    .setOnClickListener(ParkedOnlyOnClickListener.create(::openSettingsOnPhone))
    .build()

Java

Row row = new Row.Builder()
    .setTitle("Open Settings")
    .setOnClickListener(ParkedOnlyOnClickListener.create(this::openSettingsOnPhone))
    .build();

Bildirimleri görüntüle

Mobil cihaza gönderilen bildirimler yalnızca şu durumlarda araç ekranında görünür: genişletilmiş CarAppExtender. İçerik başlığı, metin, simge ve işlemler gibi bazı bildirim özellikleri, CarAppExtender içinde ayarlanarak bildirimin özellikleri geçersiz kılınabilir araba ekranında görünürler.

Aşağıdaki snippet, Mobil cihazda gösterilenden farklı bir başlık görüntüler:

Kotlin

val notification = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
    .setContentTitle(titleOnThePhone)
    .extend(
        CarAppExtender.Builder()
            .setContentTitle(titleOnTheCar)
            ...
            .build())
    .build()

Java

Notification notification = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
    .setContentTitle(titleOnThePhone)
    .extend(
        new CarAppExtender.Builder()
            .setContentTitle(titleOnTheCar)
            ...
            .build())
    .build();

Bildirimler, kullanıcı arayüzünün aşağıdaki bölümlerini etkileyebilir:

  • Kullanıcıya bir uyarı bildirimi (HUN) gösterilebilir.
  • Bildirim merkezinde isteğe bağlı olarak rozetle bir giriş eklenebilir. görünür.
  • Navigasyon uygulamaları için bildirim, ray widget'ında aşağıdaki gibi görüntülenebilir: şurada açıklandığı: Adım adım bildirimler.
ziyaret edin.

Uygulamanızın bildirimlerini, her bir özelliği etkileyecek şekilde nasıl yapılandıracağınızı seçebilirsiniz önce açıklandığı gibi bildirimin önceliğini kullanarak bu kullanıcı arayüzü öğeleri CarAppExtender belgelerinden faydalanabilirsiniz.

Eğer NotificationCompat.Builder.setOnlyAlertOnce true değeriyle çağrılır; yüksek öncelikli bildirim Yalnızca bir kez HUN kullanın.

Araba uygulamanızın bildirimlerini nasıl tasarlayacağınızla ilgili daha fazla bilgi için Sürüş İçin Google Tasarım rehberi Bildirimler.

Kısa ileti göster

Uygulamanız şunu kullanarak bir durum mesajı görüntüleyebilir: CarToast (bu snippet'te gösterildiği gibi):

Kotlin

CarToast.makeText(carContext, "Hello!", CarToast.LENGTH_SHORT).show()

Java

CarToast.makeText(getCarContext(), "Hello!", CarToast.LENGTH_SHORT).show();

İzin iste

Uygulamanızın kısıtlanmış verilere veya işlemlere erişmesi gerekiyorsa; örneğin: konum (Android'in standart kuralları) izinler geçerlidir. İzin istemek için şunu kullanabilirsiniz: CarContext.requestPermissions() yöntemidir.

Proje için CarContext.requestPermissions(), standart Android API'leri, veya kendi Activity uygulamanızı başlatmanızın gerekmemesi izin iletişim kutusunu oluşturabilirsiniz. Ayrıca, bu adreslerin her ikisinde de aynı kodu Android Auto ve Android Automotive OS gibi işlemler için akışlara göz atabilirsiniz.

Android Auto'da izinler iletişim kutusunun stilini belirleme

Android Auto'da, kullanıcıya ait izinler iletişim kutusu telefonda görünür. Varsayılan olarak, iletişim kutusunun arkasında arka plan olmaz. Bir özel bir araba uygulaması teması beyan etmek için AndroidManifest.xml dosyasını kullanarak carPermissionActivityLayout özelliğini ayarlayın temanıza hoş geldiniz.

<meta-data
    android:name="androidx.car.app.theme"
    android:resource="@style/MyCarAppTheme />

Ardından araba uygulamanızın teması için carPermissionActivityLayout özelliğini ayarlayın:

<resources>
  <style name="MyCarAppTheme">
    <item name="carPermissionActivityLayout">@layout/my_custom_background</item>
  </style>
</resources>

Amaçla araba uygulaması başlatma

Örneğin, CarContext.startCarApp yöntemini kullanabilirsiniz:

  • Telefon araması yapmak için numara çeviriciyi açın.
  • Şu konum için adım adım navigasyonu başlat: varsayılan navigasyon araç uygulaması.
  • Bir amaç doğrultusunda kendi uygulamanızı başlatın.

Aşağıdaki örnekte, uygulamanızı bir park rezervasyonunun ayrıntılarını gösteren bir ekranla açar. Bildirim örneğini, PendingIntent uygunsuz bir öğeyi sarmalama bir amaç belirtin:

Kotlin

val notification = notificationBuilder
    ...
    .extend(
        CarAppExtender.Builder()
            .setContentIntent(
                PendingIntent.getBroadcast(
                    context,
                    ACTION_VIEW_PARKING_RESERVATION.hashCode(),
                    Intent(ACTION_VIEW_PARKING_RESERVATION)
                        .setComponent(ComponentName(context, MyNotificationReceiver::class.java)),
                    0))
            .build())

Java

Notification notification = notificationBuilder
    ...
    .extend(
        new CarAppExtender.Builder()
            .setContentIntent(
                PendingIntent.getBroadcast(
                    context,
                    ACTION_VIEW_PARKING_RESERVATION.hashCode(),
                    new Intent(ACTION_VIEW_PARKING_RESERVATION)
                        .setComponent(new ComponentName(context, MyNotificationReceiver.class)),
                    0))
            .build());

Uygulamanız ayrıca BroadcastReceiver kullanıcı sayfada işlemi seçtiğinde amacı işlemek için bildirim arayüzü ile CarContext.startCarApp Veri URI'sini içeren bir intent ile:

Kotlin

class MyNotificationReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val intentAction = intent.action
        if (ACTION_VIEW_PARKING_RESERVATION == intentAction) {
            CarContext.startCarApp(
                intent,
                Intent(Intent.ACTION_VIEW)
                    .setComponent(ComponentName(context, MyCarAppService::class.java))
                    .setData(Uri.fromParts(MY_URI_SCHEME, MY_URI_HOST, intentAction)))
        }
    }
}

Java

public class MyNotificationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String intentAction = intent.getAction();
        if (ACTION_VIEW_PARKING_RESERVATION.equals(intentAction)) {
            CarContext.startCarApp(
                intent,
                new Intent(Intent.ACTION_VIEW)
                    .setComponent(new ComponentName(context, MyCarAppService.class))
                    .setData(Uri.fromParts(MY_URI_SCHEME, MY_URI_HOST, intentAction)));
        }
    }
}

Son olarak, Session.onNewIntent yöntemindeki yöntem bu amacı yerine getirmek için yukarıda değilse aşağıdaki adımları uygulayın:

Kotlin

override fun onNewIntent(intent: Intent) {
    val screenManager = carContext.getCarService(ScreenManager::class.java)
    val uri = intent.data
    if (uri != null
        && MY_URI_SCHEME == uri.scheme
        && MY_URI_HOST == uri.schemeSpecificPart
        && ACTION_VIEW_PARKING_RESERVATION == uri.fragment
    ) {
        val top = screenManager.top
        if (top !is ParkingReservationScreen) {
            screenManager.push(ParkingReservationScreen(carContext))
        }
    }
}

Java

@Override
public void onNewIntent(@NonNull Intent intent) {
    ScreenManager screenManager = getCarContext().getCarService(ScreenManager.class);
    Uri uri = intent.getData();
    if (uri != null
        && MY_URI_SCHEME.equals(uri.getScheme())
        && MY_URI_HOST.equals(uri.getSchemeSpecificPart())
        && ACTION_VIEW_PARKING_RESERVATION.equals(uri.getFragment())
    ) {
        Screen top = screenManager.getTop();
        if (!(top instanceof ParkingReservationScreen)) {
            screenManager.push(new ParkingReservationScreen(getCarContext()));
        }
    }
}

Daha fazla bilgi için Bildirimleri görüntüleme bölümüne bakın araba uygulamasıyla ilgili bildirimlerin nasıl ele alınacağına ilişkin bilgiler.

Şablon kısıtlamaları

Ana makine, belirli bir görev için görüntülenecek şablon sayısını maksimumla sınırlandırır Son şablon aşağıdaki türlerden biri olmalıdır:

Bu sınırın yalnızca şablon sayısı için geçerli olduğunu, Yığında Screen örnek var. Örneğin, Örneğin, bir uygulama A ekranındayken iki şablon gönderir ve daha sonra ekrana iter. B, şimdi üç şablon daha gönderebilir. Alternatif olarak, her bir ekran daha sonra, uygulama beş ekran örneğini şuraya aktarabilir: ScreenManager yığını.

Bu kısıtlamaların özel durumlar vardır: şablon yenilenmesi, geri ve sıfırlama işlemleri.

Şablon yenilemeleri

Belirli içerik güncellemeleri şablon sınırına dahil edilmez. Genel olarak bir uygulama aynı türde yeni bir şablon aktarırsa içeriği eski şablonla aynı değilse yeni şablon kotaya dahil edilir. Örneğin, ListTemplate sayılmaz fark etmez. Daha fazla bilgi edinmek için her bir şablonla ilgili dokümanlara bakın ne tür içerik güncellemelerinin yenileme olarak kabul edildiği hakkında.

Önceki işlemler

Bir görev içindeki alt akışları etkinleştirmek için, ana makine bir uygulamanın ScreenManager grubundaki Screen ve güncellemeler uygulamanın aktardığı şablon sayısına göre kalan kota geriye doğru gider.

Örneğin, uygulama A ekranıdayken iki şablon gönderir, daha sonra bir kota daha Kaldı. Eğer sonra uygulama A ekranına geri döner ve ana makine kotayı üçe sıfırlar çünkü uygulama iki şablon geri gitmiştir.

Bir ekrana geri döndüğünde, uygulamanın şuna benzer bir şablon göndermesi gerektiğini unutmayın: ekranda son gönderilenle aynı türde olmalıdır. Diğerleri gönderiliyor şablon türü hataya neden oluyor. Ancak tür aynı olduğu sürece Aynı şekilde geri işlem sırasında da, bir uygulama şablonunuzu kullanabilirsiniz.

Sıfırlama işlemleri

Bazı şablonlar bir görevin sonunu belirten özel anlamlara sahiptir. Örneğin, Örneğin, NavigationTemplate ekranda kalması ve yeni özelliklerle yenilenmesi beklenen bir görünümdür. Kullanıcının tüketimi için adım adım talimatlar. Bunlardan birine ulaştığında şablonları kullanıyorsanız ana makine, şablon kotasını sıfırlar ve bu şablonu yeni bir görevin ilk adımıdır. Bu işlem, uygulamanın yeni bir göreve başlamasına olanak tanır. Hangilerinin sıfırlamayı tetiklediğini görmek için her bir şablonun dokümanlarına bakın ana makinede.

Düzenleyen kullanıcı, bir bildirim işleminden uygulamayı başlatmak isterse veya kota da sıfırlanır. Bu mekanizma, uygulamanın Bildirimlerden yeni bir görev akışı başlatır. Bu süreç, uygulama geliştirilse bile ve ön planda olmasını istiyor.

Daha fazla ayrıntı için Bildirimleri görüntüleme bölümüne bakın uygulamanızın bildirimlerini araç ekranında nasıl görüntüleyeceğinizle ilgili daha fazla bilgi edinin. Bkz. Bir araba uygulamasını bir niyetle başlatma hakkında bilgi için uygulamanızı bir bildirim işleminden başlatın.

Bağlantı API'sı

Uygulamanızın, Android Auto mu yoksa Android mi çalışacağını belirleyebilirsiniz Automotive OS için CarConnection API'den çalışma zamanında bağlantı bilgilerini alma.

Örneğin, araba uygulamanızın Session bölümünde bir CarConnection ve LiveData güncellemelerine abone ol:

Kotlin

CarConnection(carContext).type.observe(this, ::onConnectionStateUpdated)

Java

new CarConnection(getCarContext()).getType().observe(this, this::onConnectionStateUpdated);

Gözlemcide, bağlantı durumundaki değişikliklere tepki verebilirsiniz:

Kotlin

fun onConnectionStateUpdated(connectionState: Int) {
  val message = when(connectionState) {
    CarConnection.CONNECTION_TYPE_NOT_CONNECTED -> "Not connected to a head unit"
    CarConnection.CONNECTION_TYPE_NATIVE -> "Connected to Android Automotive OS"
    CarConnection.CONNECTION_TYPE_PROJECTION -> "Connected to Android Auto"
    else -> "Unknown car connection type"
  }
  CarToast.makeText(carContext, message, CarToast.LENGTH_SHORT).show()
}

Java

private void onConnectionStateUpdated(int connectionState) {
  String message;
  switch(connectionState) {
    case CarConnection.CONNECTION_TYPE_NOT_CONNECTED:
      message = "Not connected to a head unit";
      break;
    case CarConnection.CONNECTION_TYPE_NATIVE:
      message = "Connected to Android Automotive OS";
      break;
    case CarConnection.CONNECTION_TYPE_PROJECTION:
      message = "Connected to Android Auto";
      break;
    default:
      message = "Unknown car connection type";
      break;
  }
  CarToast.makeText(getCarContext(), message, CarToast.LENGTH_SHORT).show();
}

Kısıtlamalar API'sı

Farklı araçlarda farklı sayıda izin verilmiş olabilir Item örnek gösterilecek yardımcı olan ekip çalışmasıdır. Şunu kullanın: ConstraintManager içerik sınırını kontrol etmek ve uygun sayıda öğe ayarlamak kullanabilirsiniz.

CarContext'dan bir ConstraintManager alarak başlayın:

Kotlin

val manager = carContext.getCarService(ConstraintManager::class.java)

Java

ConstraintManager manager = getCarContext().getCarService(ConstraintManager.class);

Daha sonra, alınan ConstraintManager nesnesini alakalı içerik sınırlaması vardır. Örneğin, ızgara, çağrı getContentLimit şununla: CONTENT_LIMIT_TYPE_GRID:

Kotlin

val gridItemLimit = manager.getContentLimit(ConstraintManager.CONTENT_LIMIT_TYPE_GRID)

Java

int gridItemLimit = manager.getContentLimit(ConstraintManager.CONTENT_LIMIT_TYPE_GRID);

Oturum açma akışı ekleme

Uygulamanız kullanıcılara oturum açma deneyimi sunuyorsa SignInTemplate ve LongMessageTemplate ana birim.

SignInTemplate oluşturmak için bir SignInMethod tanımlayın. Araba Uygulama Kitaplığı şu anda aşağıdaki oturum açma yöntemlerini desteklemektedir:

  • InputSignInMethod (kullanıcı adı/şifre oturum açmak için)
  • PinSignInMethod Kullanıcının telefonundan hesabını bağladığı PIN ile oturum açmak için ana birimde gösterilen PIN'i kullanarak yapabilirsiniz.
  • ProviderSignInMethod sağlayıcı oturum açmaları, örneğin: Google ile Oturum Açma ve One Tap'a dokunun.
  • QRCodeSignInMethod QR kodu ile oturum açma yönteminde (kullanıcı, oturum açma işlemini tamamlamak için QR kodu tarar.) sahip olabilir. Bu özellik, Car API düzeyi 4 ve üzeri sürümlerde kullanılabilir.

Örneğin, kullanıcının şifresini toplayan bir şablon uygulamak için InputCallback oluşturuluyor kullanıcı girişini işlemek ve doğrulamak için:

Kotlin

val callback = object : InputCallback {
    override fun onInputSubmitted(text: String) {
        // You will receive this callback when the user presses Enter on the keyboard.
    }

    override fun onInputTextChanged(text: String) {
        // You will receive this callback as the user is typing. The update
        // frequency is determined by the host.
    }
}

Java

InputCallback callback = new InputCallback() {
    @Override
    public void onInputSubmitted(@NonNull String text) {
        // You will receive this callback when the user presses Enter on the keyboard.
    }

    @Override
    public void onInputTextChanged(@NonNull String text) {
        // You will receive this callback as the user is typing. The update
        // frequency is determined by the host.
    }
};

InputSignInMethod Builder için InputCallback gereklidir.

Kotlin

val passwordInput = InputSignInMethod.Builder(callback)
    .setHint("Password")
    .setInputType(InputSignInMethod.INPUT_TYPE_PASSWORD)
    ...
    .build()

Java

InputSignInMethod passwordInput = new InputSignInMethod.Builder(callback)
    .setHint("Password")
    .setInputType(InputSignInMethod.INPUT_TYPE_PASSWORD)
    ...
    .build();

Son olarak, yeni InputSignInMethod öğenizi kullanarak bir SignInTemplate oluşturun.

Kotlin

SignInTemplate.Builder(passwordInput)
    .setTitle("Sign in with username and password")
    .setInstructions("Enter your password")
    .setHeaderAction(Action.BACK)
    ...
    .build()

Java

new SignInTemplate.Builder(passwordInput)
    .setTitle("Sign in with username and password")
    .setInstructions("Enter your password")
    .setHeaderAction(Action.BACK)
    ...
    .build();

Hesap Yöneticisi'ni kullanma

Kimlik doğrulaması olan Android Automotive OS uygulamaları şunu kullanmalıdır: AccountManager:

  • Daha iyi bir kullanıcı deneyimi ve hesap yönetimi kolaylığı: Kullanıcılar tüm oturum açma da dahil olmak üzere sistem ayarlarındaki hesaplar menüsünden ve oturumu kapatın.
  • "Misafir" : Arabalar paylaşılan cihazlar olduğundan, OEM'ler Hesapların eklenemediğinde, araçta misafir deneyimleri

Metin dizesi varyantları ekleyin

Farklı araç ekran boyutlarında farklı miktarlarda metin gösterilebilir. Car App API ile düzeyi 2 ve üzeri olan bir metin dizesinin birden çok varyantını, en iyi şekilde ekrana sığdır. Metin varyantlarının kabul edildiği yerleri görmek için şablonları arayın. CarText alan bileşenler.

Şunları içeren bir CarText öğesine metin dizesi varyantları ekleyebilirsiniz: CarText.Builder.addVariant() yöntem:

Kotlin

val itemTitle = CarText.Builder("This is a very long string")
    .addVariant("Shorter string")
    ...
    .build()

Java

CarText itemTitle = new CarText.Builder("This is a very long string")
    .addVariant("Shorter string")
    ...
    .build();

Ardından bu CarText öğesini kullanabilirsiniz. Örneğin, bir GridItem

Kotlin

GridItem.Builder()
    .addTitle(itemTitle)
    ...
    .build()

Java

new GridItem.Builder()
    .addTitle(itemTitle)
    ...
    build();

Dizeleri en çok tercih edilenden en az tercih edilene doğru ekleyin (ör. en uzundan en az tercih edilene doğru) en kısa olanıdır. Barındırıcı, bir alan sağlamak istiyoruz.

Satırlar için satır içi CarIcon'lar ekleme

Uygulamanızın görsel çekiciliğini zenginleştirmek için metinle birlikte satır içi simgeler ekleyebilirsiniz. CarIconSpan. Şuna ilişkin dokümanlara bakın: CarIconSpan.create inceleyebilirsiniz. Görüntüleyin İspanyolca Aralıklarla metin stilinin nasıl çalıştığına dair genel bir bakış için Alanlar ile metin stilleri.

Kotlin

  
val rating = SpannableString("Rating: 4.5 stars")
rating.setSpan(
    CarIconSpan.create(
        // Create a CarIcon with an image of four and a half stars
        CarIcon.Builder(...).build(),
        // Align the CarIcon to the baseline of the text
        CarIconSpan.ALIGN_BASELINE
    ),
    // The start index of the span (index of the character '4')
    8,
    // The end index of the span (index of the last 's' in "stars")
    16,
    Spanned.SPAN_INCLUSIVE_INCLUSIVE
)

val row = Row.Builder()
    ...
    .addText(rating)
    .build()
  
  

Java

  
SpannableString rating = new SpannableString("Rating: 4.5 stars");
rating.setSpan(
        CarIconSpan.create(
                // Create a CarIcon with an image of four and a half stars
                new CarIcon.Builder(...).build(),
                // Align the CarIcon to the baseline of the text
                CarIconSpan.ALIGN_BASELINE
        ),
        // The start index of the span (index of the character '4')
        8,
        // The end index of the span (index of the last 's' in "stars")
        16,
        Spanned.SPAN_INCLUSIVE_INCLUSIVE
);
Row row = new Row.Builder()
        ...
        .addText(rating)
        .build();
  
  

Araba Donanım API'leri

Araba Uygulaması API düzeyi 3'ten başlayarak araba uygulaması kitaplığında araç özelliklerine ve sensörlerine erişmek için kullanabilir.

Gereksinimler

API'leri Android Auto ile kullanmak için işe bir bağımlılık ekleyerek başlayın: Android cihazınız için build.gradle dosyasına androidx.car.app:app-projected Otomatik modül. Android Automotive OS için şuna bağımlılık ekleyin: Android cihazınız için build.gradle dosyasına androidx.car.app:app-automotive Automotive OS modülü.

Ayrıca, AndroidManifest.xml dosyanızda şunları yapmanız gerekir: gerekli ilgili izinleri beyan etmeniz kullanmak istediğiniz araç verilerini isteyin. Bu izinlerin verilen verilerdir. URL parametrelerinin Google tarafından nasıl ele alınmasını istediğinizi belirtmek için Android Auto ve Android Automotive OS'te aynı kod yalnızca platforma bağlı akışlar oluşturmak zorundasınız. Ancak, gereken izinler farklı olması gerekir.

Araç Bilgileri

Bu tabloda, CarInfo API'leri ve bunları kullanmak için istemeniz gereken izinler:

Yöntemler Özellikler Android Auto İzinleri Android Automotive OS İzinleri Car App API düzeyinden itibaren desteklenir
fetchModel Marka, model, yıl android.car.permission.CAR_INFO 3
fetchEnergyProfile EV konnektörü türleri, yakıt türleri com.google.android.gms.permission.CAR_FUEL android.car.permission.CAR_INFO 3
fetchExteriorDimensions

Bu veriler yalnızca bazı Android Automotive OS araçlarda kullanılabilir API 30 veya sonraki bir sürümü çalıştıran 'nı inceleyin.

Dış boyutlar Yok android.car.permission.CAR_INFO 7
addTollListener
removeTollListener
Ücret kartı durumu, ücret kartı türü 3
addEnergyLevelListener
removeEnergyLevelListener
Pil seviyesi, yakıt seviyesi, yakıt seviyesi düşük, kalan menzil com.google.android.gms.permission.CAR_FUEL android.car.permission.CAR_ENERGY,
android.car.permission.CAR_ENERGY_PORTS,
android.car.permission.READ_CAR_DISPLAY_UNITS
3
addSpeedListener
removeSpeedListener
Ham hız, hız bilgisi (arabanın küme ekranında gösterilir) com.google.android.gms.permission.CAR_SPEED android.car.permission.CAR_SPEED,
android.car.permission.READ_CAR_DISPLAY_UNITS
3
addMileageListener
removeMileageListener
Kilometre sayacı mesafesi com.google.android.gms.permission.CAR_MILEAGE Bu veriler, Android Automotive OS'te Play Store'dan yüklenen uygulamalarda bulunmaz. 3

Örneğin, kalan aralığı elde etmek için, CarInfo nesne, ardından bir OnCarDataAvailableListener oluşturun ve kaydedin:

Kotlin

val carInfo = carContext.getCarService(CarHardwareManager::class.java).carInfo

val listener = OnCarDataAvailableListener<EnergyLevel> { data ->
    if (data.rangeRemainingMeters.status == CarValue.STATUS_SUCCESS) {
      val rangeRemaining = data.rangeRemainingMeters.value
    } else {
      // Handle error
    }
  }

carInfo.addEnergyLevelListener(carContext.mainExecutor, listener)

// Unregister the listener when you no longer need updates
carInfo.removeEnergyLevelListener(listener)

Java

CarInfo carInfo = getCarContext().getCarService(CarHardwareManager.class).getCarInfo();

OnCarDataAvailableListener<EnergyLevel> listener = (data) -> {
  if(data.getRangeRemainingMeters().getStatus() == CarValue.STATUS_SUCCESS) {
    float rangeRemaining = data.getRangeRemainingMeters().getValue();
  } else {
    // Handle error
  }
};

carInfo.addEnergyLevelListener(getCarContext().getMainExecutor(), listener);

// Unregister the listener when you no longer need updates
carInfo.removeEnergyLevelListener(listener);

Araçtan gelen verilerin her zaman ulaşılabilir olduğunu varsaymayın. Hata alırsanız şunları kontrol edin: durumu verilerin neden farklı olduğunu daha iyi anlamak için istediğiniz geri alınamaz. Daha fazla bilgi için referans belgeleri tam CarInfo sınıf tanımı.

Kar Sensörleri

CarSensors sınıfı aracın ivme ölçer, jiroskop, pusula ve konum verileri. Bu değerlerin kullanılabilirliği OEM. İvme ölçer, jiroskop ve pusuladan alınan verilerin biçimi aynı olacaktır. SensorManager API. Örneğin, aracın yönünü kontrol etmek için:

Kotlin

val carSensors = carContext.getCarService(CarHardwareManager::class.java).carSensors

val listener = OnCarDataAvailableListener<Compass> { data ->
    if (data.orientations.status == CarValue.STATUS_SUCCESS) {
      val orientation = data.orientations.value
    } else {
      // Data not available, handle error
    }
  }

carSensors.addCompassListener(CarSensors.UPDATE_RATE_NORMAL, carContext.mainExecutor, listener)

// Unregister the listener when you no longer need updates
carSensors.removeCompassListener(listener)

Java

CarSensors carSensors = getCarContext().getCarService(CarHardwareManager.class).getCarSensors();

OnCarDataAvailableListener<Compass> listener = (data) -> {
  if (data.getOrientations().getStatus() == CarValue.STATUS_SUCCESS) {
    List<Float> orientations = data.getOrientations().getValue();
  } else {
    // Data not available, handle error
  }
};

carSensors.addCompassListener(CarSensors.UPDATE_RATE_NORMAL, getCarContext().getMainExecutor(),
    listener);

// Unregister the listener when you no longer need updates
carSensors.removeCompassListener(listener);

Arabadan konum verilerine erişmek için ayrıca android.permission.ACCESS_FINE_LOCATION izni.

Test

Android Auto'da test yaparken sensör verilerini simüle etmek için şuraya bakın: Sensörler ve Sensör yapılandırmanın bölümlerinin Masaüstü Ana Birim kılavuzu. Android'de test yaparken sensör verilerini simüle etmek için Automotive OS için Emulat donanımı durum bölümü Automotive OS emülatörü kılavuzu.

CarAppService, Oturum ve Ekran yaşam döngüleri

Session ve Screen sınıfları LifecycleOwner arayüzü. Farklı Kullanıcı uygulamayla, Session ve Screen nesnelerinizle etkileşimde bulunursa yaşam döngüsü geri çağırma işlevleri aşağıdaki şemalarda açıklandığı gibi çağrılır.

CarAppService ve Oturumların yaşam döngüleri

Şekil 1. Session yaşam döngüsü.

Tüm ayrıntılar için şu belgeye bakın: Session.getLifecycle yöntemidir.

Bir ekranın yaşam döngüsü

Şekil 2. Screen yaşam döngüsü.

Tüm ayrıntılar için şu belgeye bakın: Screen.getLifecycle yöntemini kullanabilirsiniz.

Araç mikrofonundan kayıt yapın

Uygulamanızın CarAppService ve CarAudioRecord API, uygulamanızın, kullanıcının araç mikrofonuna erişmesine izin verebilirsiniz. Kullanıcıların araba mikrofonuna erişmek için uygulama izninizin olması gerekir. Uygulamanız kaydedebilir ve kullanıcının girişini uygulamanızda işleyebilirsiniz.

Kaydetme izni

Herhangi bir sesi kaydetmeden önce AndroidManifest.xml ve kullanıcıdan bu izni istemesini isteyin.

<manifest ...>
   ...
   <uses-permission android:name="android.permission.RECORD_AUDIO" />
   ...
</manifest>

Çalışma zamanında kayıt yapmak için izin istemeniz gerekir. İsteğe göz atın izin isteğinde bulunmayla ilgili ayrıntılar için, izinler bölümüne araba uygulamanızda kullanabilirsiniz.

Ses kaydetme

Kullanıcı kayıt izni verdikten sonra sesi kaydedebilir ve işleyebilirsiniz. devam ettirebilirsiniz.

Kotlin

val carAudioRecord = CarAudioRecord.create(carContext)
        carAudioRecord.startRecording()

        val data = ByteArray(CarAudioRecord.AUDIO_CONTENT_BUFFER_SIZE)
        while(carAudioRecord.read(data, 0, CarAudioRecord.AUDIO_CONTENT_BUFFER_SIZE) >= 0) {
            // Use data array
            // Potentially call carAudioRecord.stopRecording() if your processing finds end of speech
        }
        carAudioRecord.stopRecording()
 

Java

CarAudioRecord carAudioRecord = CarAudioRecord.create(getCarContext());
        carAudioRecord.startRecording();

        byte[] data = new byte[CarAudioRecord.AUDIO_CONTENT_BUFFER_SIZE];
        while (carAudioRecord.read(data, 0, CarAudioRecord.AUDIO_CONTENT_BUFFER_SIZE) >= 0) {
            // Use data array
            // Potentially call carAudioRecord.stopRecording() if your processing finds end of speech
        }
        carAudioRecord.stopRecording();
 

Ses odağı

Araç mikrofonundan kayıt yaparken önce ses kaydı alın şuna odaklan: devam eden medyaların durdurulduğundan emin olun. Ses odağını kaybederseniz kaydı durdur.

Burada, ses odağının nasıl elde edileceğine ilişkin bir örnek verilmiştir:

Kotlin

 
val carAudioRecord = CarAudioRecord.create(carContext)
        
        // Take audio focus so that user's media is not recorded
        val audioAttributes = AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
            // Use the most appropriate usage type for your use case
            .setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
            .build()
        
        val audioFocusRequest =
            AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)
                .setAudioAttributes(audioAttributes)
                .setOnAudioFocusChangeListener { state: Int ->
                    if (state == AudioManager.AUDIOFOCUS_LOSS) {
                        // Stop recording if audio focus is lost
                        carAudioRecord.stopRecording()
                    }
                }
                .build()
        
        if (carContext.getSystemService(AudioManager::class.java)
                .requestAudioFocus(audioFocusRequest)
            != AudioManager.AUDIOFOCUS_REQUEST_GRANTED
        ) {
            // Don't record if the focus isn't granted
            return
        }
        
        carAudioRecord.startRecording()
        // Process the audio and abandon the AudioFocusRequest when done

Java

CarAudioRecord carAudioRecord = CarAudioRecord.create(getCarContext());
        // Take audio focus so that user's media is not recorded
        AudioAttributes audioAttributes =
                new AudioAttributes.Builder()
                        .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                        // Use the most appropriate usage type for your use case
                        .setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
                        .build();

        AudioFocusRequest audioFocusRequest =
                new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)
                        .setAudioAttributes(audioAttributes)
                        .setOnAudioFocusChangeListener(state -> {
                            if (state == AudioManager.AUDIOFOCUS_LOSS) {
                                // Stop recording if audio focus is lost
                                carAudioRecord.stopRecording();
                            }
                        })
                        .build();

        if (getCarContext().getSystemService(AudioManager.class).requestAudioFocus(audioFocusRequest)
                != AUDIOFOCUS_REQUEST_GRANTED) {
            // Don't record if the focus isn't granted
            return;
        }

        carAudioRecord.startRecording();
        // Process the audio and abandon the AudioFocusRequest when done
 

Test Kitaplığı

Arabalar için Android Testi Kitaplık, bir test ortamında uygulamanızın davranışını doğrulamak için kullanabileceğiniz sınıfları içerir. Örneğin, SessionController ana makineyle bir bağlantıyı simüle etmenize ve doğru yapılandırmanın Screen ve Template oluşturuldu ve geri döndü.

Daha fazla bilgi için Örnekler başlıklı bölüme bakın.

Arabalar için Android uygulama kitaplığı sorunu bildirme

Kitaplıkla ilgili bir sorun görürseniz şunu kullanarak bildirin: Google Sorun Takip Aracı. Sorun şablonuna istenen tüm bilgileri girdiğinizden emin olun.

Yeni sayı oluştur

Yeni bir sayı oluşturmadan önce lütfen sorunun kitaplık sürümünde listelenip listelenmediğini kontrol edin not edebilir veya sorunlar listesinde bildirebilirsiniz. Şu tarihe kadar sayılara abone olabilir ve oy verebilirsiniz: tıklayın. Daha fazla bilgi için bkz. Bir Soruna abone olma