Navigasyon uygulamalarını görüntülemek için Instrument Cluster API'sini (bir Android API'si) kullanın.
Örneğin, arabadaki ikincil bir ekranda (örneğin,
gösterge panelindeki direksiyon. Bu sayfada, Arkadaş Bitkiler projesinin
ve hizmeti Google Analytics 4 ile entegre etmek için
Navigasyon uygulamalarının gösterebilmesi için CarService
kullanıcı arayüzü.
Terminoloji
Bu sayfada aşağıdaki terimler kullanılır.
CarManager
örneği:
gösterilir ve Gösterge Tablosu görüntülenmeye hazır olduğunda geri çağırmalar alırsınız.
yardımcı olur.android:singleUser
özelliğine sahip bir Android hizmeti. Kuyruklu a işareti
herhangi bir zamanda, hizmetin en çok bir örneği Android sisteminde çalışır.Ön koşullar
Devam etmeden önce aşağıdaki unsurları mutlaka edinin:
- Android geliştirme ortamı. Android'i kurmak için için bkz. Oluşturma gereksinimleri.
- Android kaynak kodunu indirin. Şu uygulamanın en son sürümünü edinin: Pi-car sürüm dalından (veya daha sonraki bir daldan) Android kaynak kodunu https://android.googlesource.com
- Ana birim (HU). Çalışabilen bir Android cihaz Android 9 (veya sonraki sürümler). Bu cihazın kendi ekranının olması ve şunları yapabilmesi gerekir: Android'in yeni sürümleriyle ekran yanıp sönüyor.
- Araç Kümesi aşağıdakilerden biridir:
- HU'ya takılı fiziksel ikincil ekran. Öğe cihaz donanımı ve çekirdeği birden çok ekranın yönetilmesini destekler.
- Bağımsız birim. Video akışı alıp gösterebilen ağ bağlantısı üzerinden HU kendi ekranında görebilirsiniz.
- Emüle edilmiş ekran. Geliştirme sırasında
şu emülasyonlu ortamları kullanın:
- İkincil ekranlar simülasyonu. Simüle edilmiş bir AOSP Android dağıtımında ikincil ekran kullanmak için Geliştirici Seçenekleri'ne gidin Ayarlar sistem uygulamasındaki ayarlarda ve ardından İkincili simüle et'i seçin. görüntülenir. Bu yapılandırma, fiziksel bir ikincil üst üste bindirilmesi kaydıyla, bu görüntülü reklam, görüntüleyin.
- Emüle edilmiş gösterge grubu. Android emülatörü dahil Gösterge tablosunu AAOS ile görüntüleme, ClusterRenderingService.
Entegrasyon mimarisi
Entegrasyon bileşenleri
Instrument Cluster API'nin tüm entegrasyonu şu üç bileşenden oluşur:
CarService
- Navigasyon uygulamaları
- OEM Gösterge Grubu Hizmeti
CarService
CarService
, navigasyon uygulamaları ile araba arasında uyumlulaştırma yaparak yalnızca
her zaman etkin olan bir navigasyon uygulaması varsa ve yalnızca
android.car.permission.CAR_INSTRUMENT_CLUSTER_CONTROL
izni veri gönderebilir
arabaya giderim.
CarService
, arabaya özel tüm hizmetleri önyükler ve aşağıdakilere erişim sağlar:
bir dizi yöneticiyle bu hizmetleri sürdürüyor. Hizmetlerle etkileşimde bulunmak için
arabada çalışan uygulamalar bu yöneticilere erişebilir.
Gösterge grubu uygulaması için otomotiv OEM'lerinin özel bir en son sürümü güncelleyin ve ClusterRenderingService.
Bir Gösterge Kümesi oluştururken, başlatma işlemi sırasında
CarService
şunun InstrumentClusterRendererService
anahtarını okur:
Küme Oluşturma Hizmeti
bir InstrumentClusterService
uygulamasını bulun. AOSP'de bu giriş
Navigation State API örnek kümesi uygulama oluşturma hizmetine işaret eder:
<string name="instrumentClusterRendererService"> android.car.cluster/.ClusterRenderingService </string>
Bu girişte atıfta bulunulan hizmet başlatıldı ve şuna bağlı:
CarService
Google Haritalar gibi navigasyon uygulamaları,
CarInstrumentClusterManager
, CarService
şuna sahip bir yönetici sağlar:
Gösterge Grubu durumunu bağlı InstrumentClusterRenderingService
düzeyinden günceller.
(Bu örnekte, bound (bağlı) değer,
Android
Hizmetler.)
Gösterge Grubu hizmeti
OEM'ler, şu alt sınıfı içeren bir Android Paketi (APK) oluşturmalıdır: ClusterRenderingService.
Bu sınıfın iki amacı vardır:
- Bir Android arayüzü ve Araç Kümesi oluşturma cihazı sağlar (bu sayfanın amacı).
- Adım adım navigasyon durumu güncellemelerini alır ve oluşturur tavsiye edilir.
İlk amaçla, InstrumentClusterRendererService
OEM uygulamaları
araba kabinindeki ekranlarda bilgi oluşturmak için kullanılan ikincil ekranı başlatmalı ve
bu bilgiyi CarService
InstrumentClusterRendererService.setClusterActivityOptions()
ve
InstrumentClusterRendererService.setClusterActivityState()
yöntem.
İkinci işlev için Gösterge Kümesi hizmeti,
uygulanması
Küme Oluşturma Hizmeti
gezinme durumu güncelleme etkinliklerini alan ve
Bir pakette kodlanmış eventType
ve etkinlik verileri.
Entegrasyon sırası
Aşağıdaki şemada, gezinme durumunun uygulanması gösterilmektedir sağlayan otomatik bir kod snippet'idir:
Bu görselde renkler şunları ifade eder:
- Sarı.
CarService
CarNavigationStatusManager
Android platformu tarafından sağlanır. Daha fazla bilgi edinmek için bkz. Araba ve CAR_NAVIGATION_SERVICE - Camgöbeği.
InstrumentClusterRendererService
uygulandı satın alabilirsiniz. - Mor. Google ve üçüncü taraf tarafından uygulanan Navigasyon uygulaması birlikte çalışır.
- Yeşil.
CarAppFocusManager
. Daha fazla bilgi edinmek için bkz. CarAppFocusManager API'yi kullanma ve CarAppFocusManager.
Navigasyon Durumu bilgi akışı şu sırayı izler:
CarService
,InstrumentClusterRenderingService
uygulamasını başlatır.InstrumentClusterRenderingService
, başlatma sırasında güncellenir. Şu özelliklere sahipCarService
:- Belirsiz sınırlar gibi Gösterge Grubu görüntüleme özellikleri (belirsiz sınırlar hakkında daha fazla ayrıntıyı daha sonra görebilirsiniz).
- Gösterge Grubu ekranındaki etkinlikleri başlatmak için gereken etkinlik seçenekleri. Daha fazla bilgi edinmek için bkz. ActivityOptions (Etkinlik Seçenekleri).
- Bir navigasyon uygulaması (ör. Android Automotive için Google Haritalar veya herhangi bir harita uygulaması)
gerekir):
- Car-lib'den Araba sınıfını kullanarak bir
CarAppFocusManager
elde eder. - Adım adım yol tarifi başlamadan önce,
Pas için
CarAppFocusManager.requestFocus()
appType
rolündeCarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION
parametresinden sonra bir değer girin.
- Car-lib'den Araba sınıfını kullanarak bir
CarAppFocusManager
, bu isteğiCarService
adlı kullanıcıya iletir. İzin verilirseCarService
, gezinme uygulaması paketini inceler ve bir etkinlikandroid.car.cluster.NAVIGATION
kategorisi ile işaretlendi.- Bu bulunursa, gezinme uygulaması tarafından bildirilen
ActivityOptions
InstrumentClusterRenderingService
ve şunları içerir: Gösterge Kümesi görüntüleme özellikleri, amaçtaki ek öğeler olarak gösterilir.
API'yi entegre etme
InstrumentClusterRenderingService
uygulaması:
- Aşağıdaki değeri
AndroidManifest.xml dosyasını deneyin. Bu, dokümanın tek bir kopyasının
Gösterge Kümesi hizmeti, başlatma ve kullanıcı değiştirme sırasında bile çalışır:
android:singleUser="true"
BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE
sistem iznini basılı tutun. Bu yalnızca Araç Kümesi oluşturma hizmetinin dahil olduğunu Android sistem görüntüsününCarService
ile kısıtlanması:<uses-permission android:name="android.car.permission.BIND_INSTRUMENT_CLUSTER_RENDERER_SERVICE"/>
Gösterge Küme Oluşturma Hizmeti'ni Uygulama
Hizmeti derlemek için:
- Şundan başlayan bir sınıf yaz:
Küme Oluşturma Hizmeti
ve ardından
AndroidManifest.xml
dosyanıza karşılık gelen bir girişi ekleyin. Bu sınıf Araç Kümesi ekranını kontrol eder ve (isteğe bağlı olarak) Gezinme Durumu'nu oluşturabilir API verileri. onCreate()
sırasında donanımını kullanıyor. Seçenekler aşağıdakileri içerir:- Gösterge Kümesi için kullanılacak ikincil ekranı belirleyin.
- Gösterge Tablosu uygulamasının verileri oluşturup iletmesi için sanal bir ekran oluşturulan resmi harici birime dönüştürme (H.264 gibi bir video akışı biçimi kullanılarak).
- Yukarıda belirtilen ekran hazır olduğunda bu hizmet
Tanımlamak için
InstrumentClusterRenderingService#setClusterActivityLaunchOptions()
bir Etkinliği görüntülemek için kullanılması gerekenActivityOptions
Gösterge Tablosu. Şu parametreleri kullanın:category.
. ClusterRenderingService.ActivityOptions.
Şunları yapabilecek birActivityOptions
örneği: bir Etkinliği başlatmak için kullanılır. Örneğin, AOSP'de Araç Kümesi uygulaması:getService().setClusterActivityLaunchOptions( CATEGORY_NAVIGATION, ActivityOptions.makeBasic() .setLaunchDisplayId(displayId));
.
- Gösterge Kümesi, etkinlikleri görüntülemeye hazır olduğunda bu hizmet,
InstrumentClusterRenderingService#setClusterActivityState()
Bunları kullan parametre:category
. ClusterRenderingService.state
paketi şununla oluşturuldu: ClusterRenderingService. Şu verileri sağladığınızdan emin olun:visible
Gösterge Tablosunu görünür ve kullanıma hazır olarak belirtir Görüntülü Reklam Ağı'nda yayınlanacak.unobscuredBounds
İçerik görüntülemenin güvenli olduğu Gösterge Grubu ekranı. Örneğin, kadranlar ve göstergelerle kaplıdır.
Service#dump()
yöntemini geçersiz kılın ve aşağıdakiler için yararlı olan rapor durum bilgilerini sağlayın: hata ayıklama (bkz. dumpsys) bakın).
Örnek InstrumentClusterRenderingService uygulaması
Aşağıdaki örnekte bir InstrumentClusterRenderingService
özetlenmiştir
Araç'ı sunmak için VirtualDisplay
oluşturur.
İçerikleri uzaktaki bir fiziksel ekranda gruplayın.
Alternatif olarak bu kod, fiziksel bir ikincil hesabın displayId
kodunu iletebilir
olduğu biliniyorsa, HU'ye bağlı bir ekran.
/** * Sample {@link InstrumentClusterRenderingService} implementation */ public class SampleClusterServiceImpl extends InstrumentClusterRenderingService { // Used to retrieve or create displays private final DisplayManager mDisplayManager; // Unique identifier for the display to be used for instrument // cluster private final String mUniqueId = UUID.randomUUID().toString(); // Format of the instrument cluster display private static final int DISPLAY_WIDTH = 1280; private static final int DISPLAY_HEIGHT = 720; private static final int DISPLAY_DPI = 320; // Area not covered by instruments private static final int DISPLAY_UNOBSCURED_LEFT = 40; private static final int DISPLAY_UNOBSCURED_TOP = 0; private static final int DISPLAY_UNOBSCURED_RIGHT = 1200; private static final int DISPLAY_UNOBSCURED_BOTTOM = 680; @Override public void onCreate() { super.onCreate(); // Create a virtual display to render instrument cluster activities on mDisplayManager = getSystemService(DisplayManager.class); VirtualDisplay display = mDisplayManager.createVirtualDisplay( mUniqueId, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_DPI, null, 0 /* flags */, null, null); // Do any additional initialization (e.g.: start a video stream // based on this virtual display to present activities on a remote // display). onDisplayReady(display.getDisplay()); } private void onDisplayReady(Display display) { // Report activity options that should be used to launch activities on // the instrument cluster. String category = CarInstrumentClusterManager.CATEGORY_NAVIGATION; ActionOptions options = ActivityOptions.makeBasic() .setLaunchDisplayId(display.getDisplayId()); setClusterActivityOptions(category, options); // Report instrument cluster state. Rect unobscuredBounds = new Rect(DISPLAY_UNOBSCURED_LEFT, DISPLAY_UNOBSCURED_TOP, DISPLAY_UNOBSCURED_RIGHT, DISPLAY_UNOBSCURED_BOTTOM); boolean visible = true; ClusterActivityState state = ClusterActivityState.create(visible, unobscuredBounds); setClusterActivityState(category, options); } }
CarAppFocusManager API'yi kullanma
CarAppFocusManager API, getAppTypeOwner()
adlı bir yöntem sağlar. Bu yöntem,
belirli bir noktada hangi navigasyon uygulamasının navigasyon odağına sahip olduğunu bilmek için OEM'ler tarafından yazılan küme hizmeti
gerekir. OEM'ler mevcut CarAppFocusManager#addFocusListener()
yöntemini kullanabilir ve
ardından hangi uygulamaya odaklanıldığını öğrenmek için getAppTypeOwner()
uygulamasını kullanın. Bu bilgiler sayesinde
OEM'ler:
- Kümede gösterilen etkinliği, gezinme uygulaması tarafından sağlanan küme etkinliğine geçirin. odaklanmayı deneyebilirsiniz.
- Odaklanılan gezinme uygulamasının küme etkinliği olup olmadığını algılayabilir. Odaklanılan Bir küme etkinliği yoksa (veya bu tür bir etkinlik devre dışı bırakılmışsa) OEM'ler Bu sinyali araç DIM'sine göndererek kümenin gezinme özelliğinin tamamen atlanmasını sağlayın.
Geçerli uygulama odağını ayarlamak ve dinlemek için CarAppFocusManager
tuşunu kullanın. Örneğin:
veya sesli komut kullanabilirsiniz. Genellikle bu tür bir uygulamanın yalnızca bir örneği etkin olarak
(ya da odaklanmış durumdayken) dikkat edin.
Uygulama odağını dinlemek için CarAppFocusManager#addFocusListener(..)
yöntemini kullanın
değişiklikler:
import android.car.CarAppFocusManager; ... Car car = Car.createCar(this); mAppFocusManager = (CarAppFocusManager)car.getCarManager(Car.APP_FOCUS_SERVICE); mAppFocusManager.addFocusListener(this, CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION); ... public void onAppFocusChanged(int appType, boolean active) { // Use the CarAppFocusManager#getAppTypeOwner(appType) method call // to retrieve a list of active package names }
Paketi almak için CarAppFocusManager#getAppTypeOwner(..)
yöntemini kullanın
belirli bir uygulama türünün mevcut sahibinin adları. Bu yöntem
Geçerli sahip android:sharedUserId
özelliğini kullanıyorsa birden fazla paket adı.
import android.car.CarAppFocusManager; ... Car car = Car.createCar(this); mAppFocusManager = (CarAppFocusManager)car.getCarManager(Car.APP_FOCUS_SERVICE); List<String> focusOwnerPackageNames = mAppFocusManager.getAppTypeOwner( CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION); if (focusOwnerPackageNames == null || focusOwnerPackageNames.isEmpty()) { // No Navigation app has focus // OEM may choose to show their default cluster view } else { // focusOwnerPackageNames // Use the PackageManager to retrieve the cluster activity for the package(s) // returned in focusOwnerPackageNames } ...
Ek: Örnek uygulamayı kullanma
AOSP, Navigation State API'yi uygulayan örnek bir uygulama sağlar.
Bu örnek uygulamayı çalıştırmak için:
- Android Auto'yu desteklenen bir HU üzerinde derleyip yükleyin. Şunu kullanın: Cihazınıza özel Android oluşturma ve yanıp sönme talimatları. Talimatlar için bkz. Referans Panellerini Kullanma.
- HU'ya fiziksel bir ikincil ekran bağlayın (destekleniyorsa) veya sanal
ikincil HU:
- Ayarlar uygulamasında Geliştirici Modu'nu seçin.
- Ayarlar > Sistem > Gelişmiş > Geliştirici seçenekleri > İkincil ekranları simüle edin.
- HU'yu yeniden başlatma
- KitchenSink uygulamasını başlatmak için:
- Çekmeceyi açın.
- Inst. Küme.
- META VERİLERİ BAŞLAT'ı tıklayın.
KitchenSink, GEZİNME odağı istiyor ve bu işlem DirectRenderingCluster
talimatını veriyor.
hizmetini kullanabilirsiniz.