إنشاء تطبيق للتنقّل

توضح هذه الصفحة بالتفصيل الميزات المختلفة لمكتبة تطبيقات السيارات التي يمكنك استخدامها تنفيذ وظائف تطبيق التنقّل المفصّلة.

يُرجى توضيح توفُّر إمكانية التنقّل في ملف البيان.

يجب أن يفصح تطبيق التنقّل الخاص بك عن 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 لضبط النص والرموز إلى جانب الوقت المقدّر أو بدلاً منه وقت الوصول والوقت المتبقي والمسافة المتبقية.

الشكل 1. تقدير السفر مع رمز ونص مخصّصَين

يستخدم المقتطف التالي 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) باستخدام إشعار التنقل المحدث. أن يتم التعامل معه كعملية تنقل على شاشة السيارة، على أداة إنشاء الإشعارات تنفيذ ما يلي: التالي:

  1. وضع علامة "مستمر" على الإشعار باستخدام NotificationCompat.Builder.setOngoing .
  2. اضبط فئة الإشعار على Notification.CATEGORY_NAVIGATION.
  3. توسيع الإشعار من خلال 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 الرسالة المهمة معلومات للسائق مع إجراءات اختيارية&dash;بدون ترك سياق شاشة التنقل. لتوفير أفضل تجربة للسائق، تعمل ميزة Alert ضمن NavigationTemplate لتجنب عرقلة مسار التنقل والحدّ من تشتيت السائق.

يتوفّر "Alert" فقط في "NavigationTemplate". لإبلاغ المستخدم خارج "NavigationTemplate"، استخدام إشعار تنبيهي (HUN)، كما هو موضح في عرض الإشعارات

على سبيل المثال، يمكنك استخدام Alert لتنفيذ ما يلي:

  • إبلاغ السائق بتحديث ذي صلة بالتنقل الحالي، مثل التغيير في أحوال حركة المرور.
  • اطلب من السائق تحديث معلومات التنقّل الحالية، مثل وجود رادار سرعة متنقّل.
  • اقترِح مهمة قادمة واسأل السائق عما إذا كان يقبلها أم لا، مثل ما إذا كان السائق مستعدًا لاصطحاب شخص ما في طريقه.

يتكون Alert بشكل أساسي من عنوان و Alert والمدة الزمنية. يتم تمثيل المدة الزمنية بشريط تقدّم. (إجراء اختياري) يمكنك إضافة عنوان فرعي ورمز وما يصل إلى Action.

الشكل 2. تنبيه بشأن التنقّل ضمن السياق

بعد عرض 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 تتطابق مع احتياجات تطبيقك المدة المُقترَحة لعملية تنقُّل مدة 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 لا تفعل أي شيء. ولا يقدم استثناء.