أرسلت بواسطة Garan Jenkin – مهندس علاقات المطورين
هذا المنشور هو جزء من Wear OS Sotflight Week. اليوم ، نحن استكشاف عالم الساعات الرائع.
في Google I/O ’25 ، أطلقت Watch Face Push ، واجهة برمجة تطبيقات جديدة تهدف إلى تمكين أسواق الوجه للمشاهدة للمشاهدة والهاتف. يتوفر Watch Face Push الآن لتطويره واستخدامه على OS 6 على أجهزة مثل Pixel Watch 4.
في منشور المدونة هذا ، سنعرض كيف يمكن استخدام Watch Face Push (WFP) في مجموعة كاملة من الطرق الأخرى ، بما في ذلك:
- من الناحية الديناميكية وجه ساعة من صورة
- تقديم بيانات أو صور غنية من مصادر البيانات عبر الإنترنت أو المتصلة
- استكمال تطبيق الهاتف لدفع المشاركة

المثال الأول الذي سنركز عليه هو بناء وجه ساعة مع تطبيق هاتف مصاحب. يمكن أن يطبق سمة ملونة بناءً على صورة تم التقاطها على الهاتف – مثالي لمطابقة وجه الساعتين مع ملابسك! وهو مثالي لإظهار كيفية سمح Watch Face Push للمطورين بإحضار بيانات ديناميكية إلى وجه الساعة.
دعنا نمر ببعض التقنيات الرئيسية التي تجمع معًا لجعل هذا ممكنًا:
وجه الساعة الافتراضي – جمع المكونات معًا
ميزة قوية لدفع الوجه هي ميزة وجه الساعة الافتراضية. يتيح ذلك للمطور توفير وجه ساعة مثبت على جهاز Wear OS في نفس الوقت الذي يتم فيه التطبيق الكلي. تم تجميع وجه الساعة هذا باعتباره APK ووضعه في أصول دليل في التطبيق.
يتحقق النظام من وجود APK هذا حيث يتم تثبيت التطبيق ، ويتحقق من مفتاح التحقق من الصحة في بيان التطبيق.
يمكّنك ذلك من توصيل حزمة واحدة تحتوي على كل من مكونات Watch Face و App ، سواء كان ذلك تطبيقًا كاملًا للارتداء ، حيث يكون التطبيق هو التركيز الأساسي ، أو مكونات التطبيق مثل مقدمي المضاعفات ، حيث يكون وجه الساعة هو التركيز الأساسي.
في هيكل مشروعنا ، نحدد وحدتين ، يرتدي و Watchface. باستخدام موحد الإصدار عبر كليهما ، يمكننا الاحتفاظ بالتطبيق ومشاهدة إصدارات الوجه في المزامنة. نستخدم Gradle لبناء وجه الساعة وإنشاء رمز التحقق من الصحة. هذا يجعل من السهل التعامل مع وجه الساعة والتطبيق كجزء من نفس المشروع.
مصادر بيانات المضاعفات – خطوط أنابيب للبيانات
الآن وبعد أن نجحنا في تزويد كل من Watch Face و Most Together ، نحتاج إلى طريقة لتوفير البيانات.
أصبح وجه الساعة قادرًا الآن على الاعتماد على وجود مصادر بيانات المضاعفات التي يوفرها التطبيق. على سبيل المثال ، يمكن أن يحمل وجه ساعة ركوب الأمواج مع مضاعفات درجة حرارة الماء. يمكن تعيين ذلك على أنه الافتراضي على وجه الساعة باستخدام DefaultProviderPolicy ويضمن أن يكون حاضرا.
في اتخاذ خطوة إلى الأمام ، يمكننا تكوين المضاعفات لتكون غير قابلة للتنمية ، بحيث تصبح المضاعفات مصدر بيانات مخصص. يمكننا بعد ذلك استخدام المضاعفات ولكن قد يحتاج وجه الساعة:
<ComplicationSlot isCustomizable="FALSE" ... > <DefaultProviderPolicy defaultSystemProvider="NEXT_EVENT" defaultSystemProviderType="SHORT_TEXT" primaryProvider="<my_component_path>" primaryProviderType="SHORT_TEXT" /> <!-- Rest of complication goes here --> </ComplicationSlot>
في حالة وجهنا ، نحدد أ Short_text خدمة المضاعفات palettecmonicationservice، الذي يرسل البيانات التالية:
TEXT: <space-delimited list of RGB hex values> TITLE: CONFIGURED | NOT_CONFIGURED
باستخدام اثنين من الحقول على Short_text، نحن قادرون على إرسال لوحة الألوان الخاصة بنا إلى وجه الساعة ، إلى جانب مؤشر حول ما إذا كان قد تم تكوين التطبيق (المزيد عن سبب أهمية ذلك لاحقًا).
استخراج بيانات المضاعفات والتلاعب بها
لقد أوضحنا كيف استخدام الوجود المضمون لـ palettecmonicationservice يتيح لنا التأكد من أن وجه الساعة يمكن أن يتلقى بياناتنا ، لكن ما زلنا بحاجة إلى تحديد كيفية استخدام وإظهار البيانات داخل عناصر الوجه.
داخل المضاعفات عنصر على وجه الساعة ، يمكن الوصول إلى عناصر البيانات هذه كما المضاعفات و المضاعفات على التوالى. الوظائف المختلفة مثل ABS () و نص فرعي () يمكن استخدامها لاستخراج أجزاء من هذه السلاسل ، أو تحويلها إلى أنواع رقمية.
نحن نجمع هذا مع استخدام مرجع لتحديد الألوان. يمكننا استرداد هذه الألوان في كل مكان على الساعة ، بما في ذلك خارج المضاعفات:
<ComplicationSlot ... isCustomizable="FALSE" x="0" y="0" width="1" height="1"> <DefaultProviderPolicy defaultSystemProvider="NEXT_EVENT" defaultSystemProviderType="SHORT_TEXT" primaryProvider="com.example.palette/com.example.palette.complication.PaletteComplicationService" primaryProviderType="SHORT_TEXT" /> <BoundingBox height="1" width="1" x="0" y="0" /> <Complication> <!-- Complication data source sends 3 RGB hex values, extract the first: --> <PartDraw x="0" y="0" width="1" height="1"> <Transform target="tintColor" value="extractColorFromColors([COMPLICATION.TEXT], false, 0.0)" /> <Reference source="tintColor" defaultValue="#000000" name="primary_color" /> <Line startX="0" startY="0" endX="1" endY="1"> <Stroke color="#000000" thickness="1" /> </Line> </PartDraw> ... </Complication> </ComplicationSlot>
يوضح هذا المقتطف إنشاء صغير جدًا المضاعفات، والتي ستعمل ببساطة كخط أنابيب لبياناتنا:
ضمن المضاعفات ، عنصر نائب Partdraw تم إنشاؤه ، و extractcolorfromcolors () يتم استخدام الوظيفة لتحويل Partdraw إلى اللون الأول المقدم من المضاعفات. باستخدام مرجع العنصر ، تتوفر قيمة اللون هذه لبقية وجه الساعة [REFERENCE.primary_color].
على سبيل المثال ، اثنان آخرين Partdraw تستخدم العناصر لتوفير الثانوية و truitiary_color، ببساطة توفير 0.5 و 1.0 فهرس إلى extractColorFromColors وظيفة بدلا من 0.0 قيمة.
توضح بعض العينات كيف يمكنك مشاركة أنواع البيانات المختلفة بما يتجاوز الألوان العادلة ، مثل القيم الرقمية.
الإشارة إلى بيانات المضاعفات في وجه الساعة
ال Primary_colorو الثانوية و truitiary_color يمكن الآن استخدام القيم في مكان آخر على وجه الساعة ، سواء في التعبيرات أو التحويلات. في مثالنا ، نستخدم الألوان الموجودة على وجه وجه الساعة:
<HourHand resource="hour" x="210" y="75" width="30" height="180" pivotX="0.5" pivotY="0.8333" tintColor="[REFERENCE.primary_color]"> </HourHand> // Similar logic for the minute hand and second hand would refer to // secondary_color and tertiary_color, respectively.
الحفاظ على حزمة وجه الساعة محدثة
يتمثل أحد التحديات في نهج الوجه الافتراضي في Watch Watch هو أنه إذا تم تحديث التطبيق ، فلن يتم تحديث وجه الساعة تلقائيًا ، حتى إذا كانت حزمة التطبيق الجديدة تحتوي على وجه ساعة محدثة. لمعالجة هذه المشكلة ، يستخدم التطبيق أ برودكاسستير لتلقي my_package_replaced فعل. عند تلقي هذا ، يمكن للتطبيق التحقق مما إذا كان وجه الساعة مثبتًا ويحتاج إلى ترقية ، باستخدام Watch Face Push لأداء الترقية إذا لزم الأمر.
ل my_package_replaced الإجراء الذي سيتم استلامه ، يجب تشغيل التطبيق مرة واحدة على الأقل. لهذا السبب ، تتضمن وجوه الساعات العينة مثالًا لضمان تشغيل المستخدم للتطبيق: يتم عرض زر “تشغيل التطبيق” على وجه الساعة إذا لم يتم إطلاق التطبيق من قبل. يتم تحقيق ذلك باستخدام أ حالة على تكوين أو not_configured الوضع الموصوف سابقا.
بالنسبة للعديد من وجوه الساعات ، فإن هذا له غرض إضافي: يسمح للمستخدم بتمكين مكونات إضافية ، مثل تنزيل الصور في مثال ألبوم الصور الموضح هنا. يمكنك أيضًا استخدام تجربة “الإطلاق الأول” لمطالبة المستخدم بمنح الأذونات أو تسجيل الدخول.

العمل مع مكونات التطبيق الأخرى
على الرغم من أن مصدر بيانات المضاعفات هو القناة للبيانات ، وهو المكون الشائع في جميع الأمثلة ، فإن واجهات برمجة التطبيقات التي تعمل بنظام Android التالية تعمل بمضاعفات لتحقيق الوظيفة المطلوبة:
- WearableListenerservice – كلاهما palettewatchface و FootballWatchface لديك تطبيقات رفيق الهاتف ، ويتم استخدام طبقة البيانات لإرسال البيانات إلى الساعة. بمجرد استلامها من قبل WearableListenerservice، يمكنك تحديث البيانات على وجه الساعة بشكل استباقي المضاعفات.
- العامل – ال photalbumwatchface يوضح مثال كيفية استرداد الصور من خدمة صور عبر الإنترنت. العامل يستخدم لهذا ، باستخدام قيود لتنزيل الصور فقط أثناء شحن الجهاز.
- ForegroundService – ال DevicedataWatchface يوضح باستخدام أ ForegroundService للحصول على بيانات من جهاز Bluetooth متصل والذي يتم تصوره بعد ذلك على وجه الساعة.

تحقق من المصدر الكامل لهذه الأمثلة. نتطلع إلى رؤية ما يمكنك إنشاؤه!

