توضح هذه الصفحة بالتفصيل الميزات المختلفة لمكتبة تطبيقات السيارات التي يمكنك استخدامها تنفيذ وظائف تطبيق التنقّل المفصّلة.
يُرجى توضيح توفُّر إمكانية التنقّل في ملف البيان.
يجب أن يفصح تطبيق التنقّل الخاص بك عن 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
بدءًا من المستوى 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 من واجهة برمجة تطبيقات Car App API، سيكون لتطبيقات التنقّل خيار عرض المحتوى الخاص بها مباشرةً على شاشة المجموعة (في المركبات المتوافقة)، مع القيود التالية:
- لا تتيح واجهة برمجة تطبيقات عرض المجموعة إمكانية عناصر التحكّم في الإدخال.
- ويجب أن تعرض شاشة المجموعة مربّعات الخرائط فقط. يمكن أن يؤدي التنقل النشط بالمسار عرضها بشكل اختياري على هذه المربعات.
- لا تتيح واجهة برمجة تطبيقات عرض المجموعة استخدام سوى
NavigationTemplate
- على عكس الشاشات الرئيسية، قد لا تعرض شاشات المجموعات العنقودية جميع
NavigationTemplate
عناصر واجهة المستخدم، مثل التعليمات المفصّلة والوقت المقدر للوصول والبطاقات والإجراءات. مربعات الخرائط هي واجهة المستخدم الوحيدة التي يتم عرضها بشكل متسق العنصر.
- على عكس الشاشات الرئيسية، قد لا تعرض شاشات المجموعات العنقودية جميع
بيان دعم المجموعة
لإعلام التطبيق المضيف بأنّ تطبيقك يتيح العرض على المجموعات
الشاشات، يجب إضافة androidx.car.app.category.FEATURE_CLUSTER
العنصر <category>
إلى <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>
دورة الحياة وإدارة الحالة
بدءًا من المستوى 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
"
استدعيت. ومع ذلك، من الممكن أن يتم توفير العرض العنقودي للتطبيق
عند عدم حدوث تنقل نشط أو عدم توفير المجموعة العنقودية مطلقًا
العرض. يتوقف تطبيقك على التعامل مع هذه السيناريوهات من خلال عرض شاشة
حالة الخمول لمربعات الخرائط.
ينشئ المضيف مجلد منفصلاً وCarContext
مثيلاً لكل Session
. هذا النمط
يعني أنه عند استخدام طرق مثل ScreenManager::push
أو
Screen::invalidate
، فقط Session
الذي تم تسميتها منه
المتأثرة. يجب أن تنشئ التطبيقات قنوات التواصل الخاصة بها بين
الحالات إذا كانت هناك حاجة إلى التواصل بين Session
(على سبيل المثال، باستخدام
أحداث البث، أو أغنية فردية مشتركة، أو شيء من هذا القبيل
غير ذلك).
اختبار دعم المجموعة
يمكنك اختبار عملية التنفيذ على كلٍّ من Android Auto وAndroid Automotive. في Android Auto، يمكن إجراء ذلك من خلال ضبط وحدة Desktop Head Unit لمحاكاة شاشة عنقودية ثانوية بالنسبة نظام التشغيل Android Automotive، صور النظام العامة لواجهة برمجة التطبيقات المستوى 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();
توفير إشعارات مفصَّلة
قدّم إرشادات التنقل اتّجاهات مفصّلة (TBT) باستخدام إشعار التنقل المحدث. أن يتم التعامل معه كعملية تنقل على شاشة السيارة، على أداة إنشاء الإشعارات تنفيذ ما يلي: التالي:
- وضع علامة "مستمر" على الإشعار باستخدام
NotificationCompat.Builder.setOngoing
. - اضبط فئة الإشعار على
Notification.CATEGORY_NAVIGATION
. - توسيع الإشعار من خلال
CarAppExtender
يظهر إشعار تنقل في أداة السكة الحديدية أسفل
شاشة السيارة. إذا تم تعيين مستوى أهمية الإشعار على
IMPORTANCE_HIGH
، ويظهر أيضًا على شكل إشعار تنبيه (HUN).
إذا لم يتم تعيين الأهمية مع
CarAppExtender.Builder.setImportance
الطريقة،
أهمية قناة الإشعارات
استخدام المشروع.
يمكن للتطبيق ضبط PendingIntent
في
CarAppExtender
الذي
يتم إرساله إلى التطبيق عندما ينقر المستخدم على HUN أو تطبيق سكة الحديد المصغّر.
في حال حذف
NotificationCompat.Builder.setOnlyAlertOnce
بقيمة true
، وهو موجّه إشعارات ذات أهمية عالية فقط
مرة واحدة في HUN.
يوضِّح المقتطف التالي كيفية إنشاء إشعار للتنقّل:
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
HUN. الإعداد
إلى أي قيمة أخرى، يتم فقط تحديث أداة شريط الأدوات.
إعادة تحميل محتوى PlaceList NavigationTemplate
يمكنك السماح للسائقين بإعادة تحميل المحتوى بنقرة زر واحدة أثناء التصفّح.
قوائم الأماكن التي تم إنشاؤها باستخدام
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
.
محاكاة التنقل
للتحقّق من وظيفة التنقّل في تطبيقك عند إرساله إلى
"متجر 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، يتوافق تطبيق التنقل التلقائي في السيارة مع آخر تطبيق التنقل الذي أطلقه المستخدم. التطبيق التلقائي تحصل على نوايا التنقّل عندما يلتقي المستخدم يستدعي أوامر التنقل من خلال "مساعد Google" أو عندما يرسل تطبيق آخر نية بدء التنقل.
عرض تنبيهات التنقّل ضمن السياق
يعرض 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
جديد. - الاتصال برقم
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
لا تفعل أي شيء. ولا يقدم استثناء.