تعرض هذه الصفحة تفاصيل الميزات المختلفة لـ Car App Library التي يمكنك استخدامها لتنفيذ وظائف تطبيق التنقّل باتّجاهات مفصّلة.
توضيح إتاحة التنقّل في البيان
يجب أن يذكر تطبيق التنقّل 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
: يعرض أيضًا رسالة إعلامية اختيارية وتقديرات بشأن السفر أثناء التنقّل النشط.MapTemplate
: تقدّم نسخة مصغّرة من قائمة (كما فيListTemplate
) أو من جزء (معلومات مفصّلة مع إجراءات بارزة، كما فيPaneTemplate
) بجانب خريطة.PlaceListNavigationTemplate
: يعرض أيضًا قائمة بالأماكن التي يمكن أن تكون لها علامات مقابلة مرسومة في الخريطة.RoutePreviewNavigationTemplate
: يعرض أيضًا قائمة بالمسارات، ويمكن اختيار أحدها وتمييزه في الخريطة.
للحصول على مزيد من التفاصيل عن كيفية تصميم واجهة مستخدم تطبيق التنقّل باستخدام تلك النماذج، يمكنك الاطّلاع على تطبيقات التنقّل.
للوصول إلى نماذج التنقّل، يجب أن يوضِّح تطبيقك إذن androidx.car.app.NAVIGATION_TEMPLATES
في ملف AndroidManifest.xml
:
<uses-permission android:name="androidx.car.app.NAVIGATION_TEMPLATES"/>
رسم الخريطة
يمكن لتطبيقات التنقّل الوصول إلى Surface
لرسم الخريطة على النماذج ذات الصلة.
يمكن بعد ذلك الوصول إلى عنصر SurfaceContainer
من خلال ضبط مثيل SurfaceCallback
في خدمة السيارات
AppManager
:
Kotlin
carContext.getCarService(AppManager::class.java).setSurfaceCallback(surfaceCallback)
Java
carContext.getCarService(AppManager.class).setSurfaceCallback(surfaceCallback);
توفِّر السمة SurfaceCallback
معاودة الاتصال عندما يكون SurfaceContainer
متاحًا، إلى جانب عمليات معاودة الاتصال الأخرى عند تغيير خصائص Surface
.
للوصول إلى مساحة العرض، يجب أن يفصح تطبيقك عن
إذن androidx.car.app.ACCESS_SURFACE
في ملف AndroidManifest.xml
الخاص به:
<uses-permission android:name="androidx.car.app.ACCESS_SURFACE"/>
المنطقة المرئية للخريطة
يمكن للمضيف رسم عناصر واجهة المستخدم للنماذج أعلى الخريطة. يُبلغ المضيف عن المنطقة التي يمكن ضمان عدم وجود عوائق فيها ورؤيتها بالكامل للمستخدم من خلال استدعاء الطريقة
SurfaceCallback.onVisibleAreaChanged
. لتقليل عدد التغييرات أيضًا، يستدعي المضيف الطريقة
SurfaceCallback.onStableAreaChanged
بأصغر مستطيل، والذي يظهر دائمًا استنادًا إلى
النموذج الحالي.
على سبيل المثال، عندما يستخدم أحد تطبيقات التنقّل NavigationTemplate
مع شريط إجراءات في أعلى الشاشة، يمكن أن يخفي شريط الإجراءات نفسه عندما لا يتفاعل
المستخدم مع الشاشة لفترة من الوقت لتوفير مساحة أكبر على الخريطة. في هذه الحالة، هناك معاودة اتصال إلى onStableAreaChanged
وonVisibleAreaChanged
باستخدام المستطيل نفسه. عند إخفاء شريط الإجراءات،
يتم استدعاء onVisibleAreaChanged
فقط مع المساحة الأكبر. إذا تفاعل المستخدم مع الشاشة، فسيتم مرة أخرى استدعاء onVisibleAreaChanged
فقط مع المستطيل الأول.
إتاحة "الوضع الداكن"
على تطبيقات التنقّل إعادة رسم الخريطة على مثيل Surface
باستخدام الألوان الداكنة المناسبة عندما يقرّر المضيف أنّ الظروف تتطلّب ذلك، على النحو الموضَّح في جودة تطبيقات Android للسيارات.
لتحديد ما إذا كنت تريد رسم خريطة داكنة أم لا، يمكنك استخدام الإجراء
CarContext.isDarkMode
. وعندما تتغيّر حالة "الوضع الداكن"، ستتلقّى مكالمة على الرقم
Session.onCarConfigurationChanged
.
نقل البيانات الوصفية للتنقُّل
يجب أن تقوم تطبيقات التنقل بتوصيل بيانات وصفية إضافية للتنقل مع المضيف. يستخدم المضيف المعلومات لتقديم معلومات إلى الوحدة الرئيسية للمركبة ولمنع تطبيقات التنقّل من التضارب مع الموارد المشتركة.
يتم توفير البيانات الوصفية للتنقُّل من خلال خدمة السيارات
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
.
يمكن استخدام المعلومات المقدمة في هذا الاستدعاء من خلال شاشات العرض الرأسية والتجميع العنقودي للمركبة. اعتمادًا على المركبة المحددة التي يتم قيادتها، لا يتم
عرض كل المعلومات للمستخدم.
على سبيل المثال، تعرض وحدة Desktop Head Unit (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>
إدارة الحالة ومراحل النشاط التجاري
بدءًا من المستوى السادس من واجهة برمجة التطبيقات، يظل مسار نشاط تطبيق السيارة كما هو، أما الآن، فيأخذ 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، يتم إجراء ذلك من خلال ضبط الوحدة الرئيسية لسطح المكتب لمحاكاة شاشة العرض العنقودية الثانوية. بالنسبة إلى نظام التشغيل Android Automotive، فإنّ صور النظام العامة للمستوى 30 من واجهة برمجة التطبيقات والمستويات الأعلى تحاكي عرض مجموعة.
تخصيص TravelEstimate باستخدام نص أو رمز
لتخصيص الوقت المقدّر للسفر باستخدام نص أو رمز أو كليهما، استخدِم طريقة
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" أو عندما يرسِل تطبيق آخر هدفًا لبدء التنقّل.
السماح للمستخدمين بالتفاعل مع خريطتك
يمكنك إضافة دعم للمستخدمين للتفاعل مع الخرائط، مثل السماح لهم بمشاهدة أجزاء مختلفة من الخريطة عن طريق التكبير والتصغير والتحريك. يحتوي كل نموذج على حد أدنى مختلف لمتطلبات مستوى واجهة برمجة تطبيقات Car App API. راجع الجدول التالي لمعرفة الحد الأدنى للمستوى للقالب الذي تريد تنفيذه.
النموذج | ميزة التفاعل متاحة منذ مستوى Car App API |
---|---|
NavigationTemplate | 2 |
PlaceListNavigationTemplate | 4 |
RoutePreviewNavigationTemplate | 4 |
MapTemplate |
5 |
طرق معاودة الاتصال في Surface
تتضمن واجهة SurfaceCallback
عدة طرق لمعاودة الاتصال تتيح لك إضافة تفاعل إلى الخرائط التي تم إنشاؤها باستخدام نماذج
NavigationTemplate
أو PlaceListNavigationTemplate
أو RoutePreviewNavigationTemplate
أو MapTemplate
:
onClick
وonScroll
وonScale
وonFling
.
راجِع الجدول التالي لمعرفة مدى صلة عمليات معاودة الاتصال هذه بتفاعلات المستخدم.
التفاعل | طريقة واحدة (SurfaceCallback ) |
متوافق مع مستوى واجهة برمجة تطبيقات Car App API |
---|---|---|
النقر | onClick |
5 |
التكبير/التصغير بإصبعَين | onScale |
2 |
السحب بلمسة واحدة | onScroll |
2 |
الانتقال بلمسة واحدة | onFling |
2 |
النقر مرتين | onScale (مع عامل المقياس الذي يحدّده مضيف النموذج) |
2 |
دفع دوراني في وضع العرض الشامل | onScroll (مع تحديد عامل المسافة من خلال مضيف النموذج) |
2 |
شريط الإجراءات على الخريطة
يمكن أن تحتوي نماذج
NavigationTemplate
وPlaceListNavigationTemplate
وRoutePreviewNavigationTemplate
وMapTemplate
على شريط إجراءات على الخريطة لتنفيذ الإجراءات المتعلقة بالخريطة، مثل التكبير والتصغير
وإعادة التوسيط وعرض بوصلة والإجراءات الأخرى التي تختار عرضها. يمكن أن يحتوي شريط إجراءات الخريطة على ما يصل إلى أربعة أزرار على شكل رموز فقط يمكن تحديثها بدون التأثير على عمق المهمة. كما يختبئ أثناء حالة الخمول ويظهر مرة أخرى في حالة النشاط.
لتلقّي طلبات إعادة الاتصال للتفاعل على الخريطة، يجب إضافة الزر Action.PAN
في شريط إجراءات الخريطة. عندما يضغط المستخدم على زر التحريك، يدخل المضيف
في وضع العرض الشامل، كما هو موضح في القسم التالي.
إذا حذف تطبيقك الزر Action.PAN
في شريط إجراءات الخريطة، لن يتلقّى إدخالات المستخدم من طرق SurfaceCallback
ويخرج المضيف من أي وضع عرض شامل سبق تفعيله.
على شاشة تعمل باللمس، لا يتم عرض زر العرض الشامل.
وضع العرض الشامل
في وضع العرض الشامل، يترجم مضيف النموذج البيانات التي أدخلها المستخدم من أجهزة الإدخال التي لا تعمل باللمس، مثل وحدات التحكّم في الدوران ولوحات اللمس، إلى طرق
SurfaceCallback
المناسبة. يمكنك الاستجابة لإجراء المستخدم للدخول في وضع العرض الشامل أو الخروج منه باستخدام الطريقة
setPanModeListener
في NavigationTemplate.Builder
. يمكن للمضيف إخفاء مكونات واجهة المستخدم
الأخرى في القالب عندما يكون المستخدم في وضع العرض الشامل.
منطقة ثابتة
يتم تعديل المنطقة الثابتة بين حالتَي "عدم النشاط" و"وضع عدم النشاط". حدد ما إذا كنت تريد رسم المعلومات المتعلقة بالقيادة، مثل السرعة أو حد السرعة أو التحذيرات على الطريق، بناءً على حجم المنطقة الثابتة، بحيث لا يتم حجب المعلومات المهمة على الخريطة بواسطة شريط إجراءات الخريطة.
عرض تنبيهات التنقّل في السياق
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
المعروض حاليًا، لن يؤدي إلى أي نتيجة. ولا يقدم استثناءً.