कोई नेविगेशन ऐप्लिकेशन बनाएं

इस पेज पर, कार ऐप्लिकेशन लाइब्रेरी की उन अलग-अलग सुविधाओं के बारे में बताया गया है जिनका इस्तेमाल किया जा सकता है आपके हर मोड़ पर चलने वाले नेविगेशन ऐप्लिकेशन की सुविधाओं को लागू करना.

अपनी मेनिफ़ेस्ट फ़ाइल में जाकर, नेविगेशन की सुविधा इस्तेमाल करने का एलान करें

नेविगेशन ऐप्लिकेशन को androidx.car.app.category.NAVIGATION का एलान करना होगा इंटेंट में कार ऐप्लिकेशन की कैटगरी इसके CarAppService का फ़िल्टर:

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

नेविगेशन इंटेंट का इस्तेमाल करें

अपने ऐप्लिकेशन के लिए नेविगेशन इंटेंट के साथ काम करने के लिए, जिसमें इनसे आने वाले इंटेंट भी शामिल हैं Google Assistant को बोलकर निर्देश देने की सुविधा देता है, तो आपके ऐप्लिकेशन को CarContext.ACTION_NAVIGATE इंटेंट Session.onCreateScreen और Session.onNewIntent.

इसके बारे में दस्तावेज़ देखें CarContext.startCarApp देखें.

नेविगेशन टेंप्लेट ऐक्सेस करना

नेविगेशन ऐप्लिकेशन, नीचे दिए गए टेंप्लेट को ऐक्सेस कर सकते हैं. ये टेंप्लेट मैप के साथ बैकग्राउंड और चालू नेविगेशन के दौरान, मोड़-दर-मोड़ निर्देश.

  • NavigationTemplate: ऐक्टिव नेविगेशन के दौरान, जानकारी देने वाला वैकल्पिक मैसेज और यात्रा के अनुमान दिखाता है.
  • MapWithContentTemplate: ऐसा टेम्प्लेट जो किसी ऐप्लिकेशन को किसी तरह की सामग्री वाली मैप टाइल को रेंडर करने की अनुमति देता है ( उदाहरण के लिए, सूची). कॉन्टेंट को आम तौर पर, पेज के सबसे ऊपर के ऊपर एक ओवरले के रूप में रेंडर किया जाता है जिसमें मैप की टाइलें दिख रही हों और स्थिर इलाके कॉन्टेंट के हिसाब से अडजस्ट हो जाएं.

नेविगेशन ऐप्लिकेशन का यूज़र इंटरफ़ेस डिज़ाइन करने के बारे में ज़्यादा जानकारी इन टेंप्लेट के लिए, नेविगेशन ऐप्लिकेशन देखें.

नेविगेशन टेंप्लेट का ऐक्सेस पाने के लिए, आपके ऐप्लिकेशन को यह एलान करना होगा androidx.car.app.NAVIGATION_TEMPLATES की अनुमति AndroidManifest.xml फ़ाइल:

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

मैप बनाने के लिए, अतिरिक्त अनुमति की ज़रूरत होती है.

MapWithContentTemplate पर माइग्रेट करें

कार ऐप्लिकेशन एपीआई लेवल 7 से शुरू करते हुए, MapTemplate PlaceListNavigationTemplate, और RoutePreviewNavigationTemplate के इस्तेमाल पर रोक लगा दी गई है. रोके गए टेंप्लेट काम करते रहेंगे, लेकिन हमारा सुझाव है कि आप MapWithContentTemplate पर माइग्रेट करें.

इन टेंप्लेट से मिलने वाली सुविधाओं को लागू किया जा सकता है MapWithContentTemplate का इस्तेमाल करके. उदाहरणों के लिए यहां दिए गए स्निपेट देखें:

मैप टेंप्लेट

Kotlin

// MapTemplate (deprecated)
val template = MapTemplate.Builder()
    .setPane(paneBuilder.build())
    .setActionStrip(actionStrip)
    .setHeader(header)
    .setMapController(mapController)
    .build()

// MapWithContentTemplate
val template = MapWithContentTemplate.Builder()
    .setContentTemplate(
        PaneTemplate.Builder(paneBuilder.build())
            .setHeader(header)
            .build())
    .setActionStrip(actionStrip)
    .setMapController(mapController)
    .build()

Java

// MapTemplate (deprecated)
MapTemplate template = new MapTemplate.Builder()
    .setPane(paneBuilder.build())
    .setActionStrip(actionStrip)
    .setHeader(header)
    .setMapController(mapController)
    .build();

// MapWithContentTemplate
MapWithContentTemplate template = new MapWithContentTemplate.Builder()
    .setContentTemplate(new PaneTemplate.Builder(paneBuilder.build())
        .setHeader(header)
        build())
    .setActionStrip(actionStrip)
    .setMapController(mapController)
    .build();

जगह सूची नेविगेशन टेंप्लेट

Kotlin

// PlaceListNavigationTemplate (deprecated)
val template = PlaceListNavigationTemplate.Builder()
    .setItemList(itemListBuilder.build())
    .setHeader(header)
    .setActionStrip(actionStrip)
    .setMapActionStrip(mapActionStrip)
    .build()

// MapWithContentTemplate
val template = MapWithContentTemplate.Builder()
    .setContentTemplate(
        ListTemplate.Builder()
            .setSingleList(itemListBuilder.build())
            .setHeader(header)
            .build())
    .setActionStrip(actionStrip)
    .setMapController(
        MapController.Builder()
            .setMapActionStrip(mapActionStrip)
            .build())
    .build()

Java

// PlaceListNavigationTemplate (deprecated)
PlaceListNavigationTemplate template = new PlaceListNavigationTemplate.Builder()
    .setItemList(itemListBuilder.build())
    .setHeader(header)
    .setActionStrip(actionStrip)
    .setMapActionStrip(mapActionStrip)
    .build();

// MapWithContentTemplate
MapWithContentTemplate template = new MapWithContentTemplate.Builder()
    .setContentTemplate(new ListTemplate.Builder()
        .setSingleList(itemListBuilder.build())
        .setHeader(header)
        .build())
    .setActionStrip(actionStrip)
    .setMapController(new MapController.Builder()
        .setMapActionStrip(mapActionStrip)
        .build())
    .build();

राऊटर के ब्यौरे का टेंप्लेट

Kotlin

// RoutePreviewNavigationTemplate (deprecated)
val template = RoutePreviewNavigationTemplate.Builder()
    .setItemList(
        ItemList.Builder()
            .addItem(
                Row.Builder()
                    .setTitle(title)
                    .build())
            .build())
    .setHeader(header)
    .setNavigateAction(
        Action.Builder()
            .setTitle(actionTitle)
            .setOnClickListener { ... }
            .build())
    .setActionStrip(actionStrip)
    .setMapActionStrip(mapActionStrip)
    .build()

// MapWithContentTemplate
val template = MapWithContentTemplate.Builder()
    .setContentTemplate(
        ListTemplate.Builder()
            .setSingleList(
                ItemList.Builder()
                    .addItem(
                        Row.Builder()
                            .setTitle(title)
                            .addAction(
                                Action.Builder()
                                    .setTitle(actionTitle)
                                    .setOnClickListener { ... }
                                    .build())
                            .build())
                    .build())
            .setHeader(header)
            .build())
    .setActionStrip(actionStrip)
    .setMapController(
        MapController.Builder()
            .setMapActionStrip(mapActionStrip)
            .build())
    .build()

Java

// RoutePreviewNavigationTemplate (deprecated)
RoutePreviewNavigationTemplate template = new RoutePreviewNavigationTemplate.Builder()
    .setItemList(new ItemList.Builder()
        .addItem(new Row.Builder()
            .setTitle(title))
            .build())
        .build())
    .setHeader(header)
    .setNavigateAction(new Action.Builder()
        .setTitle(actionTitle)
        .setOnClickListener(() -> { ... })
        .build())
    .setActionStrip(actionStrip)
    .setMapActionStrip(mapActionStrip)
    .build();

// MapWithContentTemplate
MapWithContentTemplate template = new MapWithContentTemplate.Builder()
    .setContentTemplate(new ListTemplate.Builder()
        .setSingleList(new ItemList.Builder()
            .addItem(new Row.Builder()
                  .setTitle(title))
                  .addAction(new Action.Builder()
                      .setTitle(actionTitle)
                      .setOnClickListener(() -> { ... })
                      .build())
                  .build())
            .build()))
        .setHeader(header)
        .build())
    .setActionStrip(actionStrip)
    .setMapController(new MapController.Builder()
        .setMapActionStrip(mapActionStrip)
        .build())
    .build();

नेविगेशन ऐप्लिकेशन को एक से ज़्यादा नेविगेशन मेटाडेटा को होस्ट. होस्ट इस जानकारी का इस्तेमाल, वाहन की मुख्य यूनिट और नेविगेशन ऐप्लिकेशन को एक-दूसरे से टकराने से रोकने के लिए शेयर किए गए संसाधन.

नेविगेशन मेटाडेटा इसके ज़रिए दिया जाता है: NavigationManager कार सेवा यहां से ऐक्सेस की जा सकती है: CarContext:

Kotlin

val navigationManager = carContext.getCarService(NavigationManager::class.java)

Java

NavigationManager navigationManager = carContext.getCarService(NavigationManager.class);

नेविगेशन चालू, बंद, और बंद करें

होस्ट की ओर से एक से ज़्यादा नेविगेशन ऐप्लिकेशन मैनेज करने, सूचनाओं को रूट करने के लिए, और व्हीकल क्लस्टर डेटा के लिए, इसे स्थिति की मौजूदा स्थिति की जानकारी होनी चाहिए नेविगेशन. जब कोई उपयोगकर्ता नेविगेशन शुरू करता है, तो उसे कॉल करें NavigationManager.navigationStarted. इसी तरह, नेविगेशन के खत्म होने पर—उदाहरण के लिए, जब उपयोगकर्ता अपने डेस्टिनेशन या उपयोगकर्ता नेविगेशन रद्द कर देता है—कॉल NavigationManager.navigationEnded.

केवल NavigationManager.navigationEnded को कॉल करें जब उपयोगकर्ता नेविगेट करना खत्म कर लेता है. उदाहरण के लिए, अगर आपको इसकी फिर से गिनती करनी हो, यात्रा के दौरान मार्ग में, इसका उपयोग करें Trip.Builder.setLoading(true) आज़माएं.

कभी-कभी, होस्ट को नेविगेशन और कॉल रोकने के लिए, ऐप्लिकेशन की ज़रूरत पड़ती है onStopNavigation NavigationManagerCallback आपके ऐप्लिकेशन ने इसके ज़रिए ऑब्जेक्ट दिया NavigationManager.setNavigationManagerCallback. इसके बाद, ऐप्लिकेशन को क्लस्टर डिसप्ले में अगली बारी की जानकारी देना बंद करना होगा, और आवाज़ से रास्ता बताने की सुविधा इस्तेमाल करें.

यात्रा की जानकारी अपडेट करें

सक्रिय नेविगेशन के दौरान, कॉल करें NavigationManager.updateTrip. इस कॉल में दी गई जानकारी का इस्तेमाल, वाहन के क्लस्टर और हेड्स-अप डिसप्ले. जिस वाहन को चलाया जा रहा है उसके आधार पर, सभी नहीं उपयोगकर्ता को यह जानकारी दिखाई जाती है. उदाहरण के लिए, डेस्कटॉप हेड यूनिट (DHU) Step को Trip, लेकिन यह नहीं दिखता है Destination जानकारी.

क्लस्टर डिसप्ले की मदद से ड्रॉइंग करना

उपयोगकर्ताओं को सबसे अच्छा अनुभव देने के लिए, गाड़ी के क्लस्टर डिसप्ले पर बेसिक मेटाडेटा दिखा रहा है. कार ऐप्लिकेशन के एपीआई लेवल 6 में, नेविगेशन ऐप्लिकेशन में रेंडरिंग का विकल्प मौजूद है अपना कॉन्टेंट सीधे क्लस्टर डिसप्ले पर दिखा सकता है (सुविधा देने वाली गाड़ियों में), और निम्न सीमाएं:

  • क्लस्टर डिसप्ले एपीआई, इनपुट कंट्रोल के साथ काम नहीं करता
  • क्लस्टर डिसप्ले में सिर्फ़ मैप की टाइल दिखनी चाहिए. एक सक्रिय रास्ता नेविगेशन ये कर सकता है वैकल्पिक रूप से इन टाइल पर दिखाया जाएगा.
  • क्लस्टर Display API सिर्फ़ इनके इस्तेमाल पर काम करता है: NavigationTemplate
    • ऐसा हो सकता है कि मुख्य डिसप्ले के उलट, क्लस्टर डिसप्ले में सभी डिसप्ले लगातार न दिखें NavigationTemplate यूज़र इंटरफ़ेस (यूआई) एलिमेंट, जैसे कि मोड़-दर-मोड़ निर्देश, ETA कार्ड और कार्रवाइयां. सिर्फ़ मैप टाइल ही लगातार दिखने वाले यूज़र इंटरफ़ेस (यूआई) हैं एलिमेंट.

क्लस्टर के लिए सहायता का एलान करें

होस्ट ऐप्लिकेशन को यह बताने के लिए कि आपके ऐप्लिकेशन में क्लस्टर पर रेंडरिंग की सुविधा काम करती है दिखाता है, तो आपको किसी androidx.car.app.category.FEATURE_CLUSTER को जोड़ना होगा आपके CarAppService के <intent-filter> के लिए <category> एलिमेंट, जैसा कि स्निपेट:

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

लाइफ़साइकल ऐंड स्टेट मैनेजमेंट

एपीआई लेवल 6 में, कार ऐप्लिकेशन के लिए लाइफ़साइकल फ़्लो वही रहता है, लेकिन अब CarAppService::onCreateSession SessionInfo टाइप करें, जो बनाए जा रहे Session के बारे में अतिरिक्त जानकारी (जैसे, डिसप्ले और उसका इस्तेमाल किया जा सकता है.

ऐप्लिकेशन के पास ये दोनों कार्रवाइयां करने के लिए, एक ही Session क्लास का इस्तेमाल करने का विकल्प होता है क्लस्टर और मेन डिसप्ले चुनें या पसंद के मुताबिक बनाने के लिए, डिसप्ले के हिसाब से खास Sessions बनाएं व्यवहार (जैसा कि नीचे दिए गए स्निपेट में दिखाया गया है).

Kotlin

override fun onCreateSession(sessionInfo: SessionInfo): Session {
  return if (sessionInfo.displayType == SessionInfo.DISPLAY_TYPE_CLUSTER) {
    ClusterSession()
  } else {
    MainDisplaySession()
  }
}

Java

@Override
@NonNull
public Session onCreateSession(@NonNull SessionInfo sessionInfo) {
  if (sessionInfo.getDisplayType() == SessionInfo.DISPLAY_TYPE_CLUSTER) {
    return new ClusterSession();
  } else {
    return new MainDisplaySession();
  }
}

इस बात की कोई गारंटी नहीं है कि क्लस्टर डिसप्ले कब दिया गया है और कब उपलब्ध कराया गया है. यह भी हो सकता है कि क्लस्टर Session सिर्फ़ Session हो (इसके लिए उदाहरण के लिए, जब आपका ऐप्लिकेशन नेविगेट करने में मदद मिलती है). "मानक" कानूनी समझौता यह है कि ऐप्लिकेशन सिर्फ़ NavigationManager::navigationStarted के होने के बाद ही क्लस्टर डिसप्ले कॉल किया गया. हालांकि, ऐप्लिकेशन में क्लस्टर का डिसप्ले उपलब्ध कराया जा सकता है जब कोई नेविगेशन चालू न हो या क्लस्टर कभी न मिले डिसप्ले. इन स्थितियों को मैनेज करने की ज़िम्मेदारी आपके ऐप्लिकेशन की होती है. इसके लिए, अपने ऐप्लिकेशन के मैप टाइल की निष्क्रिय स्थिति.

होस्ट, हर Session के लिए अलग बाइंडर और CarContext इंस्टेंस बनाता है. यह इसका मतलब है कि ScreenManager::push या Screen::invalidate, सिर्फ़ वह Session है जिससे इन्हें कॉल किया जाता है प्रभावित. ऐप्लिकेशन को इन चीज़ों के बीच अपने खुद के संचार चैनल बनाने चाहिए अगर क्रॉस-Session कम्यूनिकेशन की ज़रूरत हो. उदाहरण के लिए, ब्रॉडकास्ट, शेयर किया गया सिंगलटन या कुछ और .

टेस्टिंग क्लस्टर की सहायता

Android Auto और Android Automotive OS, दोनों पर लागू किए गए कोड की जांच की जा सकती है. Android Auto के लिए, ऐसा करने के लिए डेस्कटॉप हेड यूनिट को एम्युलेट करने के लिए कॉन्फ़िगर किया जाता है सेकंडरी क्लस्टर डिसप्ले. इसके लिए Android Automotive OS, एपीआई के लिए सामान्य सिस्टम इमेज लेवल 30 और उसके बाद के लेवल, क्लस्टर डिसप्ले को एम्युलेट करें.

टेक्स्ट या आइकॉन की मदद से घूमने के अनुमान को पसंद के मुताबिक बनाएं

टेक्स्ट, आइकॉन या दोनों की मदद से, अपनी यात्रा का अनुमान लगाने के लिए, TravelEstimate.Builder क्लास का setTripIcon या setTripText तरीकों का इस्तेमाल करना होगा. कॉन्टेंट बनाने NavigationTemplate उपयोग TravelEstimate अनुमानित समय के साथ या उसके स्थान पर वैकल्पिक रूप से टेक्स्ट और आइकन सेट करने के लिए पहुंचने का समय, बचा हुआ समय, और बची हुई दूरी.

पहली इमेज. पसंद के आइकॉन और टेक्स्ट के साथ यात्रा का अनुमान.

नीचे दिया गया स्निपेट, setTripIcon और setTripText का इस्तेमाल करके, यात्रा का अनुमान:

Kotlin

TravelEstimate.Builder(Distance.create(...), DateTimeWithZone.create(...))
      ...
      .setTripIcon(CarIcon.Builder(...).build())
      .setTripText(CarText.create(...))
      .build()

Java

new TravelEstimate.Builder(Distance.create(...), DateTimeWithZone.create(...))
      ...
      .setTripIcon(CarIcon.Builder(...).build())
      .setTripText(CarText.create(...))
      .build();

मोड़-दर-मोड़ सूचनाएं पाएं

बार-बार मोड़-दर-मोड़ (टीबीटी) नेविगेशन के निर्देश दें नेविगेशन की सूचना अपडेट की गई है. नेविगेशन के तौर पर गिने जाने के लिए सूचना नहीं दिखाई है, तो आपके नोटिफ़िकेशन बिल्डर को फ़ॉलो किया जा रहा है:

  1. इसके साथ, सूचना को 'जारी है' के तौर पर मार्क करें NotificationCompat.Builder.setOngoing तरीका.
  2. सूचना की कैटगरी को Notification.CATEGORY_NAVIGATION पर सेट करें.
  3. सूचना के लिए, CarAppExtender.

सबसे नीचे रेल विजेट में नेविगेशन की सूचना दिखती है कार की स्क्रीन दिखेगी. अगर सूचना की अहमियत का लेवल इस पर सेट किया गया हो IMPORTANCE_HIGH पर है, तो यह हेड-अप नोटिफ़िकेशन (HUN) के तौर पर भी दिखता है. अगर अहमियत CarAppExtender.Builder.setImportance तरीका है, तो सूचना चैनल की अहमियत का इस्तेमाल किया जाता है.

ऐप्लिकेशन PendingIntent को CarAppExtender उस उपयोगकर्ता के HUN या रेल विजेट पर टैप करने पर, ऐप्लिकेशन में यह डेटा भेजा जाता है.

अगर आपने NotificationCompat.Builder.setOnlyAlertOnce को true की वैल्यू के साथ कॉल किया जाता है. यह सिर्फ़ ज़्यादा अहमियत वाली सूचना की सूचना देता है एक बार हन गए थे.

नीचे दिए गए स्निपेट में, नेविगेशन की सूचना बनाने का तरीका बताया गया है:

Kotlin

NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
    ...
    .setOnlyAlertOnce(true)
    .setOngoing(true)
    .setCategory(NotificationCompat.CATEGORY_NAVIGATION)
    .extend(
        CarAppExtender.Builder()
            .setContentTitle(carScreenTitle)
            ...
            .setContentIntent(
                PendingIntent.getBroadcast(
                    context,
                    ACTION_OPEN_APP.hashCode(),
                    Intent(ACTION_OPEN_APP).setComponent(
                        ComponentName(context, MyNotificationReceiver::class.java)),
                        0))
            .setImportance(NotificationManagerCompat.IMPORTANCE_HIGH)
            .build())
    .build()

Java

new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
    ...
    .setOnlyAlertOnce(true)
    .setOngoing(true)
    .setCategory(NotificationCompat.CATEGORY_NAVIGATION)
    .extend(
        new CarAppExtender.Builder()
            .setContentTitle(carScreenTitle)
            ...
            .setContentIntent(
                PendingIntent.getBroadcast(
                    context,
                    ACTION_OPEN_APP.hashCode(),
                    new Intent(ACTION_OPEN_APP).setComponent(
                        new ComponentName(context, MyNotificationReceiver.class)),
                        0))
            .setImportance(NotificationManagerCompat.IMPORTANCE_HIGH)
            .build())
    .build();

दूरी के लिए, TBT सूचना को नियमित रूप से अपडेट करें बदलाव होते हैं, जो रेल विजेट को अपडेट करता है और सूचना को सिर्फ़ HUN के तौर पर दिखाता है. इसकी मदद से, सूचना की अहमियत सेट करके HUN के व्यवहार को कंट्रोल किया जा सकता है CarAppExtender.Builder.setImportance. अहमियत को इस पर सेट करना IMPORTANCE_HIGH ने एक हुन दिखाया है. सेटिंग इसे किसी दूसरी वैल्यू पर सेट करने से, सिर्फ़ रेल के विजेट को अपडेट किया जा सकता है.

जगह सूची नेविगेशन टेंप्लेट का कॉन्टेंट रीफ़्रेश करें

ड्राइवर को सिर्फ़ एक बटन पर टैप करके, कॉन्टेंट को रीफ़्रेश करने की सुविधा दी जा सकती है. इसका इस्तेमाल करके बनाई गई जगहों की सूचियां PlaceListNavigationTemplate. सूची रीफ़्रेश को सक्षम करने के लिए, OnContentRefreshListener इंटरफ़ेस का onContentRefreshRequested तरीका और इस्तेमाल PlaceListNavigationTemplate.Builder.setOnContentRefreshListener लिसनर को टेंप्लेट पर सेट करने के लिए.

नीचे दिए गए स्निपेट में, लिसनर को टेंप्लेट में सेट करने का तरीका बताया गया है:

Kotlin

PlaceListNavigationTemplate.Builder()
    ...
    .setOnContentRefreshListener {
        // Execute any desired logic
        ...
        // Then call invalidate() so onGetTemplate() is called again
        invalidate()
    }
    .build()

Java

new PlaceListNavigationTemplate.Builder()
        ...
        .setOnContentRefreshListener(() -> {
            // Execute any desired logic
            ...
            // Then call invalidate() so onGetTemplate() is called again
            invalidate();
        })
        .build();

रीफ़्रेश करें बटन सिर्फ़ हेडर में दिखता है अगर लिसनर की कोई वैल्यू है, तो PlaceListNavigationTemplate.

जब उपयोगकर्ता रीफ़्रेश बटन पर क्लिक करता है, तो onContentRefreshRequested तरीका लागू करने की OnContentRefreshListener प्रक्रिया को कॉल किया गया. इतने समय में onContentRefreshRequested, Screen.invalidate तरीका. इसके बाद, होस्ट आपके ऐप्लिकेशन के Screen.onGetTemplate अपडेट की गई सामग्री के साथ टेम्प्लेट को वापस पाने का तरीका. यहां जाएं: टेंप्लेट का कॉन्टेंट रीफ़्रेश करने के लिए टेंप्लेट रीफ़्रेश करने के बारे में ज़्यादा जानकारी. अगले टेंप्लेट के लिए अनुमति दें इन्होंने वापस किया onGetTemplate इसका है ठीक उसी तरह होता है, इसे रीफ़्रेश के रूप में गिना जाता है और टेंप्लेट कोटा.

आवाज़ से रास्ता बताने की सुविधा दें

कार के स्पीकर पर नेविगेशन के दिशा-निर्देश चलाने के लिए, आपके ऐप्लिकेशन को अनुरोध करना होगा ऑडियो फ़ोकस. आपके कार्यक्रम के हिस्से के तौर पर AudioFocusRequest, सेट AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE के तौर पर इस्तेमाल किया. साथ ही, फ़ोकस गेन को AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK पर सेट करें.

नेविगेशन को सिम्युलेट करें

अपने ऐप्लिकेशन के नेविगेशन फ़ंक्शन को सबमिट करने पर, उसकी पुष्टि की जा सकेगी तो आपके ऐप्लिकेशन को NavigationManagerCallback.onAutoDriveEnabled कॉलबैक. इस कॉलबैक को कॉल किए जाने पर, आपके ऐप्लिकेशन को जब उपयोगकर्ता नेविगेशन शुरू करता है, तो चुने गए डेस्टिनेशन. आपका ऐप्लिकेशन इससे बाहर निकल सकता है मौजूदा Session की लाइफ़साइकल के दौरान मोड तक पहुंच जाता है Lifecycle.Event.ON_DESTROY राज्य.

यह जांच की जा सकती है कि onAutoDriveEnabled को लागू करने की वजह से कमांड लाइन से नीचे दिया गया काम करें:

adb shell dumpsys activity service CAR_APP_SERVICE_NAME AUTO_DRIVE

यह नीचे दिए गए उदाहरण में दिखाया गया है:

adb shell dumpsys activity service androidx.car.app.samples.navigation.car.NavigationCarAppService AUTO_DRIVE

डिफ़ॉल्ट नेविगेशन कार ऐप्लिकेशन

Android Auto में, डिफ़ॉल्ट नेविगेशन कार ऐप्लिकेशन जिसे उपयोगकर्ता ने लॉन्च किया है. डिफ़ॉल्ट ऐप्लिकेशन नेविगेशन इंटेंट हासिल करता है, जब उपयोगकर्ता Assistant की मदद से, नेविगेशन के निर्देश भेजता है. इसके अलावा, जब कोई दूसरा ऐप्लिकेशन का इस्तेमाल, नेविगेशन शुरू करने के लिए किया जा सकता है.

संदर्भ के हिसाब से नेविगेशन की सूचनाएं दिखाएं

Alert ज़रूरी जानकारी दिखाता है ड्राइवर को किसी भी तक स्क्रोल करें. ड्राइवर को बेहतरीन अनुभव देने के लिए, Alert इसके अंदर काम करता है: NavigationTemplate ताकि नेविगेशन रूट ब्लॉक न हो और ड्राइवर का ध्यान न भटके.

Alert, सिर्फ़ NavigationTemplate में उपलब्ध है. NavigationTemplate से बाहर के उपयोगकर्ता को सूचित करने के लिए, तो, हेड-अप नोटिफ़िकेशन (HUN) का इस्तेमाल करें. इसके बारे में यहां बताया गया है सूचनाएं दिखाएं.

उदाहरण के लिए, Alert का इस्तेमाल इन कामों के लिए करें:

  • मौजूदा नेविगेशन से जुड़े अपडेट के ड्राइवर को जानकारी दें, जैसे कि ट्रैफ़िक की स्थिति में बदलाव.
  • ड्राइवर से वर्तमान नेविगेशन से संबंधित अपडेट के लिए कहें, जैसे स्पीड ट्रैप की मौजूदगी.
  • आने वाले टास्क के लिए सुझाव दें और पूछें कि ड्राइवर इसे स्वीकार करेगा या नहीं. जैसे कि क्या ड्राइवर अपने रास्ते में किसी को लेने के लिए तैयार है.

Alert में एक टाइटल और Alert मौजूद होता है अवधि की अवधि. समीक्षा की अवधि को प्रोग्रेस बार से दिखाया जाता है. या फिर, आप एक सबटाइटल, एक आइकॉन, और ज़्यादा से ज़्यादा दो Action ऑब्जेक्ट.

दूसरी इमेज. ज़रूरत के हिसाब से नेविगेशन की सूचना.

Alert को दिखाए जाने पर, वह किसी दूसरे टेंप्लेट पर नहीं ले जाता है, अगर ड्राइवर इंटरैक्शन के नतीजे में NavigationTemplate को छोड़ दिया जाता है. यह मूल NavigationTemplate में तब तक रहता है, जब तक उपयोगकर्ता खाते को Alert बार इस्तेमाल नहीं कर लेता कोई कार्रवाई करता है या ऐप्लिकेशन Alert को खारिज कर देता है.

अलर्ट बनाएं

Alert.Builder का इस्तेमाल करें Alert इंस्टेंस बनाने के लिए:

Kotlin

Alert.Builder(
        /*alertId*/ 1,
        /*title*/ CarText.create("Hello"),
        /*durationMillis*/ 5000
    )
    // The fields below are optional
    .addAction(firstAction)
    .addAction(secondAction)
    .setSubtitle(CarText.create(...))
    .setIcon(CarIcon.APP_ICON)
    .setCallback(...)
    .build()

Java

new Alert.Builder(
        /*alertId*/ 1,
        /*title*/ CarText.create("Hello"),
        /*durationMillis*/ 5000
    )
    // The fields below are optional
    .addAction(firstAction)
    .addAction(secondAction)
    .setSubtitle(CarText.create(...))
    .setIcon(CarIcon.APP_ICON)
    .setCallback(...)
    .build();

अगर आपको Alert को सुनना है रद्द या खारिज करने के लिए किया जाता है, तो AlertCallback इंटरफ़ेस. AlertCallback कॉल पाथ ये हैं:

  • अगर Alert का समय खत्म हो जाता है, तो होस्ट AlertCallback.onCancel तरीका है AlertCallback.REASON_TIMEOUT वैल्यू. इसके बाद, यह AlertCallback.onDismiss तरीका.

  • अगर ड्राइवर किसी ऐक्शन बटन पर क्लिक करता है, तो होस्ट को कॉल Action.OnClickListener और फिर AlertCallback.onDismiss पर कॉल करता है.

  • अगर Alert का इस्तेमाल नहीं किया जा सकता है, तो होस्ट को कॉल AlertCallback.onCancel AlertCallback.REASON_NOT_SUPPORTED वैल्यू. होस्ट ने कॉल नहीं किया AlertCallback.onDismiss क्योंकि Alert को दिखाया नहीं गया था.

सूचना की अवधि कॉन्फ़िगर करें

ऐसी Alert अवधि चुनें जो आपके ऐप्लिकेशन की ज़रूरतों को पूरा करता हो. नेविगेशन के लिए सुझाया गया समय Alert की अवधि 10 सेकंड है. नेविगेशन सूचनाएं देखें हमारा वीडियो देखें.

कोई सूचना दिखाएं

Alert दिखाने के लिए, AppManager.showAlert आपके ऐप्लिकेशन के CarContext.

// Show an alert
carContext.getCarService(AppManager.class).showAlert(alert)
  • showAlert को ऐसे Alert के साथ कॉल किया जा रहा है जिसमें alertId जो अभी डिसप्ले में मौजूद Alert के आईडी से मेल खाता है. Alert अपडेट नहीं होता है. Alert को अपडेट करने के लिए, आपको फिर से बनाना होगा नए alertId के साथ.
  • Alert के साथ showAlert को कॉल किया जा रहा है, जो डिसप्ले पर मौजूद Alert की तुलना में alertId इस प्रोसेस को खारिज करता है फ़िलहाल, Alert दिख रहा है.

किसी सूचना को खारिज करना

जब Alert अपने-आप खारिज हो जाए के कारण, टाइम आउट या ड्राइवर इंटरैक्शन के कारण, आप Alert, जैसे कि अगर इसकी जानकारी पुरानी हो जाती है. किसी Alert, dismissAlert तरीका है alertId Alert में से.

// Dismiss the same alert
carContext.getCarService(AppManager.class).dismissAlert(alert.getId())

alertId के साथ dismissAlert को कॉल किया जा रहा है, जो मौजूदा दिखाया गया Alert कुछ नहीं करता. इससे किसी भी तरह की छूट नहीं मिलती.