این صفحه ویژگیهای مختلف کتابخانه برنامه خودرو را که میتوانید برای اجرای عملکرد برنامه ناوبری گام به گام خود استفاده کنید، توضیح میدهد.
پشتیبانی ناوبری را در مانیفست خود اعلام کنید
برنامه ناوبری شما باید دسته برنامه ماشین 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
استفاده می کند تا متن و نمادها را به صورت اختیاری در کنار یا به جای زمان تخمینی رسیدن، زمان باقیمانده و مسافت باقیمانده تنظیم کند.
قطعه زیر از 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) را ارائه دهید. برای اینکه به عنوان یک اعلان ناوبری در صفحه ماشین در نظر گرفته شود، سازنده اعلان شما باید موارد زیر را انجام دهد:
- اعلان را با روش
NotificationCompat.Builder.setOngoing
به عنوان در حال انجام علامت گذاری کنید. - دسته اعلان را روی
Notification.CATEGORY_NAVIGATION
تنظیم کنید. - اعلان را با
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
اضافه کنید.
هنگامی که یک 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
نمایش داده شده در حال حاضر مطابقت ندارد، کاری انجام نمی دهد. استثنایی ایجاد نمی کند.