إضافة توافق مع نظام التشغيل Android Automotive إلى تطبيقك المتوقف

عند توزيع تطبيقك على الأجهزة التي تعمل بنظام التشغيل Android Automotive، هناك بعض الاعتبارات الفريدة المتعلقة بشكل الجهاز التي يجب أن تكون على دراية بها. ويوضّح هذا الدليل هذه الاعتبارات.

اختبار تطبيقك الحالي على محاكي "نظام التشغيل Android Automotive"

لبدء إنشاء تطبيقك لنظام التشغيل Android Automotive، عليك أولاً اختبار تطبيقك الحالي على محاكي نظام التشغيل Android Automotive. لإعداد محاكي، اتّبِع الخطوات الواردة في مقالة الاختبار باستخدام محاكي نظام التشغيل Android Automotive. يمكنك بعد ذلك تشغيل التطبيق باتّباع التعليمات الواردة في مقالة تشغيل التطبيق على المحاكي.

عند تشغيل تطبيقك، ابحث عن مشاكل التوافق، مثل ما يلي:

  • تكون اتجاهات شاشات نظام الترفيه والمعلومات ثابتة. لاستيفاء إرشادات جودة تطبيقات السيارات، يجب أن تكون التطبيقات متوافقة مع الاتجاهَين العمودي والأفقي.
  • قد لا تتوفّر واجهات برمجة التطبيقات المتاحة على الأجهزة الأخرى في نظام التشغيل Android Automotive. على سبيل المثال، بعض واجهات برمجة التطبيقات في "خدمات Google Play" غير متاحة على نظام التشغيل Android Automotive. يمكنك الاطّلاع على قسم إيقاف الميزات للحصول على تفاصيل حول كيفية التعامل مع هذه المشاكل.

ضبط ملف البيان الخاص بتطبيقك

لاستهداف الأجهزة التي تعمل بنظام التشغيل Android Automotive، يجب أن يتضمّن تطبيقك إدخالات معيّنة في ملف البيان. بعد الموافقة على توزيع تطبيقك على الأجهزة التي تعمل بنظام التشغيل Android Automotive، يراجع Google Play التطبيقات المتوافقة للمساعدة في ضمان أمان استخدامها في السيارة. لمزيد من التفاصيل، يُرجى الاطّلاع على مقالة التوزيع على السيارات.

ميزات "نظام التشغيل Android Automotive" المطلوبة

يجب أن تستوفي جميع التطبيقات المصمَّمة لنظام التشغيل Android Automotive متطلبات معيّنة ليتم توزيعها باستخدام Google Play. لمزيد من المعلومات، يُرجى الاطّلاع على استيفاء متطلبات ميزات Google Play.

إدخالات البيان الخاصة بالفئة

بالإضافة إلى المتطلبات السابقة التي تنطبق على جميع التطبيقات المتوقفة مؤقتًا، هناك متطلبات إضافية لفئتَي الفيديو والألعاب:

استيفاء متطلبات الحد من تشتت السائق

من المهم تجنُّب تشتت السائق عند إتاحة تطبيقك في السيارات. بالنسبة إلى التطبيقات المخصّصة للاستخدام أثناء ركن السيارة، يتم تحقيق ذلك بشكل أساسي من خلال منع استخدام تطبيقك أو تشغيل الصوت أثناء تفعيل قيود تجربة المستخدم (UX)، كما هو موضّح في إرشادات الجودة DD-2 وDD-3.

منع الاستخدام أثناء تفعيل قيود تجربة المستخدم

By default, activities cannot be used or launched while UX restrictions are active. لضمان تطبيق هذا السلوك على تطبيقك، يجب ألا يتضمّن عنصر <meta-data> التالي في أي عنصر <activity> ضمن ملف البيان:

<!-- NOT ALLOWED -->
<meta-data
  android:name="distractionOptimized"
  android:value="true"/>

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

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

على الأجهزة التي تتضمّن وضع التوافق مع نظام التشغيل Android Automotive، يؤدي حظر النظام إلى انتقال أنشطة تطبيقك من خلال الحالة "متوقّف مؤقتًا" إلى الحالة "متوقّف".

إيقاف التشغيل ومنع استئنافه

بالنسبة إلى بعض التطبيقات، يكفي إيقاف التشغيل مؤقتًا أثناء onPause() وتتبُّع الحالة لمنع استئناف التشغيل حتى onResume() لتلبية متطلبات تشتيت انتباه السائق.

إذا لم يكن التفاعل مع عمليات الاستدعاء في إحدى مراحل النشاط كافيًا لتطبيقك، يمكنك الاستماع إلى حالة قيود تجربة المستخدم مباشرةً كما هو موضّح في القسم التالي. على سبيل المثال، قد تفضّل التطبيقات التي تتيح ميزة نافذة ضمن النافذة الاستماع مباشرةً بدلاً من إجراء عمليات تحقّق شرطية في عمليات الاستدعاء في إحدى مراحل النشاط.

الاستماع إلى القيود المفروضة على تجربة المستخدم

للاستماع إلى قيود تجربة المستخدم، أضِف أولاً عنصرًا تابعًا لمكتبة android.car في ملف build.gradle الخاص بوحدة تطبيقك. هذه إضافة إلى حزمة تطوير البرامج (SDK) لنظام التشغيل Android توفّر واجهات برمجة تطبيقات مخصّصة لنظام التشغيل Android Automotive.

android {
    ...
    useLibrary("android.car")
}

استخدِم CarUxRestrictionsManager لقراءة حالة تقييد تجربة المستخدم. لا تحاول تحديد حالة قيود تجربة المستخدم من حالة جهاز آخر، مثل الترس أو السرعة، لأنّ قيود تجربة المستخدم قد تختلف من شاشة إلى أخرى داخل المركبة.

val car = Car.createCar(context) ?: return
val carUxRestrictionsManager =
    car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE) as? CarUxRestrictionsManager ?: return

// You can either read the state directly ...
val currentUxRestrictions = carUxRestrictionsManager.currentCarUxRestrictions

// or listen to state changes
carUxRestrictionsManager.registerListener { carUxRestrictions: CarUxRestrictions ->
    // Handle UX restrictions
}

// Don't forget to teardown and release resources when they're no longer needed
carUxRestrictionsManager.unregisterListener()
car.disconnect()

القيمة الوحيدة التي يوفّرها CarUxRestrictions ويشير إليها تطبيقك هي القيمة المعروضة من isRequiresDistractionOptimization. أما القيم الأخرى، فهي ذات صلة فقط بالأنشطة التي تم تصنيفها على أنّها متوافقة مع إرشادات تخفيف الإلهاء.

التحقق من نجاح العملية

تحقَّق من أنّ تطبيقك يستوفي متطلبات الحد من تشتت السائق باستخدام الإجراء التالي:

  1. ثبِّت تطبيقك على صورة نظام بدون "متجر Google Play" أو وضع التوافق.
  2. عند فتح شبكة التطبيقات في مشغّل التطبيقات، حاكِ القيادة وتأكَّد من أنّه لا يمكن فتح تطبيقك.
  3. أوقِف محاكاة القيادة وافتح تطبيقك على شاشة تشغيل وابدأ التشغيل.
  4. حاكِ القيادة مرة أخرى وتأكَّد من إيقاف التشغيل مؤقتًا.
    1. إذا كان تطبيقك يتوافق مع MediaSession، استخدِم adb shell cmd media_session dispatch play وتأكَّد من عدم استئناف التشغيل.

تحسين تطبيقك ليتوافق مع "نظام التشغيل Android Automotive"

لتوفير أفضل تجربة ممكنة للمستخدمين في السيارات، يجب مراعاة ما يلي أثناء إنشاء تطبيقك لنظام التشغيل Android Automotive:

التعامل مع الأجزاء المضمّنة في النافذة والصور المقطوعة للشاشة

كما هو الحال مع أشكال الأجهزة الأخرى، يتضمّن نظام التشغيل Android Automotive عناصر واجهة مستخدم النظام، مثل أشرطة الحالة والتنقّل، ويتيح استخدام الشاشات غير المستطيلة.

بشكل تلقائي، تعرض التطبيقات عناصر واجهة المستخدم في منطقة لا تتداخل مع أشرطة النظام أو الصور المقطوعة للشاشة. ومع ذلك، قد ترغب في أن يخفي تطبيقك أشرطة النظام أو يرسم المحتوى خلفها أو يعرض المحتوى في صورة مقطوعة للشاشة كما هو موضّح في تخطيط تطبيقك ضمن العناصر المضمّنة في النافذة. إذا كان تطبيقك ينفّذ أيًا من هذه الإجراءات، يُرجى الرجوع إلى الفقرات الفرعية التالية للحصول على تفاصيل حول كيفية السماح لتطبيقك بالعمل بشكل جيد على مستوى منظومة الأجهزة المتكاملة التي تعمل بنظام التشغيل Android Automotive.

أشرطة النظام والوضع المجسم والعرض حتى حافة الشاشة

قد يختلف حجم أشرطة النظام في السيارات وموضعها عن الأجهزة الأخرى. على سبيل المثال، قد يتم وضع أشرطة التنقل على يسار أو يمين أو أسفل الشاشة. حتى في حال وجود شريط حالة في الأعلى وشريط تنقّل في الأسفل (كما هو الحال مع معظم الهواتف والأجهزة اللوحية)، من المرجّح أن يكون حجم هذه العناصر أكبر بكثير في السيارات.

بالإضافة إلى ذلك، يتيح نظام التشغيل Android Automotive للمصنّعين الأصليين للأجهزة التحكّم في ما إذا كان بإمكان التطبيقات إظهار أشرطة النظام أو إخفاؤها للدخول إلى الوضع المجسم والخروج منه. على سبيل المثال، من خلال منع التطبيقات من إخفاء أشرطة النظام، يمكن للمصنّعين الأصليين للأجهزة ضمان إمكانية الوصول دائمًا إلى عناصر التحكّم في المركبة، مثل عناصر التحكّم في المناخ، على الشاشة. إذا منع المصنّع الأصلي للجهاز التطبيقات من التحكّم في أشرطة النظام، لن يحدث أي شيء عندما يستدعي أحد التطبيقات واجهات برمجة التطبيقات WindowInsetsController (أو WindowInsetsControllerCompat) لإظهار أشرطة النظام أو إخفائها. يُرجى الرجوع إلى مستندات show وhide لمعرفة المزيد حول كيفية رصد ما إذا كان تطبيقك قادرًا على تعديل الأجزاء المضمّنة.

وبالمثل، يمكن للمصنّعين الأصليين للأجهزة أيضًا التحكّم في ما إذا كان بإمكان التطبيقات ضبط لون أشرطة النظام وشفافيتها لضمان ظهور الأشرطة والعناصر الموجودة بداخلها بوضوح في جميع الأوقات. إذا كان تطبيقك يعرض المحتوى من الحافة إلى الحافة، تأكَّد من أنّه لا يعرض سوى المحتوى غير المُهم خلف أشرطة النظام. قد لا يظهر هذا المحتوى إذا كان المصنّع الأصلي للجهاز يمنع ضبط لون الأشرطة أو شفافيتها.

<!-- Depending on OEM configuration, these style declarations
     (and the corresponding runtime calls) may be ignored -->
<style name="...">
  <item name="android:statusBarColor">...</item>
  <item name="android:navigationBarColor">...</item>
  <item name="android:windowTranslucentStatus">...</item>
  <item name="android:windowTranslucentNavigation">...</status>
</style>

إذا كان تطبيقك يعرض المحتوى على الشاشة بأكملها، لا تضع افتراضات بشأن حجم أشرطة النظام أو عددها أو نوعها أو موقعها. بدلاً من ذلك، استخدِم واجهات برمجة التطبيقات الخاصة بالمساحات الداخلية للنوافذ لتخطيط محتوى تطبيقك بالنسبة إلى أشرطة النظام. يمكنك الاطّلاع على عرض المحتوى من الحافة إلى الحافة في تطبيقك لمزيد من التفاصيل حول كيفية استخدام واجهات برمجة التطبيقات هذه. لا يُنصح أبدًا باستخدام قيم المساحة المتروكة المضمّنة في الرمز البرمجي لأي شكل جهاز، ولكن في السيارات، من المحتمل ألا تعمل هذه القيم على إبقاء المحتوى في المنطقة الآمنة على الإطلاق.

التكيّف مع الشاشات ذات الأشكال غير المنتظمة

بالإضافة إلى الشاشات المستطيلة، قد تحتوي بعض المركبات على شاشات غير منتظمة الشكل، كما هو موضّح في الشكل 1:

جهاز يعمل بنظام التشغيل Android Automotive OS بشاشة منحنية على الجانب الأيمن
الشكل 1: جهاز يعمل بنظام التشغيل Android Automotive مع شاشة منحنية على الجانب الأيمن. تمثّل المنطقة الخضراء المستطيل الآمن الذي لا يتداخل مع المربّع المحيط بالصورة المقطوعة للشاشة المنحنية.

إذا لم يعرض تطبيقك المحتوى على كامل الشاشة، فلن تحتاج إلى اتخاذ أي إجراء لعرضه ضمن المنطقة الآمنة.

إذا كان تطبيقك يعرض المحتوى على كامل الشاشة، يمكنك اختيار طريقة تعامله مع الصور المقطوعة للشاشة. يمكنك تحقيق ذلك باستخدام الموارد من خلال ضبط سمة android:windowLayoutInDisplayCutoutMode لمظهر تطبيقك أو في وقت التشغيل من خلال تعديل سمة layoutInDisplayCutoutMode الخاصة بالنافذة.

بما أنّ أنواع الصور المقطوعة للشاشة المتوفّرة على الأجهزة التي تعمل بنظام التشغيل Android Automotive تختلف عن تلك المتوفّرة على الأجهزة الجوّالة، لا تستخدِم LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT أو LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES، لأنّ سلوكهما محسَّن للصور المقطوعة المتوفّرة على الأجهزة الجوّالة. بدلاً من ذلك، استخدِم LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER أو LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS لتجنُّب الجزء المقتطَع دائمًا أو الدخول إليه دائمًا. عند اختيار الخيار الأخير، يُرجى الاطّلاع على إتاحة الصور المقطوعة للشاشة للحصول على مزيد من التفاصيل حول واجهات برمجة التطبيقات ذات الصلة بالصور المقطوعة للشاشة.

إذا كان تطبيقك يعرض المحتوى في منطقة الصورة المقطوعة للشاشة وأردت أن يكون سلوكه مختلفًا بين نظام التشغيل Android Automotive والأجهزة الجوّالة، يمكنك الاطّلاع على إيقاف الميزات للحصول على إرشادات إذا كان تطبيقك يضبط هذا السلوك في وقت التشغيل، واستخدام موارد بديلة إذا كان تطبيقك يضبط هذا السلوك باستخدام ملفات الموارد.

إيقاف الميزات

إذا كنت تتيح تطبيقًا حاليًا للأجهزة الجوّالة على نظام التشغيل Android Automotive، قد لا تكون بعض الميزات والوظائف ذات صلة أو متاحة. على سبيل المثال، لا تتيح السيارات عادةً الوصول إلى الكاميرات. بالإضافة إلى ذلك، لا تتوفّر سوى مجموعة فرعية من "خدمات Google Play" على نظام التشغيل Android Automotive. يُرجى الاطّلاع على خدمات Google Play للسيارات لمزيد من التفاصيل.

يمكنك استخدام واجهة برمجة التطبيقات PackageManager.hasSystemFeature لرصد ما إذا كان التطبيق يعمل على نظام التشغيل Android Automotive من خلال التحقّق من ميزة FEATURE_AUTOMOTIVE، كما هو موضّح في المثال التالي:

val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
if (isCar) {
    // Enable or disable a given feature
}

بدلاً من ذلك، إذا كان تطبيقك يتضمّن أيضًا مكوّن Android Auto، يمكنك استخدام واجهة برمجة التطبيقات CarConnection من مكتبة تطبيقات Android للسيارات لرصد ما إذا كان التطبيق يعمل على نظام التشغيل Android Automotive أو Android Auto، أو ما إذا كان غير متصل بسيارة على الإطلاق.

بالنسبة إلى ميزة &quot;نافذة ضمن النافذة&quot; (PiP)، اتّبِع أفضل الممارسات المحدّدة للتحقّق مما إذا كانت الميزة متاحة واتّخاذ الإجراء المناسب.

التعامل مع سيناريوهات عدم الاتصال بالإنترنت

على الرغم من أنّ السيارات أصبحت متصلة بالإنترنت بشكل متزايد، يُنصح بأن تكون التطبيقات قادرة على العمل بدون اتصال بالإنترنت، كما في الحالات التالية:

  • قد يختار المستخدمون إيقاف بيانات الجوّال المقدَّمة كجزء من حزمة اشتراك من الشركة المصنّعة للسيارة.
  • قد يكون الوصول إلى بيانات الجوّال محدودًا في مناطق معيّنة.
  • قد تكون السيارات المزوّدة بأجهزة راديو Wi-Fi خارج نطاق شبكة Wi-Fi، أو قد يوقف المصنّع الأصلي للجهاز شبكة Wi-Fi لصالح شبكة الجوّال.

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

استخدام مراجع بديلة

للمساعدة في تكييف تطبيقك مع السيارات، يمكنك استخدام مؤهِّل الموارد car لتوفير موارد بديلة عند تشغيل التطبيق على مركبة مزوّدة بنظام التشغيل Android Automotive. على سبيل المثال، إذا كنت تستخدم موارد الأبعاد لتخزين قيم المساحة المتروكة، يمكنك استخدام قيمة أكبر لمجموعة الموارد car لجعل مساحات اللمس أكبر.