عند توزيع تطبيقك على أجهزة Android Automotive، هناك بعض الاعتبارات الفريدة لشكل الجهاز والتي يجب أن تكون على دراية بها. يوضّح هذا الدليل تلك الاعتبارات.
اختبار تطبيقك الحالي على محاكي نظام التشغيل Android Automotive
لبدء إنشاء تطبيقك لنظام التشغيل Android Automotive، عليك أولاً اختبار تطبيقك الحالي على محاكي نظام التشغيل Android Automotive. لإعداد محاكي، اتّبِع خطوات الاختبار باستخدام محاكي نظام التشغيل Android Automotive. يمكنك بعد ذلك تشغيل التطبيق باتّباع التعليمات الواردة في مقالة تشغيل تطبيقك على المحاكي.
عند تشغيل تطبيقك، انتبه إلى مشاكل التوافق، مثل المشاكل التالية:
- تكون اتجاهات شاشات المعلومات والترفيه ثابتة. لاستيفاء إرشادات جودة تطبيقات السيارات، يجب أن تتيح التطبيقات وضعي الشاشة عموديًا وأفقيًا.
- قد لا تتوفّر واجهات برمجة التطبيقات المتوفّرة على الأجهزة الأخرى على نظام التشغيل Android Automotive. على سبيل المثال، لا تتوفّر بعض واجهات برمجة التطبيقات في "خدمات Google Play" على نظام التشغيل Android Automotive. يُرجى الاطّلاع على قسم إيقاف الميزات للتعرّف على تفاصيل حول كيفية التعامل مع هذه المشاكل.
ضبط ملف بيان تطبيقك
لاستهداف أجهزة Android Automotive، يجب أن يتضمّن تطبيقك إدخالات بيان معيّنة. بعد الموافقة على النشر على أجهزة Android Automotive، تتم مراجعة التطبيقات المتوافقة يدويًا للمساعدة في التأكّد من أنّها آمنة للاستخدام في السيارة. اطّلِع على النشر على السيارات لمزيد من التفاصيل.
ميزات نظام التشغيل 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()
lifecycle
callback يجب خلاله إيقاف تشغيل الفيديو والصوت مؤقتًا من
تطبيقك.
على الأجهزة التي تتضمّن وضع التوافق مع نظام التشغيل Android Automotive، يؤدي حظر النظام إلى انتقال أنشطة تطبيقك من الحالة متوقف مؤقتًا إلى الحالة متوقف.
إيقاف التشغيل ومنع استئناف التشغيل
في بعض التطبيقات، يكون إيقاف التشغيل مؤقتًا أثناء onPause()
وتتبُّع الحالة لمنع استئناف التشغيل إلى أن onResume()
كافيًا لاستيفاء متطلبات عدم الإلهاء أثناء القيادة.
إذا لم يكن التفاعل مع عمليات الاستدعاء المتعلّقة بمراحل نشاط التطبيق كافيًا لتطبيقك، يمكنك الاستماع إلى حالة القيود المفروضة على تجربة المستخدم مباشرةً كما هو موضّح في القسم التالي. على سبيل المثال، قد تفضّل التطبيقات التي تتيح ميزة نافذة ضمن النافذة الاستماع مباشرةً بدلاً من إجراء عمليات تحقّق مشروطة في عمليات الاستدعاء لأحداث دورة النشاط.
الاستماع إلى القيود المفروضة على تجربة المستخدم
للاستماع إلى قيود تجربة المستخدم، أضِف أولاً تبعية لمكتبة
android.car
في ملف build.gradle
الخاص بوحدة تطبيقك.
هذه إضافة إلى حزمة تطوير البرامج (SDK) لنظام التشغيل Android تقدّم واجهات برمجة تطبيقات خاصة
بنظام التشغيل Android Automotive.
android {
...
useLibrary("android.car")
}
استخدِم CarUxRestrictionsManager
لقراءة حالة القيود المفروضة على تجربة المستخدم. لا
تحاول تحديد حالة القيود المفروضة على تجربة المستخدم من حالة الأجهزة الأخرى
مثل الترس أو السرعة، لأنّ القيود المفروضة على تجربة المستخدم قد تختلف من شاشة إلى أخرى
داخل المركبة.
val car = Car.createCar(context)
val carUxRestrictionsManager =
car.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE) as CarUxRestrictionsManager
// You can either read the state directly ...
val currentUxRestrictions = carUxRestrictionsManager.currentUxRestrictions
// or listen to state changes
carUxRestrictionsManager.registerListener { carUxRestrictions: CarUxRestrictions -> ...}
// 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
وتأكَّد من عدم استئنافPlayback.
- إذا كان تطبيقك يتيح الدمج مع
تحسين تطبيقك لنظام التشغيل Android Automotive
لتقديم أفضل تجربة ممكنة للمستخدمين في السيارات، يُرجى مراعاة ما يلي عند إنشاء تطبيقك لنظام التشغيل Android Automotive:
العمل مع النوافذ المضمّنة وفتحات الشاشة
كما هو الحال مع أشكال الأجهزة الأخرى، يتضمّن نظام التشغيل Android Automotive عناصر واجهة مستخدم النظام، مثل شريطَي الحالة والتنقّل، وإمكانية استخدام الشاشات غير المستطيلة.
ترسم التطبيقات المحتوى تلقائيًا في منطقة لا تتداخل مع أشرطة النظام أو أجزاء الشاشة المخصّصة للكاميرا. ومع ذلك، قد تريد أن يخفي تطبيقك أشرطة النظام أو يرسم المحتوى خلفها أو يعرض المحتوى في مساحة مخصّصة للعرض على الشاشة كما هو موضّح في مقالة تنسيق تطبيقك ضمن مساحات مخصّصة للعرض على الشاشة. إذا كان تطبيقك ينفّذ أيًا من هذه الإجراءات، يمكنك الرجوع إلى الأقسام الفرعية التالية للحصول على تفاصيل عن كيفية السماح لتطبيقك بالعمل بشكل جيد على مستوى المنظومة المتكاملة لأجهزة Android Automotive.
أشرطة النظام والوضع المجسم والعرض من الحافة إلى الحافة
قد يختلف حجم أشرطة النظام في السيارات عن أحجامها في أشكال الأجهزة الأخرى. على سبيل المثال، يمكن وضع أشرطة التنقّل على يمين الشاشة أو يسارها أو أسفل الشاشة. حتى في حال توفّر شريط حالة فيверху وشريط تنقّل في أسفل الشاشة (كما هو الحال في معظم الهواتف و أجهزة التابلت)، من المرجّح أن يكون حجم هذه العناصر أكبر بكثير في السيارات.
بالإضافة إلى ذلك، يتيح نظام التشغيل Android Automotive لمصنّعي السيارات الأصليين التحكّم في ما إذا كان بإمكان التطبيقات عرض أشرطة النظام أو إخفاؤها للدخول إلى الوضع immersive
والخروج منه. على سبيل المثال، من خلال منع التطبيقات من
إخفاء أشرطة النظام، يمكن لمصنّعي السيارات الأصليين ضمان إمكانية الوصول دائمًا إلى عناصر التحكّم في المركبة، مثل عناصر التحكّم في
المناخ. إذا منع المصنّع الأصلي للجهاز التطبيقات من التحكّم في أشرطة النظام، لن يحدث أي شيء عندما يستدعي أحد التطبيقات واجهات برمجة التطبيقات
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
لمظهر تطبيقك أو في وقت التشغيل
من خلال تعديل سمة
layoutInDisplayCutoutMode
النافذة.
بما أنّ أنواع الفتحات في الشاشة على أجهزة Android Automotive OS
تختلف عن تلك الموجودة على الأجهزة الجوّالة، لا تستخدِم
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
، كما هو موضّح في المثال التالي:
Kotlin
val packageManager: PackageManager = ... // Get a PackageManager from a Context val isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE) if (isCar) { // Enable or disable a given feature }
Java
PackageManager packageManager = ... // Get a PackageManager from a Context boolean isCar = packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE) if (isCar) { // Enable or disable a given feature }
كحل بديل، إذا كان تطبيقك يتضمّن أيضًا مكوّن Android Auto، يمكنك
استخدام واجهة برمجة التطبيقات CarConnection
من
مكتبة تطبيقات "Android للسيارات" لرصد ما إذا كان التطبيق يعمل
بنظام التشغيل Android Automotive أو Android Auto، أو ما إذا لم يكن متصلاً
بسيارة على الإطلاق.
بالنسبة إلى ميزة "صورة في صورة"، اتّبِع أفضل الممارسات المتّبعة للتحقّق مما إذا كانت الميزة متاحة والتصرّف وفقًا لذلك.
التعامل مع سيناريوهات الاستخدام بلا إنترنت
مع تزايد اتصال السيارات بالإنترنت، يُنصح بأن تتمكّن التطبيقات من التشغيل بدون اتصال بالإنترنت، مثل الحالات التالية:
- يمكن للمستخدمين إيقاف بيانات الجوّال المقدَّمة كجزء من اشتراك في حزمة من الشركة المصنّعة للسيارات.
- قد يكون الوصول إلى بيانات الجوّال محدودًا في مناطق معيّنة.
- قد تكون السيارات المزوّدة براديو Wi-Fi خارج نطاق شبكة Wi-Fi، أو قد يُوقف المصنّع الأصلي للسيارة شبكة Wi-Fi ليستخدم شبكة الجوّال بدلاً منها.
يجب أن تكون مستعدًا للتعامل مع هذه السيناريوهات في تطبيقك من خلال إيقاف وظائفه التي تعتمد على الاتصال بالإنترنت بشكل سلس، مثل توفير محتوى بدون اتصال بالإنترنت. لمزيد من المعلومات، اطّلِع على أفضل الممارسات لتحسين الشبكات.
استخدام موارد بديلة
للمساعدة في تكييف تطبيقك للسيارات، يمكنك استخدام car
معرّف الموارد لتوفير موارد بديلة
عند تشغيل التطبيق على سيارة تعمل بنظام التشغيل Android Automotive. على سبيل المثال، إذا كنت تستخدِم
موارد السمات لتخزين
قيم الحشو، يمكنك استخدام قيمة أكبر لمجموعة الموارد car
لجعل
استهدافات اللمس أكبر.