عند توزيع تطبيقك على الأجهزة التي تعمل بنظام التشغيل Android Automotive، يجب مراعاة بعض الاعتبارات الخاصة بشكل الجهاز. يوضّح هذا الدليل هذه الاعتبارات.
اختبار تطبيقك الحالي على محاكي نظام التشغيل Android Automotive
لبدء إنشاء تطبيقك لنظام التشغيل Android Automotive، عليك أولاً اختبار تطبيقك الحالي على محاكي Android Automotive OS. لإعداد محاكي، اتّبِع الـ خطوات الواردة في مقالة الاختبار باستخدام محاكي نظام التشغيل Android Automotive. بعد ذلك، يمكنك تشغيل التطبيق باتّباع التعليمات الواردة في مقالة تشغيل تطبيقك على المحاكي.
عند تشغيل تطبيقك، ابحث عن مشاكل التوافق، مثل ما يلي:
- تكون شاشات نظام الترفيه والمعلومات ثابتة الاتجاه. لاستيفاء إرشادات جودة تطبيقات السيارات، يجب أن تتوافق التطبيقات مع الاتجاهين العمودي والأفقي.
- قد لا تتوفّر واجهات برمجة التطبيقات المتوفّرة على الأجهزة الأخرى على نظام التشغيل Android Automotive OS. على سبيل المثال، لا تتوفّر بعض واجهات برمجة التطبيقات لخدمات Google Play على نظام التشغيل Android Automotive. يُرجى الاطّلاع على قسم إيقاف الميزات لمعرفة التفاصيل حول كيفية معالجة هذه المشاكل.
ضبط ملف البيان الخاص بتطبيقك
لاستهداف الأجهزة التي تعمل بنظام التشغيل Android Automotive، يجب أن يتضمّن تطبيقك إدخالات بيان معيّنة. بعد الموافقة على التوزيع على الأجهزة التي تعمل بنظام التشغيل Android Automotive، يراجع Google Play التطبيقات المتوافقة للمساعدة في ضمان أنّها آمنة للاستخدام في السيارة. لمزيد من التفاصيل، يُرجى الاطّلاع على مقالة التوزيع على السيارات.
ميزات نظام التشغيل Android Automotive المطلوبة
يجب أن تستوفي جميع التطبيقات المُنشأة لنظام التشغيل Android Automotive متطلبات معيّنة ليتم توزيعها باستخدام Google Play. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة استيفاء متطلبات ميزات Google Play.
إدخالات البيان الخاصة بالفئة
بالإضافة إلى المتطلبات السابقة التي تنطبق على جميع التطبيقات المخصّصة للاستخدام أثناء توقّف السيارة، تتضمّن فئتا الفيديو والألعاب متطلبات إضافية:
- بالنسبة إلى تطبيقات الفيديو، يُرجى الاطّلاع على مقالة وضع علامة على تطبيقك باعتباره تطبيق فيديو.
- بالنسبة إلى الألعاب، يُرجى الاطّلاع على مقالة وضع علامة على تطبيقك باعتباره لعبة.
استيفاء متطلبات الحدّ من تشتيت انتباه السائق
يُعدّ تجنُّب تشتيت انتباه السائق أمرًا بالغ الأهمية عند توفير تطبيقك في السيارات. بالنسبة إلى
التطبيقات المخصّصة للاستخدام أثناء توقّف السيارة، يتم تحقيق ذلك بشكل أساسي من خلال منع استخدام تطبيقك أو تشغيل الصوت أثناء تفعيل القيود المفروضة على تجربة المستخدم
، كما هو موضّح في إرشادات الجودة DD-2 و
DD-3.
منع الاستخدام أثناء تفعيل القيود المفروضة على تجربة المستخدم
لا يمكن استخدام الأنشطة أو تشغيلها تلقائيًا أثناء تفعيل القيود المفروضة على تجربة المستخدم. لضمان تطبيق هذا السلوك على تطبيقك، يجب ألا يتضمّن العنصر
التالي <meta-data> في أي عنصر
<activity> ضمن ملف البيان
الخاص بك:
<!-- NOT ALLOWED -->
<meta-data
android:name="distractionOptimized"
android:value="true"/>
إذا تم استئناف نشاط في تطبيقك عند تفعيل القيود المفروضة على تجربة المستخدم، يتم إخفاؤه من خلال نشاط يملكه نظام التشغيل.
على الأقل، ينتقل نشاط تطبيقك إلى حالة دورة الحياة
إيقاف مؤقت. يحدث ذلك كطلب ردّ على دورة الحياة onPause يجب خلاله إيقاف تشغيل الفيديو والصوت من تطبيقك مؤقتًا.
على الأجهزة التي تتضمّن وضع التوافق مع Android Automotive OS ، يؤدي حظر النظام إلى انتقال أنشطة تطبيقك من حالة إيقاف مؤقت إلى حالة إيقاف.
إيقاف التشغيل ومنع استئنافه
بالنسبة إلى بعض التطبيقات، يكون إيقاف التشغيل مؤقتًا أثناء 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.
لا تكون القيم الأخرى ذات صلة إلا بالأنشطة التي تم وضع علامة عليها بأنّها محسّنة للحدّ من تشتيت الانتباه.
اختبار عملية التنفيذ
تأكَّد من أنّ تطبيقك يستوفي متطلبات الحدّ من تشتيت انتباه السائق باستخدام الإجراء التالي:
- ثبِّت تطبيقك على صورة نظام لا تتضمّن "متجر Google Play" أو وضع التوافق.
- عند فتح شبكة تطبيقات مشغّل التطبيقات، حاكِ القيادة و تأكَّد من أنّه لا يمكن فتح تطبيقك.
- توقَّف عن محاكاة القيادة وافتح تطبيقك على شاشة تشغيل وابدأ التشغيل.
- حاكِ القيادة مرة أخرى وتأكَّد من إيقاف التشغيل مؤقتًا.
- إذا كان تطبيقك يتكامل مع
MediaSession، استخدِمadb shell cmd media_session dispatch playوتأكَّد من عدم استئناف التشغيل.
- إذا كان تطبيقك يتكامل مع
تحسين تطبيقك لنظام التشغيل Android Automotive
لمنح المستخدمين أفضل تجربة ممكنة في السيارات، ضَع في اعتبارك ما يلي أثناء إنشاء تطبيقك لنظام التشغيل Android Automotive:
التعامل مع مساحات العرض الداخلية للنوافذ والحدود النهائية لشاشات العرض
كما هو الحال مع أشكال الأجهزة الأخرى، يتضمّن نظام التشغيل Android Automotive عناصر واجهة مستخدم النظام، مثل شريطَي الحالة والتنقّل، ويتوافق مع شاشات العرض غير المستطيلة.
تلقائيًا، يتم عرض التطبيقات في منطقة لا تتداخل مع أشرطة النظام أو الحدود النهائية لشاشات العرض. ومع ذلك، قد تريد أن يخفي تطبيقك أشرطة النظام، يعرض المحتوى خلفها أو يعرض المحتوى في صورة مقطوعة للشاشة كما هو موضّح في عرض تطبيقك ضمن مساحات العرض الداخلية للنوافذ. إذا كان تطبيقك ينفّذ أيًا من هذه الإجراءات، يُرجى الرجوع إلى الأقسام الفرعية التالية لمعرفة التفاصيل حول كيفية عمل تطبيقك بشكل جيد على مستوى النظام المتكامل للأجهزة التي تعمل بنظام التشغيل Android Automotive.
أشرطة النظام والوضع الغامر والعرض من الحافة إلى الحافة
قد يتم تغيير حجم أشرطة النظام وموضعها في السيارات بشكل مختلف عن أشكال الأجهزة الأخرى. على سبيل المثال، قد يتم وضع أشرطة التنقّل على يسار الشاشة أو يمينها أو أسفلها. حتى في حال وجود شريط حالة في أعلى الشاشة وشريط تنقّل في أسفلها (كما هو الحال مع معظم الهواتف والأجهزة اللوحية)، من المرجّح أن يكون حجم هذه العناصر أكبر بكثير في السيارات.
بالإضافة إلى ذلك، يتيح نظام التشغيل Android Automotive لمصنّعي المعدات الأصلية التحكّم في ما إذا كان بإمكان
التطبيقات عرض أشرطة النظام أو إخفاؤها للدخول إلى الوضع الغامر والخروج منه
mode. على سبيل المثال، من خلال منع التطبيقات من إخفاء أشرطة النظام، يمكن لمصنّعي المعدات الأصلية ضمان إمكانية الوصول دائمًا إلى عناصر التحكّم في السيارة، مثل عناصر التحكّم في المناخ، على الشاشة. إذا منع أحد مصنّعي المعدات الأصلية التطبيقات من
التحكّم في أشرطة النظام، لن يحدث أي شيء عندما يستدعي تطبيق واجهات برمجة التطبيقات
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:windowLayoutInDisplayCutoutMode
لمظهر تطبيقك theme أو في وقت التشغيل
من خلال تعديل السمة
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، قد لا تكون بعض الميزات والوظائف ذات صلة أو قد لا تكون متوفّرة. على سبيل المثال، لا تتيح السيارات بشكل عام الوصول إلى الكاميرات. بالإضافة إلى ذلك، لا تتوفّر على نظام التشغيل Android Automotive سوى مجموعة فرعية من خدمات Google Play. يُرجى الاطّلاع على مقالة خدمات 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، أو إذا لم يكن
متصلاً بسيارة على الإطلاق.
بالنسبة إلى ميزة "نافذة ضمن النافذة"، اتّبِع أفضل الممارسات المُحدّدة best practices للتحقّق مما إذا كانت الميزة متوفّرة والتفاعل بشكل مناسب.
التعامل مع السيناريوهات بلا إنترنت
على الرغم من أنّ السيارات أصبحت متصلة بالإنترنت بشكل متزايد، يُنصح بأن تتعامل التطبيقات مع التشغيل بدون اتصال بالإنترنت، مثل الحالات التالية:
- قد يختار المستخدمون عدم استخدام بيانات الجوّال المقدَّمة كجزء من حزمة اشتراك من الشركة المصنّعة للسيارة.
- قد يكون الوصول إلى بيانات الجوّال محدودًا في مناطق معيّنة.
- قد تكون السيارات التي تتضمّن أجهزة إرسال واستقبال Wi-Fi خارج نطاق شبكة Wi-Fi، أو قد يوقف أحد مصنّعي المعدات الأصلية شبكة Wi-Fi لصالح شبكة الجوّال.
استعدّ للتعامل مع هذه السيناريوهات في تطبيقك من خلال تقليل الوظائف التي تعتمد على الوصول إلى الإنترنت بشكل تدريجي، مثل توفير محتوى بلا إنترنت. لمزيد من المعلومات، يُرجى الاطّلاع على أفضل الممارسات لتحسين الشبكات.
استخدام موارد بديلة
للمساعدة في تكييف تطبيقك مع السيارات، يمكنك استخدام مؤهِّل الموارد car لتوفير موارد بديلة عند التشغيل على سيارة تعمل بنظام التشغيل Android Automotive. على سبيل المثال، إذا كنت تستخدم
موارد الأبعاد لتخزين
قيم مساحة العرض الداخلية، يمكنك استخدام قيمة أكبر لمجموعة موارد car لجعل
أهداف اللمس أكبر.