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
- Sürüş İçin Tasarlama başlıklı makaleyi inceleyin
Araba Uygulama Kitaplığı ile ilgili sayfalar
- Navigasyon uygulamaları ve Sürüşle ilgili diğer uygulamalar kategoriye genel bakış
- Şablonlarla uygulama derleme'ye genel bakış
- Yapı taşları Şablonlar ve Şablon bileşenleri konularını kapsayan
- Örnek akışlar yaygın kullanıcı deneyimi kalıplarını ortaya koyma
- Şablonlu uygulama şartları
- Aşağıda belirtilen önemli terimleri ve kavramları inceleyin bölümüne bakın.
- Android Auto Sistemi hakkında bilgi edinin Kullanıcı arayüzü ve Android Automotive OS tasarım.
- Sürüm Notları'nı inceleyin.
- 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. BirScreen
, 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 birScreen
yığınına koyuluyor. şu politikalara bağlı kalmalarını sağlar: şablon akışı kısıtlamalarına dikkat edin.CarAppService
CarAppService
bir soyutService
sınıfı ana makine tarafından keşfedilmesi ve yönetilmesi için uygulanması ve dışa aktarılması gerekir. UygulamanızınCarAppService
metriği bir ana makine bağlantısınıncreateHostValidator
ve ardındanSession
her bir bağlantı için farklı örnekleronCreateSession
Session
Session
şu soyut bir sınıftır: uygulamanız, DMAIC ve PDCA gibiCarAppService.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:
androidx.car.app.category.NAVIGATION
: Adım adım uygulama sağlayan bir uygulama yol tarifleri alabilirsiniz. Arabalar için navigasyon uygulamaları geliştirme başlıklı makaleye göz atın. inceleyebilirsiniz.androidx.car.app.category.POI
: Alakalı işlevler sunan bir uygulama otoparklar, şarj istasyonları ve otoparklar gibi önemli yerleri bulmaya kadar benzin istasyonları. Ödeme yap Arabalar için önemli yer uygulamaları oluşturun bu kategoride ek belgeler yer alır.androidx.car.app.category.IOT
: Kullanıcıların alakalı bulgulara ulaşmasını sağlayan bir uygulama bağlı cihazlarla ilgili işlemleri aracın içinden yapabilirsiniz. Ödeme yap Arabalar için nesne interneti uygulamaları oluşturun bu kategoride ek belgeler yer alır.
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 Surface
ya 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
,
SurfaceCallback
SurfaceContainer
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.
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
![](https://developer.android.com/static/images/training/cars/carappservice-session-lifecycle.png?authuser=19&hl=tr)
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ü
![](https://developer.android.com/static/images/training/cars/screen-lifecycle.png?authuser=19&hl=tr)
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 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