مع انتشار الشاشات داخل السيارات التي تعمل بنظامَي Android Auto وAndroid Automotive، يواجه المطوّرون تحديًا مزدوجًا فريدًا من نوعه: تقديم تجارب غنية وقابلة للتكيّف أثناء توقّف السيارة، وتجارب آمنة للسائقين تعتمد على النماذج أثناء القيادة. في هذه الجلسة الفنية الشاملة التي تبلغ مدتها 30 دقيقة، نستكشف البنية الشاملة وأساليب التطوير لتكييف تطبيقات Android مع السيارات.
ستتعرّف على كل ما تحتاج إليه لتشغيل تطبيقك في السيارة، بدءًا من أساسيات تصميم التطبيقات للاستخدام في السيارات، ووصولاً إلى أحدث الأساليب لإنشاء تجارب وسائط تنتقل من الصوت إلى الفيديو عندما تنتقل السيارة من وضع القيادة إلى وضع الركن.
النص
حسنًا.
مرحبًا بالجميع.
شكرًا لانضمامكم إلينا في هذه الجلسة، "السيارة هي لوحتك الفنية".
تتناول هذه الجلسة كيفية تطوير تطبيقات Android للسيارات.
اسمي "بول لاميرتسما".
وأنا "توماس ويذرز".
نحن مهندسو علاقات المطوّرين في فريق "Android للسيارات".
أنا متأكد من أنّ الكثير منكم قد قضى الكثير من الوقت والجهد للتأكّد من أنّ تطبيقاته تبدو رائعة وتعمل بشكل جميل على مجموعة متنوعة من الشاشات والأجهزة المختلفة، والهواتف والأجهزة القابلة للطي والأجهزة اللوحية وما إلى ذلك.
اليوم، سنركّز على شاشة قد لا تكون فكّرت فيها.
ويمكن أن يساعدك في الوصول إلى المستخدمين بطريقة فريدة.
هذه هي الشاشة داخل السيارة.
لنبدأ بلمحة موجزة عمّا نعنيه عندما نتحدّث عن Android للسيارات.
Android للسيارات ليس نظامًا واحدًا متكاملاً.
هناك منصتان يمكنك استهدافهما.
أولاً، هناك Android Auto، وهو نظام عرض يعمل بالهاتف.
باستخدام Android Auto، يتم تنفيذ التطبيق على هاتفك وعرض واجهة المستخدم الخاصة به على شاشة السيارة باستخدام اتصال سلكي أو لاسلكي.
ثانيًا، هناك نظام التشغيل Android Automotive، وهو إصدار من Android يعمل مباشرةً على المركبة نفسها.
يعمل نظام التشغيل Android Automotive بشكل مستقل عن الهاتف، ويمكنه الوصول مباشرةً إلى أجهزة المركبة، مثل التحكّم في المناخ والراديو، والأهم من ذلك أنّه يدير أيضًا اتصال البيانات الخاص به.
هناك مجموعة فرعية من السيارات التي تعمل بنظام التشغيل Android Automotive، وهي السيارات المزوّدة بتجربة Google المتكاملة.
تتضمّن السيارات "مع تجربة Google المتكاملة" أيضًا تطبيقات Google وخدماتها، مثل "متجر Play" وGemini و"خرائط Google".
على الرغم من وجود منصتَين، فإنّ هدفنا هو تسهيل عملية إنشاء التطبيقات مرة واحدة ونشرها لتقديم تجارب رائعة على كلتا المنصتَين.
إليك مثال على تطبيق وسائط تم إنشاؤه مرة واحدة باستخدام "مكتبة تطبيقات السيارات"، وكيف سيبدو على كل من Android Auto ونظام التشغيل Android Automotive، على مجموعة من أحجام وأشكال الشاشات المختلفة.
هناك العديد من أنواع الأجهزة والأسطح المختلفة التي يمكنك إنشاؤها.
وهذا يطرح السؤال التالي: لماذا إذًا للسيارات؟
أولاً، النطاق هنا كبير جدًا.
هناك اليوم أكثر من 250 مليون سيارة متوافقة مع Android Auto وأكثر من 100 طراز من السيارات مع تجربة Google المتكاملة من 16 علامة تجارية مختلفة.
وعندما تكون تطبيقاتك في السيارات، يمكنك الوصول إلى المستخدمين أثناء تنقلاتهم اليومية، ومن وإلى الأنشطة العائلية، وأثناء أداء المهام، وحتى في الرحلات البرية.
في الولايات المتحدة، وفقًا لاستطلاع الرأي الأمريكي حول القيادة لعام 2024 من جمعية السيارات الأمريكية (AAA)، يقضي السائقون في المتوسط 60 دقيقة يوميًا خلف عجلة القيادة.
ولكن لا يقتصر الأمر على الوصول إلى المستخدمين أثناء قيادتهم السيارة.
وتصل إليهم أيضًا عندما تكون سياراتهم متوقفة.
لنفترض أنّهم يشحنون مركباتهم في محطة شحن للمركبات الكهربائية، أو أنّهم ينتظرون في صف انتظار اصطحاب الطلاب من المدرسة.
ومع زيادة استخدام الشاشات المخصّصة للركاب، نتوقّع أن تتوفر المزيد من الفرص في المستقبل لتعزيز تفاعل المستخدمين.
حسنًا.
لنطّلِع الآن على أنواع التجارب المختلفة التي يمكنك إنشاؤها للسيارات.
لفهم كيفية إنشاء تطبيقات للسيارات، من المفيد فهم الحالتَين الرئيسيتَين للتطبيقات أثناء تشغيلها داخل السيارة.
أولاً، هناك تطبيقات تستخدمها أثناء القيادة.
وهي تجارب محسَّنة للقيادة يمكن استخدامها أثناء تحرّك المركبة.
ويشمل ذلك التطبيقات في الفئات التي تظهر هنا على الشاشة، مثل التطبيقات الصوتية التي نشير إليها عادةً باسم تطبيقات الوسائط، وتطبيقات المراسلة والتواصل، وتطبيقات التنقّل، وما إلى ذلك.
يجب أن تلتزم التجارب المحسّنة للقيادة بمعايير صارمة للحماية من تشتيت الانتباه.
هناك اعتبارات خاصة لكيفية إنشاء واجهة مستخدم لتطبيق بحيث يمكن استخدامه بأمان أثناء حركة المركبة.
هناك طريقتان مختلفتان لإنشاء تطبيقات محسّنة للقيادة.
ولكن في هذه المحاضرة، سنركّز تحديدًا على استخدام "مكتبة تطبيقات السيارات".
وهي مجموعة من مكتبات Jetpack التي توفّر إطار عمل مستندًا إلى نماذج يقدّم واجهات مستخدم محسّنة للقيادة، مع الاهتمام أيضًا بالتكيّف مع إعدادات الأجهزة المختلفة المتوفّرة في السيارات.
لذا، فكِّر في طرق الإدخال وأحجام الشاشات ونِسب العرض إلى الارتفاع.
على الرغم من أنّ هذه ليست الطريقة الوحيدة لإنشاء تجارب محسّنة للقيادة في السيارات، فإنّ النهج الذي أريد التركيز عليه في هذه المحاضرة هو الإنشاء باستخدام مكتبة تطبيقات Android للسيارات.
غالبًا ما نطلق على هذا CAL للاختصار.
كما ذكرتُ قبل قليل، Car App Library هي مجموعة من المكتبات التي تساعد في إنشاء تطبيقاتك لاستخدامها في المركبات.
وهو إطار عمل يستند إلى نماذج ويوفر واجهات مستخدم محسّنة للقيادة، مع التعامل مع مهمة التكيّف مع إعدادات الأجهزة المختلفة.
ويمكنك إنشاء تطبيقك وأنت على ثقة من أنّه سيعمل بشكل جيد على جميع هذه الإعدادات المختلفة، سواء كانت تعمل بنظام Android Auto أو نظام التشغيل Android Automotive.
يمكن للتطبيقات التي يتم إنشاؤها باستخدام CAL الاعتماد على بنية عميل المضيف هذه.
التطبيق المضيف هو عارض النظام، وهو إما Android Auto نفسه أو Google Automotive App Host في السيارات مع تجربة Google المتكاملة.
وهو يتحكّم في النهاية في ما يجب عرضه للمستخدم على شاشته.
لذلك، بصفتك مطوّر التطبيق، لن ترسم وحدات البكسل في النهاية.
بدلاً من ذلك، يتم إدخال البيانات المنظَّمة وحالة البيانات إلى نماذج مكتبة تطبيقات السيارات.
ويأخذ هذا المضيف هذه البيانات ويعرضها بأمان وبطريقة متوافقة مع معايير السلامة، مع تنسيق يقلّل من تشتيت الانتباه.
لنلقِ نظرة على الفئات ضمن مكتبة CAL، وما تحتاج إلى توسيعه لإنشاء تطبيقك، بدءًا من CarAppService.
هذه فئة فرعية من خدمة Android تعمل كنقطة دخول للتطبيقات المضيفة للتواصل مع تطبيقات العملاء، والغرض منها هو إنشاء نُسخ من الجلسات يتفاعل معها المضيف بعد ذلك.
يمكنك اعتبار الجلسة نسخة من تطبيق عميل يعمل على شاشة في المركبة.
ومثل مكوّنات Android الأخرى، يتضمّن هذا المكوّن دورة حياة خاصة به يمكن استخدامها لإعداد الموارد المستخدَمة طوال فترة وجود مثيل الجلسة وإزالتها.
هذه علاقة واحد لمتعدد بين CarAppService وجلسة.
على سبيل المثال، قد يتضمّن CarAppService جلستَين، إحداهما للشاشة الأساسية والأخرى لشاشة مجموعة العدادات لتطبيقات التنقّل التي تتوافق مع شاشات مجموعة العدادات.
إليك مثال على ذلك، حيث تحتوي السيارة على شاشة عرض أساسية وشاشة عرض مجموعة العدادات، وكل شاشة مرتبطة بجلسة مخصّصة، وهذه هي الطريقة التي يمكنك من خلالها، كمطوّر تطبيقات، دعم المركبات التي تحتوي على شاشات متعددة.
بعد ذلك، تكون نُسخ الشاشة مسؤولة عن إنشاء واجهات المستخدم التي تعرضها التطبيقات المضيفة ضمن الجلسة.
يتم تمثيل واجهات المستخدم هذه من خلال فئات النماذج التي يمثّل كل منها نوعًا معيّنًا من التنسيق، ويمكن أن يكون، على سبيل المثال، شبكة أو قائمة.
لذلك، تدير كل جلسة حزمة من نُسخ الشاشات التي تتعامل مع مسارات المستخدمين في أجزاء مختلفة من تطبيقك، وكما هو الحال مع الجلسة، فإنّ الشاشة لها رحلة مستخدم خاصة بها يمكنك ربطها بها.
ولكن لمجرد أنّ المضيف يعرض واجهة المستخدم، وأنّك تستخدم نماذج مكتبة تطبيقات السيارات، لا يعني ذلك أنّك مقيّد بشدة أو أنّه لا يمكنك تخصيص تطبيقك.
هناك مجموعة كبيرة من النماذج والمكوّنات التي يمكنك استخدامها، ويمكنك أيضًا المزج بينها للحصول على التجربة التي تريدها.
هناك نماذج للأغراض العامة يمكن استخدامها من خلال جميع أنواع التطبيقات ضمن مكتبة تطبيقات السيارات، وهناك نماذج للأغراض الخاصة مخصّصة لتجارب تطبيقات معيّنة، مثل التنقّل أو نقاط الاهتمام.
ولكن قبل الخوض في تفاصيل إنشاء تجارب محسّنة للقيادة، أريد أن أتناول الحالة الأخرى التي يمكنك فيها تشغيل التطبيقات في السيارات: عندما تكون السيارة متوقفة.
هناك فئات معيّنة من التطبيقات التي لا يمكن استخدامها إلا أثناء ركن المركبة، ويشمل ذلك تطبيقات الفيديو والألعاب والمتصفّحات.
ولكن عندما تكون السيارة متوقفة، يتم رفع إرشادات تشتيت السائق، ويمكنك تقديم تجارب أكثر توافقًا مع واجهة المستخدم التكيُّفية الحالية.
تستند التطبيقات المتوقفة مؤقتًا إلى الأنشطة، وهي مشابهة للأنشطة التي يتم استخدامها على الأجهزة الأخرى، مثل الهواتف أو الأجهزة اللوحية، أو حتى مماثلة لها، وسنتحدث عن التطبيقات المتوقفة مؤقتًا بالتفصيل في القسم التالي.
على الرغم من أنّ تجارب التطبيقات أثناء ركن السيارة تعيد استخدام الأنشطة التكيُّفية الحالية، لا تزال هناك إرشادات جودة خاصة بالسيارات يجب الالتزام بها، بدءًا من بيانات البيان والصور المقطوعة للشاشة وحتى إيقاف التشغيل مؤقتًا عندما تبدأ السيارة في التحرك.
وللمساعدة في تنفيذ هذا العمل آليًا، أطلقنا ميزة جديدة على Android للتطبيقات المتوقفة مؤقتًا.
لذا، قبل البدء، تأكَّد من تثبيت واجهة سطر الأوامر (CLI) لنظام التشغيل Android، ويمكنك العثور عليها من خلال هذا الرابط المختصر.
بعد ذلك، وبعد إعداد ذلك، يمكنك تشغيل android skills list لاستكشاف المهارات المتاحة.
android skills list
android skills add android-for-cars-parked-appsهناك مجموعة كاملة من المهارات المختلفة التي يمكنك استخدامها فعليًا للانتقال بتطوير تطبيقات Android إلى المستوى التالي.
وبالنسبة إلى Android للسيارات تحديدًا، يمكنك استخدام android skills add android-for-cars-parked-apps لإضافة المهارة إلى سياق الوكيل.
الآن، أيًا كان وكيل الذكاء الاصطناعي المفضّل لديك، سيقدّم لك إرشادات مفصّلة لضبط ملف البيان لتطبيقك على Android Auto أو نظام التشغيل Android Automotive، والتعامل مع هوامش نافذة السيارة وأمور مثل التنقّل للخلف، وفرض قيود التشغيل لتجنّب تشتيت السائق، ويمكنه أيضًا مراجعة تطبيق الفيديو أو اللعبة أو المتصفّح قبل إرسالها إلى Google Play.
لذا، فإن إنشاء تطبيقات للسيارات يعد أيضًا أمرًا فريدًا بعض الشيء بسبب فكرة فئات التطبيقات هذه.
كما ذكرتُ سابقًا، هناك فئات معيّنة من التطبيقات يمكن استخدامها أثناء القيادة، وهناك فئات أخرى يمكن استخدامها أثناء توقّف السيارة.
هذه الفئات المميّزة هي التي يمكن استخدامها أثناء القيادة.
يُشار إلى بعض هذه التطبيقات بالاختصار CAL، وهو يشير إلى "مكتبة تطبيقات السيارات"، وتستخدم التطبيقات في هذه الفئة نماذج مثل تلك التي رأيناها قبل قليل.
سأستعرض هذه النقاط بسرعة، ولن أخوض في الكثير من التفاصيل.
لنبدأ بتطبيقات الموسيقى، وهي التطبيقات التي تشغّل الصوت وليس الفيديو.
هناك طريقتان لإنشائها.
الخيار الأول في الأعلى، والمشار إليه باسم MediaBrowserService، هو أحد أبسط الخيارات.
ما تفعله هو تقديم بيانات وصفية، بينما تتولى واجهة شاشة نظام المعلومات والترفيه بالكامل عرض واجهة مستخدم مشغّل الوسائط ومتصفّح الوسائط بطريقة محسّنة للسيارة.
الخيار الآخر هو إنشاء تطبيقات موسيقى باستخدام مكتبة تطبيقات السيارات، ما يمنحك مزيدًا من التحكّم والخيارات لتخصيص طريقة تصميم تطبيقات الموسيقى وعرضها، وسيعرض لنا "توماس" المزيد من المعلومات حول ذلك بعد قليل.
تُعدّ تطبيقات التنقّل من أبرز حالات الاستخدام، إذ توفّر المسارات والاتّجاهات المفصّلة.
وتندرج أيضًا تطبيقات سائقي المركبات التشاركية ضمن هذه الفئة.
تساعدك تطبيقات نقاط الاهتمام في العثور على مواقع جغرافية مفيدة قريبة منك، مثل شواحن المركبات الكهربائية أو مواقف السيارات.
تتيح لك تطبيقات إنترنت الأشياء (IoT) الوصول إلى الأجهزة الذكية أثناء التنقّل، مثل إدارة المنزل.
وتتوفّر أيضًا تطبيقات الطقس التي يمكنها تنفيذ إجراءات مثل توفير رادار في الوقت الفعلي وتنبيهات بالعواصف وتوقعات خاصة بالموقع الجغرافي.
وأخيرًا، تنقسم فئة التواصل إلى ثلاث فئات فرعية: توسيع نطاق الإشعارات الأساسية لتشمل السيارة، أو تطبيقات المراسلة ومكالمات الفيديو.
بعد ذلك، هناك الفئات المتوقفة مؤقتًا: تطبيقات بث الفيديو والألعاب ومتصفحات الويب.
يسرّني أن أعلن أنّه منذ بضعة أسابيع، أصبح بإمكان جميع المطوّرين نشر الألعاب على Android Auto ونظام التشغيل Android Automotive.
ستلاحظ أنّ بعض هذه الفئات تحمل التصنيف "مفتوحة"، والبعض الآخر يحمل التصنيف "في الإصدار التجريبي"، والبعض الآخر يحمل التصنيف "ستتوفّر قريبًا".
تعني كلمة "مفتوحة" أنّه يمكن لأي مطوّر إرسال تطبيق في هذه الفئة مباشرةً إلى قناة الإصدار العلني.
يعني الإصدار التجريبي أنّه يمكنك نشر التطبيق في قنوات الاختبار الداخلي أو المغلق، ولكن لا يمكن نشره في قناة الإصدار العلني ما لم يتم قبولك في برنامج استخدام المنتج قبل إطلاقه.
تتضمّن المستندات الخاصة بكل فئة من هذه الفئات مزيدًا من المعلومات ورابطًا لنموذج إبداء الاهتمام.
أما الفئات التي تندرج ضمن "ستتوفّر قريبًا"، فهي غير متاحة حاليًا، ولكننا نخطط لإتاحتها في المستقبل.
في النهاية، هدفنا هو توحيد المنصة.
نريد أن نتيح لك إنشاء التطبيقات والوصول إلى أكبر عدد من المستخدمين من خلال كتابة الرمز البرمجي مرة واحدة وتوزيعه على كل من Android Auto ونظام التشغيل Android Automotive، بغض النظر عن الفئة.
والآن، سيتحدث "توماس" عن الوسائط.
مع أطيب التحيات،
رائع.
لذلك، طرحنا في العام الماضي الإصدار 1.8 من مكتبة Car App Library لتطبيقات الموسيقى، ما أتاح واجهات مستخدم نموذجية للتصفّح وإجراءات مخصّصة في Android Auto.
وشمل ذلك نموذج تشغيل الوسائط الذي يظهر هنا على اليمين.
في مؤتمر Google I/O لهذا العام، قدّمنا المزيد من واجهات المستخدم القابلة للتصفّح من خلال الإصدار 1.9 من Car App Library.
لذلك، مع وصول الإصدار 1.9 من CAL إلى المرحلة التجريبية، يمكنك الآن الاستفادة من تحديثات الميزات الرئيسية في نظامَي التشغيل Auto وAutomotive.
تشمل الميزات البارزة إمكانية تخصيص العلامة التجارية من خلال ميزة "التعبير عن التطبيق"، ما يتيح لك تخصيص رموز الألوان والأشكال باستخدام تنسيقات يعرضها المضيف مع الحفاظ على قواعد الأمان، بالإضافة إلى مكوّنات جديدة لواجهة المستخدم مثل أقسام "تحت الضوء" وعناصر القائمة المكثّفة والشرائح القابلة للتمرير والمشغّل المصغّر الثابت.
بالإضافة إلى ذلك، يوسّع الإصدار 1.9 من CAL نطاق دعم نماذج الوسائط بالكامل ليشمل AAOS، ما يؤدي إلى توحيد المنصة بشكل حقيقي في كلا المنظومتَين المتكاملتَين.
سنطرح قريبًا الإصدار 10 من Car App Library.
سيوفّر الإصدار 10 من CAL المزيد من النماذج المخصّصة لتطبيقات التواصل، ما يمنح تجارب اتصال أكثر فعالية وتخصيصًا أثناء القيادة.
ونضيف أيضًا فئة جديدة من التطبيقات ونماذج للتطبيقات التي تتضمّن تجارب حوارية أثناء القيادة.
أخيرًا، نعمل على توفير المزيد من الوظائف لتسهيل الانتقال من وضع الركن إلى وضع القيادة باستخدام نماذج مكتبة تطبيقات السيارات.
ننصحك بمتابعتنا لمعرفة المزيد قريبًا.
تتيح إمكانات "التبديل بين وضعَي التوقّف والقيادة" باستخدام "مكتبة تطبيقات السيارات" لتطبيقك التبديل ديناميكيًا بين الوضعَين وعرض محتوى تكيُّفي أثناء توقّف السيارة، والعودة بسلاسة إلى نماذج "مكتبة تطبيقات السيارات" أثناء القيادة.
تشمل التطبيقات الرئيسية تقديم عمليات مصادقة مخصّصة عندما تكون السيارة متوقفة، أو تفعيل تجربة مخصّصة لوضعية الركن، مثل بث بودكاست فيديو أو مقاطع موسيقية.
يتكامل هذا مباشرةً مع نموذج تشغيل الوسائط.
وبالتالي، تتيح المركبات المتوقفة للسائقين الوصول الكامل إلى نشاط Android الأصلي في تطبيقك، ما يتيح استخدام الوسائط التفاعلية المتقدّمة، مثل بث الفيديوهات.
بمجرد تشغيل السيارة، يتم تفعيل إجراءات الحماية من تشتيت الانتباه، ما يدفع تطبيقك إلى العودة إلى نموذج الوسائط في مكتبة تطبيقات السيارة للحفاظ على استماع صوتي متوافق وغير منقطع.
نحن في لحظة تحوّل في تجارب الاستخدام داخل السيارة.
تسعى تطبيقات الوسائط إلى التطوّر بما يتجاوز واجهات التصفّح والتشغيل التقليدية لتقديم لحظات أكثر ثراءً وغامرة وتفاعلية للسائقين والركاب على حدٍ سواء.
سنستعرض الآن مثالاً على كيفية إضافة نشاط فيديو أصلي باستخدام مكتبة Media3 لبدء التشغيل عندما تنتقل السيارة إلى وضع "الركن".
للبدء، عليك ربط سطح عرض الفيديو مباشرةً بمثيل التشغيل في الخلفية.
override fun onStart() {
super.onStart()
...
controllerFuture = MediaController.Builder(
this,
sessionToken
).buildAsync()
controllerFuture?.addListener({
mediaController = controllerFuture?.get()
playerView.player = mediaController
}, ContextCompat.getMainExecutor(this))
}يجب تجنُّب إنشاء مشغّل وسائط منفصل داخل هذا النشاط، وبدلاً من ذلك، يجب الاحتفاظ بمشغّل ExoPlayer أو مشغّل وسائط مركزي ضمن الخدمة الأساسية، مثل خدمة مكتبة الوسائط Media3، التي تتعامل مع كل من أحداث بث الصوت والفيديو.
لذلك، أثناء الحركة، عندما لا تكون هناك خدمة نشطة مرتبطة، يفك المشغّل ترميز الصوت فقط، ولكن عندما يفتح السائقون نشاط الفيديو أثناء ركن السيارة، عليك إرفاق سطح العرض مباشرةً بمشغّل الخدمة الأساسي.
لذا، باستخدام Media3، ينفّذ mediaController المشغّل بشكلٍ أصلي، ما يسمح بتعيين مباشر، كما ترى هنا، playerView set-- playerView.player يتم ضبطه مباشرةً على mediaController.
بعد ذلك، عليك تسجيل نقطة الدخول الأصلية باستخدام ParkedOnlyOnClickListener.
val watchVideoAction = Action.Builder()
.setTitle("Watch Video")
.setIcon(videoCarIcon)
.setOnClickListener(
ParkedOnlyOnClickListener.create {
val intent = Intent(
carContext,
VideoPlayerActivity::class.java
)
.apply {
addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK
)
}
carContext.startActivity(intent)
})
.build()يوفّر هذا الغلاف مشغّل intent ضمن شريط العنوان في واجهة تشغيل الوسائط.
لذا، يمكنك تضمين إجراء لتشغيل الفيديو، مع تضمين مستمع الاختيار في ParkedOnlyOnClickListener.
لذلك، في وضع القيادة، يتم اعتراض هذه النقرات من خلال التطبيق المضيف الذي يعرض رسالة أمان النظام، وبالتالي لن تتمكّن من الانتقال إلى تلك الشاشة أثناء القيادة، ولكن عند إيقاف السيارة، تؤدي عملية الاستدعاء إلى تشغيل startActivity ضمن carContext لبدء النشاط المحدّد في وضع ملء الشاشة.
تذكّر أنّه في تطبيقات مكتبة تطبيقات السيارات هذه، يجب وضع علامة على هدف الفيديو على أنّه distractionOptimized=false داخل ملف البيان ليتعرّف نظام التشغيل على أنّ هذا سير عمل مخصّص للسيارات المتوقفة فقط.
<activity
android:name=".VideoPlayerActivity"
android:exported="false"
android:launchMode="singleTop">
<meta-data
android:name="distractionOptimized"
android:value="false" />
</activity>وأخيرًا، لنرَ ما يحدث عندما يغيّر السائق وضعية ناقل الحركة من وضعية الوقوف إلى وضعية القيادة.
إذا لم يكن النشاط محسّنًا لتخفيف الإلهاء، وإذا ظلّ نشطًا أثناء تحرّك السيارة، يعرض نظام التشغيل AAOS نافذة منبثقة لحظر النظام تخبرك، بشكل أساسي، بإيقاف السيارة لمواصلة استخدام التطبيق.
لتجنُّب هذه الشاشة المحظورة، هدفنا هو العودة بسلاسة إلى نموذج تشغيل الوسائط بدون مقاطعة الصوت.
لذلك، عندما يتم تقييم isRequiresDistractionOptimization على أنّه صحيح هنا، سنمحو عرض سطح عرض الفيديو من جلسة الوسائط الأساسية ونستدعي "إنهاء" في نشاط على Play لأنّه تم تشغيله فوق تجربة CAL، ويؤدي إنهاؤه إلى العودة مباشرةً إلى نموذج تشغيل الوسائط ومواصلة تشغيل الصوت.
class VideoPlayerActivity : ComponentActivity(){
override fun onStart() {
…
if (uxRestrictionsManager?
.currentCarUxRestrictions?
.isRequiresDistractionOptimization
== true) {
revertToCarAppTemplate()
}
}
private fun revertToCarAppTemplate() {
mediaControllerCompat
.sendCommand("CMD_CLEAR_VIDEO_SURFACE",
null, null)
finish()
}
}إنّ الحفاظ على تشغيل الصوت بدون انقطاع هو مفتاح تجربة مستخدم رائعة، لذا من خلال إبقاء جلسة الوسائط نشطة كخدمة تعمل في المقدّمة، يستمر الصوت بسلاسة في جميع تغييرات الحالة هذه.
<activity
android:name="androidx.car.app.activity.CarAppActivity"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK" />
</intent-filter>
<meta-data
android:name="distractionOptimized"
android:value="true" />
</activity>يجب أيضًا إلغاء onNewIntent في شاشة CAL لتسجيل نوايا SHOW_MEDIA_PLAYBACK.
class MyCarAppSession : Session() {
override fun onCreateScreen(intent: Intent): Screen {
// 1. Link your active MediaSession token with Car App Library's MediaPlaybackManager
val mediaPlaybackManager = carContext.getCarService(MediaPlaybackManager::class.java)
mediaPlaybackManager.registerMediaPlaybackToken(mediaSessionToken)
// 2. Handle deep link if cold-started from the vehicle's media widget
handlePlaybackIntent(intent)
return HomeScreen(carContext)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
// 3. Handle deep link when the session is already running
handlePlaybackIntent(intent)
}
}بهذه الطريقة، عندما يتفاعل المستخدمون مع تطبيق وسائط مصغّر في نظام السيارة على الشاشة الرئيسية، يوجّههم الرابط لصفحة معيّنة مباشرةً إلى عرض "قيد التشغيل" في مكتبة تطبيقات السيارة.
لذا، فإنّ التحقّق من صحة هذه الانتقالات خلال عملية التطوير أمر بسيط للغاية.
يمكنك تنفيذ أوامر adb على نظام التشغيل Android Automotive.
في هذه الحالة، سيكون emulate-driving-state drive أو emulate-driving-state park عندما تكون مستعدًا للتبديل بين الأنشطة.
إليك مثال على استخدام نموذج تطبيق الوسائط الجديد Media3 الذي يستخدم "مكتبة تطبيقات السيارات" مع ميزة تشغيل الفيديو أثناء ركن السيارة أو قيادتها.
لذا، يمكنك الاطّلاع على هذه الميزة في جناح Android التكيُّفي في الطابق السفلي وعلى مستودع car-samples على GitHub قريبًا جدًا.
تتوفّر إمكانات الانتقال من وضع التوقّف إلى وضع القيادة حاليًا على نظام التشغيل Android Automotive لتطبيقات الموسيقى التي تم دمجها مع مكتبة تطبيقات السيارات (CAL) لتوفير تجربة قيادة تتيح لها تقديم تجارب أكثر فعالية أثناء توقّف السيارة الآن.
يمكنك الاطّلاع على هذه الميزة في مستنداتنا قريبًا جدًا على developer.android.com وإبداء اهتمامك بها لتضمينها في تطبيقك.
بول
رائع.
شكرًا "توماس"
قبل أن نختتم، لديّ طريقتان لمشاركتهما معك لمعرفة المزيد حول ما سيحدث في وقت لاحق من هذا العام.
كما ذكر "توماس"، يتوفّر الإصدار 1.9 من CAL حاليًا في مرحلة الإصدار الأولي.
ستتوفّر هذه الميزة قريبًا في إصدار تجريبي.
بعد ذلك، سيتم إطلاق الإصدار الأولي من CAL 1.10 قبل نهاية العام، ما يتيح لك البدء في تقييم واجهات المستخدم الحوارية وأحدث ميزات التواصل والتبديل بين وضعَي الركن والقيادة.
أخيرًا، يسرّنا أن نعلن، كما ذكرتُ سابقًا، أنّ الألعاب متاحة على Android Auto وAndroid Automotive، لذا فهذا هو الوقت المثالي لتحسين ألعابك لتناسب السيارات.
لمزيد من المعلومات حول تفاصيل التنفيذ، يُرجى مراجعة المستندات في دليل "تصميم ألعاب للسيارات".
يمكنك الاطّلاع على مزيد من المعلومات حول كيفية تكييف ألعابك مع السيارات ومتابعة آخر الأخبار والتغييرات في Android للسيارات في صفحة "الميزات الجديدة".
نأمل أن تكون قد رأيت كيف أن السيارات ومستخدميها جاهزون لتطبيقاتك.
يمكنك إنشاء تطبيقاتك التكيُّفية الحالية لتقديم تجارب غنية أثناء توقّف السيارة، واستخدام مجموعة متنوعة من نماذج "مكتبة تطبيقات السيارات" لإنشاء تلك التجارب المحسّنة للقيادة الآمنة.
قبل النشر، يمكنك إجراء اختبار شامل باستخدام الوحدة الرئيسية لأجهزة الكمبيوتر المكتبي أو المحاكيات أو نظام التشغيل Android Automotive (AAOS) الذي يعمل على جهاز Pixel Tablet أو باستخدام مختبر Firebase الافتراضي.
لديك المهارات اللازمة لإنشاء تطبيقات لهذه المنظومة المتكاملة، وهناك ملايين السيارات التي تنتظر تطبيقاتك، لذا لنبدأ في تطويرها.
android skills list
android skills add android-for-cars-parked-appsoverride fun onStart() {
super.onStart()
...
controllerFuture = MediaController.Builder(
this,
sessionToken
).buildAsync()
controllerFuture?.addListener({
mediaController = controllerFuture?.get()
playerView.player = mediaController
}, ContextCompat.getMainExecutor(this))
}val watchVideoAction = Action.Builder()
.setTitle("Watch Video")
.setIcon(videoCarIcon)
.setOnClickListener(
ParkedOnlyOnClickListener.create {
val intent = Intent(
carContext,
VideoPlayerActivity::class.java
)
.apply {
addFlags(
Intent.FLAG_ACTIVITY_NEW_TASK
)
}
carContext.startActivity(intent)
})
.build()<activity
android:name=".VideoPlayerActivity"
android:exported="false"
android:launchMode="singleTop">
<meta-data
android:name="distractionOptimized"
android:value="false" />
</activity>class VideoPlayerActivity : ComponentActivity(){
override fun onStart() {
…
if (uxRestrictionsManager?
.currentCarUxRestrictions?
.isRequiresDistractionOptimization
== true) {
revertToCarAppTemplate()
}
}
private fun revertToCarAppTemplate() {
mediaControllerCompat
.sendCommand("CMD_CLEAR_VIDEO_SURFACE",
null, null)
finish()
}
}<activity
android:name="androidx.car.app.activity.CarAppActivity"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="androidx.car.app.media.action.SHOW_MEDIA_PLAYBACK" />
</intent-filter>
<meta-data
android:name="distractionOptimized"
android:value="true" />
</activity>class MyCarAppSession : Session() {
override fun onCreateScreen(intent: Intent): Screen {
// 1. Link your active MediaSession token with Car App Library's MediaPlaybackManager
val mediaPlaybackManager = carContext.getCarService(MediaPlaybackManager::class.java)
mediaPlaybackManager.registerMediaPlaybackToken(mediaSessionToken)
// 2. Handle deep link if cold-started from the vehicle's media widget
handlePlaybackIntent(intent)
return HomeScreen(carContext)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
// 3. Handle deep link when the session is already running
handlePlaybackIntent(intent)
}
}