با گسترش نمایشگرهای داخل خودرو در وسایل نقلیه Android Auto و سیستمعامل Android Automotive، توسعهدهندگان با چالش دوگانه منحصربهفردی مواجه هستند: ارائه تجربههای غنی و تطبیقی درحین پارک بودن خودرو، و تجربههای ایمن برای راننده و مبتنی بر الگو درحین رانندگی. در این جلسه فنی جامع ۳۰ دقیقهای، معماری سرتاسر و رویکردهای توسعه برای سازگار کردن برنامههای Android با خودروها را بررسی میکنیم.
از اصول طراحی برنامهها برای استفاده در خودروها گرفته تا جدیدترین رویکردها برای ساخت تجربههای رسانهای که با تغییر وضعیت خودرو از رانندگی به پارک، از صوتی به تصویری تغییر میکنند، با هرآنچه برای آماده کردن برنامهتان برای استفاده در خودرو نیاز دارید آشنا خواهید شد.
آوانویسی
بسیار خوب.
خوش آمدید، همگی.
از اینکه در این جلسه به ما پیوستید متشکریم، خودرو بوم نقاشی شما است.
این جلسه درباره باز کردن قفل توسعه Android برای جاده است.
من پل لمرتسما هستم.
و من توماس ودرز هستم.
ما مهندسان روابط توسعهدهنده در تیم Android برای ماشینها هستیم.
مطمئنم بسیاری از شما زمان و انرژی زیادی صرف کردهاید تا مطمئن شوید برنامههایتان در طیف گستردهای از صفحهنمایشها و دستگاههای مختلف، تلفنها، دستگاههای تاشو، رایانههای لوحی، و غیره عالی بهنظر میرسند و بهخوبی کار میکنند.
امروز میخواهیم روی صفحهای تمرکز کنیم که شاید به آن فکر نکرده باشید.
و میتواند به شما کمک کند به روشی منحصربهفرد به کاربرانتان دسترسی پیدا کنید.
این نمایشگر داخل خودرو است.
پس بیایید با یک نمای کلی مختصر از آنچه منظورم است وقتی درباره Android برای ماشینها صحبت میکنیم، شروع کنیم.
Android برای ماشینها یک چیز یکپارچه نیست.
دو پلاتفرم وجود دارد که میتوانید هدفیابی کنید.
اول، Android Auto وجود دارد که سیستمی است که با تلفن کار میکند و روی نمایشگر خودرو نمایش داده میشود.
با Android Auto، برنامه در تلفن شما اجرا میشود و بااستفاده از اتصال سیمی یا بیسیم، واسط کاربر خود را در نمایشگر خودرو نمایش میدهد.
و دوم، «سیستمعامل Android Automotive» است که نوعی Android است که مستقیماً روی خود خودرو اجرا میشود.
سیستمعامل Android Automotive مستقل از تلفن اجرا میشود، دسترسی مستقیم به سختافزار خودرو، چیزهایی مثل کنترل تهویه هوا و رادیو دارد، و مهمتر اینکه اتصال داده خودش را نیز مدیریت میکند.
زیرمجموعهای از خودروهایی که سیستم عامل Android Automotive را اجرا میکنند خودروهای مجهز به Google هستند.
خودروهای مجهز به Google با برنامهها و سرویسهای Google، مثل «فروشگاه Play»، Gemini، و Google Maps نیز ارائه میشوند.
باوجود اینکه دو پلاتفرم وجود دارد، هدف ما این است که ساختن برنامه را برای شما آسان کنیم تا بتوانید برنامههایی را مستقر کنید که تجربههای عالی در هر دو پلاتفرم ارائه میدهند.
اکنون در اینجا نمونهای از یک برنامه رسانه را میبینید که یکبار بااستفاده از «کتابخانه برنامه خودرو» ساخته شده است و ظاهر آن در Android Auto و «سیستم عامل Android Automotive» در اندازهها و شکلهای مختلف نمایشگر نشان داده شده است.
انواع مختلفی از دستگاهها و سطوح وجود دارد که میتوانید برای آنها بسازید.
بنابراین، این سؤال پیش میآید که چرا برای خودروها؟
خب، اول اینکه، مقیاس اینجا واقعاً خیلی بزرگ است.
امروزه بیشاز ۲۵۰ میلیون خودرو سازگار با Android Auto در جادهها وجود دارد و بیشاز ۱۰۰ مدل خودرو مجهز به Google در ۱۶ برند مختلف عرضه شده است.
و وقتی برنامههایتان در خودروها باشند، به کاربرانی دسترسی پیدا میکنید که درحال رفتوآمد روزانه، رفتن به فعالیتهای خانوادگی یا برگشتن از آنها، انجام کارهای روزمره، و حتی در سفرهای جادهای هستند.
در ایالات متحده، طبق «نظرسنجی رانندگی امریکایی» در سال ۲۰۲۴ از AAA، رانندگان بهطور متوسط ۶۰ دقیقه در روز را پشت فرمان میگذرانند.
اما شما فقط زمانیکه کاربران درحال رانندگی هستند به آنها دسترسی پیدا نمیکنید.
همچنین وقتی پارک کردهاند به آنها دسترسی دارید.
فکر کنید شاید آنها درحال شارژ کردن خودروشان در ایستگاه شارژ خودرو برقی هستند، یا شاید در صف سوار کردن فرزندشان از مدرسه هستند.
و با افزایش نمایشگرهای مخصوص مسافر، انتظار داریم در آینده فرصتهای بیشتری برای تعامل با کاربران ببینیم.
بسیار خوب.
اکنون بیایید به انواع مختلف تجربههایی که میتوانید برای خودروها بسازید نگاهی بیندازیم.
برای درک نحوه ساختن برنامه برای خودروها، بهتر است دو وضعیت و حالت اصلی را که برای برنامهها هنگام اجرا در داخل خودرو وجود دارد درک کنید.
اول، برنامههایی که هنگام رانندگی استفاده میکنید.
اینها تجربههای بهینهشده برای رانندگی هستند که میتوان هنگام حرکت خودرو از آنها استفاده کرد.
این شامل برنامههایی در دستههایی است که در اینجا روی صفحه فهرست شدهاند، مواردی مانند برنامههای صوتی، که معمولاً به آنها برنامههای رسانهای، پیامرسانی و ارتباطی، ناوبری و غیره میگوییم.
تجربههای بهینهشده برای رانندگی باید از معیارهای سختگیرانه محافظت دربرابر حواسپرتی پیروی کنند.
ملاحظات خاصی برای نحوه ساختن واسط کاربر برای برنامه وجود دارد تا بتوان از آن بهطور ایمن درحین حرکت خودرو استفاده کرد.
اکنون چند روش مختلف برای ساختن برنامههای بهینهشده برای رانندگی وجود دارد.
اما در این گفتگو، بهطور خاص، بر استفاده از «کتابخانه برنامه خودرو» تمرکز خواهیم کرد.
این مجموعهای از کتابخانههای Jetpack است که چارچوب الگوگذاریشدهای را ارائه میدهد که میاناهای کاربر بهینهشده برای رانندگی را ارائه میدهد، و درعینحال از سازگاری با پیکربندیهای سختافزاری مختلف موجود در خودروها مراقبت میکند.
بنابراین به مواردی مثل روشهای ورودی، اندازههای صفحهنمایش، و نسبتهای ابعادی فکر کنید.
اگرچه این تنها راه ساختن تجربههای بهینهشده برای رانندگی در خودرو نیست، رویکردی که میخواهم در این گفتگو روی آن تمرکز کنم ساختن با «کتابخانه برنامههای Android برای ماشینها» است.
ما اغلب این را بهطور خلاصه CAL مینامیم.
همانطور که چند لحظه پیش اشاره کردم، «کتابخانه برنامه خودرو» مجموعهای از کتابخانهها است که به ساختن برنامههای شما برای استفاده در خودروها کمک میکند.
این چارچوب الگووارهای است که میاناهای کاربر بهینهشده برای رانندگی را ارائه میدهد و درعینحال کار سازگار شدن با پیکربندیهای سختافزاری مختلف را انجام میدهد.
و میتوانید برنامهتان را بسازید و مطمئن باشید که در همه آن پیکربندیهای مختلف، چه Android Auto را اجرا کنند و چه سیستم عامل Android Automotive، عملکرد خوبی خواهد داشت.
برنامههایی که بااستفاده از CAL ساخته میشوند میتوانند به این معماری کارخواه میزبان متکی باشند.
برنامه میزبان، که یا خود Android Auto است یا در خودروهای مجهز به Google، «میزبان برنامه Google Automotive» است، پردازنده سیستم است.
درنهایت این سرویس کنترل میکند که چه چیزی باید در نمایشگر کاربر نشان داده شود.
بنابراین، بهعنوان توسعهدهنده برنامه، درنهایت شما نیستید که پیکسلها را ترسیم میکنید.
درعوض، دادههای ساختاریافته و وضعیت دادههایتان را به الگوهای «کتابخانه برنامه Cars» ارسال میکنید.
و این میزبان است که سپس این دادهها را میگیرد و آن را بهطور ایمن، به روشی مطابق با ایمنی، با چیدمان بهینهشده برای سطح دقت ترسیم میکند.
بنابراین، بیایید نگاهی به کلاسهای CAL بیندازیم، آنچه برای ساختن برنامهتان باید گسترش دهید، با CarAppService شروع میکنیم.
این یک زیرکلاس از سرویس Android است که بهعنوان نقطه ورودی برای برنامههای میزبان جهت برقراری ارتباط با برنامههای کلاینت عمل میکند و هدف آن ایجاد نمونههای جلسه است که میزبان سپس با آنها تعامل میکند.
میتوانید جلسه را بهعنوان نمونهای از برنامه کارخواه درحال اجرا در نمایشگر خودرو درنظر بگیرید.
مانند سایر مؤلفههای Android، چرخه عمر خاص خود را دارد که میتواند برای مقداردهی اولیه و ازبین بردن منابع استفادهشده درطول وجود نمونه جلسه استفاده شود.
این یک رابطه یکبهچند بین CarAppService و جلسه است.
بنابراین، برای مثال، CarAppService ممکن است دو نمونه جلسه داشته باشد، یکی برای نمایشگر اصلی و دیگری برای نمایشگر خوشه برای برنامههای ناوبری که از صفحهنمایشهای خوشه پشتیبانی میکنند.
و این نمونهای از آن است، جایی که خودرو دارای یک نمایشگر اصلی و یک نمایشگر خوشهای است، هر نمایشگر با یک جلسه اختصاصی مرتبط است، و این همچنین نحوه پشتیبانی شما، بهعنوان توسعهدهنده برنامه، از خودروهای چندنمایشگری است.
سپس در یک جلسه، نمونههای صفحه مسئول تولید میاناهای کاربر هستند که توسط برنامههای میزبان ارائه میشوند.
این میاناهای کاربر با کلاسهای الگو نشان داده میشوند که هرکدام نوع خاصی از چیدمان را مدلسازی میکنند و میتوانند مثلاً یک شبکه یا فهرست باشند.
بنابراین، هر جلسه پشتهای از نمونههای صفحه را مدیریت میکند که جریانهای کاربر را در بخشهای مختلف برنامه شما مدیریت میکنند، و مانند جلسه، صفحه چرخه زندگی خاص خود را دارد که میتوانید به آن متصل شوید.
اما فقط به این دلیل که میزبان واسط کاربر شما را ارائه میکند و شما از الگوهای «کتابخانه برنامه Cars» استفاده میکنید، به این معنی نیست که بهشدت محدود شدهاید یا نمیتوانید برنامهتان را سفارشیسازی کنید.
الگوها و مؤلفههای زیادی وجود دارد که میتوانید از آنها استفاده کنید، و همچنین میتوانید آنها را باهم ترکیب کنید تا به تجربه موردنظرتان برسید.
الگوهای با هدف عمومی وجود دارد که میتواند توسط همه انواع برنامهها در «کتابخانه برنامه خودرو» استفاده شود، و الگوهای با هدف خاص وجود دارد که برای تجربههای خاص برنامه، مانند پیمایش یا نقطه موردعلاقه، درنظر گرفته شده است.
اما قبلاز اینکه به جزئیات ساخت تجربههای بهینهشده برای رانندگی بپردازیم، میخواهم به موقعیت دیگری اشاره کنم که میتوانید برنامهها را در خودرو اجرا کنید: وقتی خودرو پارک شده است.
دستههای خاصی از برنامهها وجود دارد که فقط زمانیکه خودرو پارک شده است میتوان از آنها استفاده کرد، و این شامل مواردی مانند برنامههای ویدیو، بازیها، و مرورگرها میشود.
اما وقتی خودرو درحال حرکت نیست، دستورالعملهای حواسپرتی راننده برداشته میشود و میتوانید تجربههایی را ارائه دهید که بیشتر با واسط کاربر تطبیقی موجود شما مطابقت داشته باشد.
برنامههای پارکشده مبتنی بر فعالیت هستند و مشابه یا حتی همان فعالیتهایی هستند که در دستگاههای دیگر، مانند تلفن یا رایانه لوحی، استفاده میشوند و در بخش بعدی بهطور مفصل درباره برنامههای پارکشده صحبت میکنیم.
درحالیکه تجربههای برنامه درحالت پارک از فعالیتهای تطبیقی موجود استفاده مجدد میکنند، هنوز دستورالعملهای کیفیت خاص خودرو وجود دارد که باید رعایت کنید، از اعلامیههای مانیفست و برشهای نمایشگر گرفته تا توقف موقت بازپخش هنگام شروع حرکت خودرو.
و برای کمک به خودکارسازی این کار، مهارت جدیدی در Android برای برنامههای پارکشده راهاندازی کردهایم.
بنابراین، قبلاز شروع، مطمئن شوید که Android CLI را نصب کردهاید، و میتوانید آن را از این پیوند کوتاه پیدا کنید.
و سپس-- وقتی آن را راهاندازی کردید، 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»، صرفنظر از دسته، بیشترین دسترسی را ایجاد کنید و بهدست آورید.
اکنون نوبت توماس است تا درباره رسانه صحبت کند.
بهسلامتی.
عالی.
بنابراین، سال گذشته «کتابخانه برنامه خودرو» را برای برنامههای رسانهای در نسخه ۱.۸ معرفی کردیم که واسطهای کاربر مرور الگودار و کنشهای سفارشی را به Android Auto آورد.
این شامل الگوی بازپخش رسانه است که در اینجا در سمت راست دیده میشود.
امسال در I/O، واسطهای کاربر قابلمرور بیشتری را ازطریق «کتابخانه برنامه Cars» نسخه ۱.۹ معرفی کردیم.
بنابراین، با رسیدن CAL 1.9 به نسخه بتا، اکنون میتوانید بهروزرسانیهای ویژگیهای کلیدی را در Auto و Automotive OS باز کنید.
نکات برجسته شامل سفارشیسازی نمانام ازطریق بیان برنامه است که به شما امکان میدهد نشانهای رنگ و شکل را با چیدمانهای ارائهشده توسط میزبان سفارشی کنید و درعینحال قوانین ایمنی را حفظ کنید، در کنار مؤلفههای جدید واسط کاربر مانند بخشهای برجسته، موارد فهرست فشرده، تراشههای پیمایشی، و مینیپخشکننده ثابت.
بهعلاوه، CAL 1.9 پشتیبانی از الگوهای رسانه را بهطور کامل به سیستمعامل Android Automotive گسترش میدهد و یکپارچگی واقعی پلاتفرم را در هر دو بومسازگان ایجاد میکند.
نسخه بعدی «کتابخانه برنامه خودرو» بهزودی ارائه میشود: CAL نسخه ۱۰.
نسخه ۱۰ 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 تنظیم-- 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()این پوشاننده یک راهانداز قصد در نوار سرصفحه میانای بازپخش رسانه شما ارائه میدهد.
بنابراین، کنشی برای راهاندازی بازپخش ویدیو اضافه کنید و شنونده انتخاب آن را در 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 در اینجا درست ارزیابی میشود، اساساً سطح رندر ویدیو را از جلسه رسانه زیرین شما پاک میکنیم و پایان را در فعالیت پخشکننده فراخوانی میکنیم زیرا در بالای تجربه 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)
}
}بهاینترتیب، هروقت کاربران با ابزاره رسانه سیستم خودرو که در صفحه اصلی خودروها قرار دارد تعامل میکنند، پیوند عمیق آنها را مستقیماً به نمای درحال پخش شما در «کتابخانه برنامه Cars» هدایت میکند.
بنابراین اعتبارسنجی این گذارها درطول فرایند توسعه واقعاً ساده است.
میتوانید فرمانهای adb را در سیستمعامل Android Automotive اجرا کنید.
در این مورد، وقتی آماده جابهجایی بین فعالیتها هستید، emulate-driving-state drive یا emulate-driving-state park خواهد بود.
بنابراین، در اینجا نمونهای از برنامه رسانه Media3 نمونه جدید ما بااستفاده از «کتابخانه برنامه خودرو» با بازپخش ویدیو در حالت پارک به رانندگی آورده شده است.
پس این را در غرفه Android تطبیقی ما در طبقه پایین و بهزودی در GitHub car-samples ما بررسی کنید.
قابلیتهای «پارک به رانندگی» درحالحاضر در «سیستمعامل Android Automotive» برای برنامههای رسانهای که قبلاً با CAL خودرو برای تجربه رانندگی ادغام شدهاند دردسترس است و این برنامهها اکنون میتوانند تجربههای قویتری را درحین پارک بودن ارائه دهند.
بهزودی این مورد را در اسناد ما در developer.android.com بررسی کنید و در آنجا ابراز علاقه کنید تا این ویژگی را در برنامهتان داشته باشید.
Paul.
عالی.
متشکرم، توماس.
قبلاز اینکه کار را تمام کنیم، چند روش برای همرسانی با شما دارم تا درباره آنچه در اواخر امسال ارائه میشود بیشتر بدانید.
همانطور که توماس اشاره کرد، CAL 1.9 درحالحاضر در مرحله آلفا است.
بهزودی به نسخه بتا ارتقا مییابد.
و سپس CAL 1.10 قبلاز پایان سال وارد نسخه آلفا خواهد شد، بنابراین میتوانید ارزیابی واسطهای کاربر مکالمهای و جدیدترین قابلیتهای ارتباطی و پارک به رانندگی را شروع کنید.
درنهایت، همانطور که اشاره کردم، خوشحالیم که اعلام کنیم بازیها در Android Auto و سیستمعامل Android Automotive دردسترس هستند، بنابراین اکنون واقعاً بهترین زمان برای بهینهسازی عناوین بازیهایتان برای خودروها است.
برای کسب اطلاعات بیشتر درباره جزئیات پیادهسازی، حتماً اسناد موجود در راهنمای «ساخت بازی برای خودرو» را مرور کنید.
در صفحه «موارد جدید» ما میتوانید درباره نحوه سازگار کردن بازیهایتان با خودروها و پیگیری سایر موارد جدید و درحال تغییر در Android برای خودروها اطلاعات بیشتری کسب کنید.
امیدواریم متوجه شده باشید که خودروها و کاربرانشان چقدر برای برنامههای شما آماده هستند.
میتوانید برنامههای تطبیقی موجودتان را برای تجربههای غنی در حالت پارک توسعه دهید و از انواع الگوهای «کتابخانه برنامه خودرو» برای ایجاد تجربههای بهینهشده برای رانندگی ایمن استفاده کنید.
قبلاز انتشار، میتوانید بااستفاده از Desktop Head Unit، شبیهسازها، AAOS درحال اجرا در Pixel Tablet، یا بااستفاده از Firebase Test Lab بهطور کامل آزمایش کنید.
شما ازقبل مهارتهای لازم برای ساختن برنامه برای این بومسازگان را دارید و میلیونها خودرو منتظر برنامههای شما هستند، پس بیایید آن برنامه را به جاده ببریم.
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)
}
}