یک برنامه ناوبری بسازید

این صفحه ویژگی‌های مختلف کتابخانه برنامه خودرو را که می‌توانید برای اجرای عملکرد برنامه ناوبری گام به گام خود استفاده کنید، توضیح می‌دهد.

پشتیبانی ناوبری را در مانیفست خود اعلام کنید

برنامه ناوبری شما باید دسته برنامه ماشین 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 با استفاده از پرس و جو صوتی می آیند، برنامه شما باید هدف 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 مهاجرت کنید

با شروع API سطح 7 Car App، MapTemplate ، PlaceListNavigationTemplate ، و RoutePreviewNavigationTemplate منسوخ شده اند. الگوهای منسوخ شده همچنان پشتیبانی خواهند شد، اما مهاجرت به MapWithContentTemplate اکیداً توصیه می شود.

عملکرد ارائه شده توسط این الگوها را می توان با استفاده از MapWithContentTemplate پیاده سازی کرد. برای نمونه به قطعات زیر مراجعه کنید:

قالب نقشه

کاتلین

// 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()

جاوا

// 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();

PlaceListNavigationTemplate

کاتلین

// 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()

جاوا

// 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();

RoutePreviewNavigationTemplate

کاتلین

// 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()

جاوا

// 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 ارائه می شود:

کاتلین

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

جاوا

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

شروع، پایان و توقف ناوبری

برای اینکه میزبان بتواند چندین برنامه ناوبری، اعلان های مسیریابی و داده های خوشه خودرو را مدیریت کند، باید از وضعیت فعلی ناوبری آگاه باشد. هنگامی که کاربر ناوبری را شروع می کند، NavigationManager.navigationStarted را صدا کنید. به طور مشابه، هنگامی که پیمایش به پایان می رسد - برای مثال، وقتی کاربر به مقصد خود می رسد یا کاربر پیمایش را لغو می کند - NavigationManager.navigationEnded را صدا کنید.

فقط زمانی که کاربر ناوبری را تمام کرد، NavigationManager.navigationEnded را فراخوانی کنید. برای مثال، اگر در میانه سفر نیاز به محاسبه مجدد مسیر دارید، به جای آن از Trip.Builder.setLoading(true) استفاده کنید.

گاهی اوقات، میزبان برای توقف پیمایش به برنامه نیاز دارد و onStopNavigation در یک شی NavigationManagerCallback ارائه شده توسط برنامه شما از طریق NavigationManager.setNavigationManagerCallback فرا می‌خواند. سپس برنامه باید صدور اطلاعات نوبت بعدی را در نمایشگر خوشه، اعلان‌های ناوبری و راهنمایی صوتی متوقف کند.

به روز رسانی اطلاعات سفر

در طول پیمایش فعال، با NavigationManager.updateTrip تماس بگیرید. اطلاعات ارائه شده در این تماس را می توان توسط کلاستر و نمایشگرهای هدآپ خودرو استفاده کرد. بسته به وسیله نقلیه خاصی که رانده می شود، تمام اطلاعات به کاربر نمایش داده نمی شود. برای مثال، Desktop Head Unit (DHU) Step اضافه شده به Trip را نشان می دهد، اما اطلاعات Destination را نشان نمی دهد.

ترسیم به صفحه نمایش خوشه

برای ارائه همه‌جانبه‌ترین تجربه کاربری، ممکن است بخواهید فراتر از نمایش ابرداده‌های اصلی در صفحه نمایش خوشه‌ای خودرو بروید. با شروع API سطح 6 Car App، برنامه‌های ناوبری این امکان را دارند که محتوای خود را مستقیماً روی صفحه نمایش خوشه‌ای (در وسایل نقلیه پشتیبانی‌شده) با محدودیت‌های زیر ارائه دهند:

  • API نمایش خوشه ای از کنترل های ورودی پشتیبانی نمی کند
  • نمایش خوشه ای فقط باید کاشی های نقشه را نشان دهد. یک ناوبری مسیر فعال می تواند به صورت اختیاری روی این کاشی ها نمایش داده شود.
  • API نمایش خوشه ای فقط از NavigationTemplate پشتیبانی می کند
    • برخلاف نمایشگرهای اصلی، نمایشگرهای خوشه ای ممکن است به طور مداوم همه عناصر رابط کاربری NavigationTemplate ، مانند دستورالعمل های گام به گام، کارت های ETA و اقدامات را نشان ندهند. کاشی های نقشه تنها عنصر رابط کاربری هستند که به طور مداوم نمایش داده می شوند.

پشتیبانی کلاستر را اعلام کنید

برای اینکه به برنامه میزبان اطلاع دهید که برنامه شما از رندر در نمایشگرهای خوشه ای پشتیبانی می کند، باید یک عنصر <category> androidx.car.app.category.FEATURE_CLUSTER را به <intent-filter> 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"/>
        <category android:name="androidx.car.app.category.FEATURE_CLUSTER"/>
      </intent-filter>
    </service>
    ...
</application>

چرخه حیات و مدیریت دولتی

با شروع API سطح 6، چرخه عمر برنامه خودرو یکسان می ماند، اما اکنون CarAppService::onCreateSession پارامتری از نوع SessionInfo را می گیرد که اطلاعات بیشتری درباره Session ایجاد شده (یعنی نوع نمایش و مجموعه الگوهای پشتیبانی شده) ارائه می دهد.

برنامه‌ها این گزینه را دارند که یا از همان کلاس Session برای مدیریت کلاستر و نمایش اصلی استفاده کنند، یا Sessions مخصوص نمایشگر را برای سفارشی‌سازی رفتار در هر نمایشگر ایجاد کنند (همانطور که در قطعه زیر نشان داده شده است).

کاتلین

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

جاوا

@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 ، نمونه‌های Binder و CarContext جداگانه ایجاد می‌کند. این به این معنی است که هنگام استفاده از متدهایی مانند ScreenManager::push یا Screen::invalidate ، تنها Session که از آن فراخوانی می شود تحت تأثیر قرار می گیرد. در صورت نیاز به ارتباط Session ، برنامه‌ها باید کانال‌های ارتباطی خود را بین این موارد ایجاد کنند (مثلاً با استفاده از پخش‌ها ، تک آهنگ مشترک یا چیز دیگری).

تست پشتیبانی از کلاستر

می‌توانید پیاده‌سازی خود را هم در Android Auto و هم در Android Automotive OS آزمایش کنید. برای Android Auto، این کار با پیکربندی Desktop Head Unit برای شبیه‌سازی نمایشگر خوشه‌ای ثانویه انجام می‌شود. برای سیستم عامل Android Automotive، تصاویر سیستم عمومی برای سطح API 30 و بالاتر از یک نمایشگر خوشه ای تقلید می کنند.

TravelEstimate را با متن یا نماد سفارشی کنید

برای سفارشی کردن تخمین سفر با متن، نماد یا هر دو، از متدهای setTripIcon یا setTripText کلاس TravelEstimate.Builder استفاده کنید. NavigationTemplate از TravelEstimate استفاده می کند تا متن و نمادها را به صورت اختیاری در کنار یا به جای زمان تخمینی رسیدن، زمان باقیمانده و مسافت باقیمانده تنظیم کند.

شکل 1. برآورد سفر با نماد و متن سفارشی.

قطعه زیر از setTripIcon و setTripText برای سفارشی کردن تخمین سفر استفاده می کند:

کاتلین

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

جاوا

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

اعلان های گام به گام ارائه دهید

با استفاده از یک اعلان ناوبری که اغلب به‌روزرسانی می‌شود، دستورالعمل‌های ناوبری گام به گام (TBT) را ارائه دهید. برای اینکه به عنوان یک اعلان ناوبری در صفحه ماشین در نظر گرفته شود، سازنده اعلان شما باید موارد زیر را انجام دهد:

  1. اعلان را با روش NotificationCompat.Builder.setOngoing به عنوان در حال انجام علامت گذاری کنید.
  2. دسته اعلان را روی Notification.CATEGORY_NAVIGATION تنظیم کنید.
  3. اعلان را با CarAppExtender گسترش دهید.

یک اعلان ناوبری در ویجت راه آهن در پایین صفحه ماشین نمایش داده می شود. اگر سطح اهمیت اعلان روی IMPORTANCE_HIGH تنظیم شده باشد، به عنوان اعلان سرآغاز (HUN) نیز نمایش داده می شود. اگر اهمیت با روش CarAppExtender.Builder.setImportance تنظیم نشده باشد، از اهمیت کانال اطلاع رسانی استفاده می شود.

این برنامه می تواند PendingIntent را در CarAppExtender تنظیم کند که وقتی کاربر روی HUN یا ویجت راه آهن ضربه می زند به برنامه ارسال می شود.

اگر NotificationCompat.Builder.setOnlyAlertOnce با مقدار true فراخوانی شود، یک اعلان با اهمیت فقط یک بار در HUN هشدار می دهد.

قطعه زیر نحوه ساخت اعلان ناوبری را نشان می دهد:

کاتلین

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()

جاوا

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 نشان می دهد. می‌توانید با تنظیم اهمیت اعلان با CarAppExtender.Builder.setImportance ، رفتار HUN را کنترل کنید. تنظیم اهمیت روی IMPORTANCE_HIGH یک HUN را نشان می دهد. تنظیم آن روی هر مقدار دیگری فقط ویجت راه آهن را به روز می کند.

محتوای PlaceListNavigationTemplate را بازخوانی کنید

می‌توانید هنگام مرور فهرست مکان‌های ساخته شده با PlaceListNavigationTemplate ، به رانندگان اجازه دهید با ضربه زدن یک دکمه، محتوا را به‌روزرسانی کنند. برای فعال کردن بازخوانی لیست، روش onContentRefreshRequested رابط OnContentRefreshListener را پیاده سازی کنید و از PlaceListNavigationTemplate.Builder.setOnContentRefreshListener برای تنظیم شنونده روی الگو استفاده کنید.

قطعه زیر نحوه تنظیم شنونده در قالب را نشان می دهد:

کاتلین

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

جاوا

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

دکمه refresh فقط در صورتی در سربرگ PlaceListNavigationTemplate نشان داده می شود که شنونده مقداری داشته باشد.

هنگامی که کاربر روی دکمه refresh کلیک می کند، روش onContentRefreshRequested پیاده سازی OnContentRefreshListener شما فراخوانی می شود. در onContentRefreshRequested ، روش Screen.invalidate را فراخوانی کنید. سپس میزبان مجدداً با روش Screen.onGetTemplate برنامه شما تماس می گیرد تا الگو را با محتوای تازه شده بازیابی کند. برای اطلاعات بیشتر در مورد الگوهای به روز رسانی، به Refresh the content of a template مراجعه کنید. تا زمانی که الگوی بعدی که توسط onGetTemplate برگردانده می‌شود از همان نوع باشد، به‌عنوان یک تازه‌سازی محسوب می‌شود و در سهمیه الگو به حساب نمی‌آید.

راهنمایی صوتی ارائه دهید

برای پخش راهنمای پیمایش روی بلندگوهای خودرو، برنامه شما باید فوکوس صوتی را درخواست کند. به عنوان بخشی از AudioFocusRequest ، میزان استفاده را به عنوان AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE تنظیم کنید.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE. همچنین، افزایش تمرکز را روی AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK تنظیم کنید.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK.

ناوبری را شبیه سازی کنید

برای تأیید عملکرد ناوبری برنامه خود هنگام ارسال آن به فروشگاه Google Play، برنامه شما باید پاسخ تماس 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، برنامه پیش‌فرض ماشین ناوبری مربوط به آخرین برنامه ناوبری است که کاربر راه‌اندازی کرده است. برنامه پیش‌فرض زمانی که کاربر دستورات ناوبری را از طریق «دستیار» فراخوانی می‌کند یا زمانی که برنامه دیگری قصدی برای شروع ناوبری ارسال می‌کند ، اهداف ناوبری را دریافت می‌کند .

نمایش هشدارهای ناوبری درون متنی

Alert اطلاعات مهم را با اقدامات اختیاری به راننده نشان می دهد - بدون خروج از زمینه صفحه ناوبری. برای ارائه بهترین تجربه به راننده، Alert در NavigationTemplate برای جلوگیری از مسدود کردن مسیر ناوبری و به حداقل رساندن حواس پرتی راننده کار می کند.

Alert فقط در NavigationTemplate در دسترس است. برای اطلاع دادن به کاربر در خارج از NavigationTemplate ، همانطور که در نمایش اعلان ها توضیح داده شده است، از یک اعلان heads-up (HUN) استفاده کنید.

به عنوان مثال، از Alert برای موارد زیر استفاده کنید:

  • راننده را از به‌روزرسانی مربوط به مسیریابی فعلی، مانند تغییر در شرایط ترافیک، مطلع کنید.
  • از راننده بخواهید که به روز رسانی مربوط به ناوبری فعلی، مانند وجود تله سرعت را بخواهید.
  • یک کار آینده را پیشنهاد کنید و بپرسید که آیا راننده آن را می‌پذیرد، مثلاً آیا راننده مایل است کسی را در مسیر خود ببرد.

در شکل اصلی خود، یک Alert شامل یک عنوان و مدت زمان Alert است. مدت زمان با یک نوار پیشرفت نشان داده می شود. به صورت اختیاری، می توانید یک زیرنویس، یک نماد و حداکثر دو شی Action اضافه کنید.

شکل 2. هشدار ناوبری درون متنی.

هنگامی که یک Alert نشان داده می شود، اگر تعامل راننده منجر به خروج از NavigationTemplate شود، به الگوی دیگری منتقل نمی شود. تا زمانی که زمان Alert تمام شود، کاربر اقدامی انجام دهد یا برنامه Alert رد کند، در NavigationTemplate اصلی باقی می‌ماند.

یک هشدار ایجاد کنید

از Alert.Builder برای ایجاد یک نمونه Alert استفاده کنید:

کاتلین

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()

جاوا

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 جدید دوباره ایجاد کنید.
  • فراخوانی showAlert با Alert که alertId متفاوتی نسبت به Alert در حال حاضر نمایش داده می شود، Alert نمایش داده شده را رد می کند.

رد کردن یک هشدار

در حالی که Alert به‌دلیل مهلت زمانی یا تعامل راننده به‌طور خودکار رد می‌شود، می‌توانید به‌طور دستی Alert را رد کنید، مثلاً اگر اطلاعات آن قدیمی شود. برای رد کردن یک Alert ، متد dismissAlert را با alertId Alert فراخوانی کنید.

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

فراخوانی dismissAlert با alertId که با Alert نمایش داده شده در حال حاضر مطابقت ندارد، کاری انجام نمی دهد. استثنایی ایجاد نمی کند.