يوضّح هذا المستند كيفية مزامنة البيانات بين جهاز Wear OS وهاتف. اطّلِع على إرشادات النظرة العامة لمعرفة الوقت المناسب لاستخدام واجهة برمجة التطبيقات Data Layer والوقت المناسب لاستخدام البنية الأساسية.
إرسال البيانات ومزامنتها مباشرةً من الشبكة
يمكنك إنشاء تطبيقات Wear OS للتواصل مباشرةً مع الشبكة. استخدِم واجهات برمجة التطبيقات نفسها التي تستخدمها لتطوير التطبيقات على الأجهزة الجوّالة، ولكن ضَع في اعتبارك بعض الاختلافات الخاصة بنظام التشغيل Wear OS.
مزامنة البيانات باستخدام Wear OS Data Layer API
يعرض DataClient واجهة برمجة تطبيقات للمكوّنات من أجل القراءة أو الكتابة إلى DataItem أو Asset.
يمكنك ضبط عناصر البيانات ومواد العرض بدون الاتصال بأي أجهزة. تتم مزامنتها عندما تنشئ الأجهزة اتصالاً بالشبكة. تكون هذه البيانات خاصة بتطبيقك ولا يمكن الوصول إليها إلا من خلال تطبيقك على الأجهزة الأخرى.
تتم مزامنة
DataItemعلى جميع الأجهزة في شبكة Wear OS. وهي تكون صغيرة الحجم بشكل عام.استخدِم
Assetلنقل عنصر أكبر، مثل صورة. يتتبّع النظام مواد العرض التي تم نقلها سابقًا، ويجري عملية إزالة التكرار تلقائيًا.
الاستماع إلى الأحداث في الخدمات
وسِّع نطاق الفئة WearableListenerService. يدير النظام دورة حياة WearableListenerService الأساسي، ويربطه بالخدمة عندما يحتاج إلى إرسال عناصر بيانات أو رسائل، ويزيل الربط بالخدمة عندما لا تكون هناك حاجة إلى تنفيذ أي عمل.
الاستماع إلى الأحداث في الأنشطة
نفِّذ واجهة OnDataChangedListener. استخدِم هذه الواجهة بدلاً من WearableListenerService عندما تريد الاستماع إلى التغييرات فقط عندما يكون المستخدم يستخدم تطبيقك بشكل نشط.
description: نقل كائنات ثنائية كبيرة، مثل الصور، بين هواتف Android وساعات Wear OS باستخدام "مواد العرض" في Data Layer API keywords_public: Wear OS, Data Layer API, Assets, Bluetooth data transfer, data synchronization, DataMap, PutDataRequest
مزامنة البيانات
لمشاركة عناصر ثنائية كبيرة عبر بروتوكول البلوتوث، مثل تسجيل صوتي من جهاز آخر، يمكنك إرفاق Asset بعنصر بيانات، ثم وضع عنصر البيانات في مستودع البيانات المنسوخ. ومع ذلك، إذا كانت عملية التبادل تتم لمرة واحدة بين جهازَين متصلَين، ننصحك بالتفكير في ما إذا كان النقل المباشر الأبسط هو الأنسب.
ملاحظة: يمكن لواجهة برمجة التطبيقات Data Layer API إرسال الرسائل ومزامنة البيانات فقط مع الهواتف التي تعمل بنظام التشغيل Android أو ساعات Wear OS. إذا كان جهاز Wear OS مقترنًا بجهاز iOS، لن تعمل واجهة برمجة التطبيقات Data Layer API.
لهذا السبب، لا تستخدِم Data Layer API كطريقة أساسية للتواصل مع شبكة. بدلاً من ذلك، اتّبِع النمط نفسه في تطبيق Wear OS كما هو الحال في تطبيق الهاتف، مع بعض الاختلافات البسيطة الموضّحة في الوصول إلى الشبكة والمزامنة على Wear OS.
تتعامل الأصول تلقائيًا مع تخزين البيانات مؤقتًا لمنع إعادة الإرسال والحفاظ على نطاق ترددي كافٍ لبروتوكول Bluetooth. من الأنماط الشائعة أن ينزّل تطبيق الهاتف صورة، ويصغّرها إلى حجم مناسب لعرضها على تطبيق الساعة الذكية، ثم يشاركها مع تطبيق الساعة الذكية كأحد مواد العرض. توضّح الأمثلة التالية هذا النمط.
نقل أحد الأصول
أنشئ مادة العرض باستخدام إحدى طرق create...() في الفئة Asset. حوِّل صورة نقطية إلى مصفوفة بايت، ثم استدعِ الدالة
createFromBytes() لإنشاء مادة العرض، كما هو موضّح في المثال التالي.
private fun createAssetFromBitmap(bitmap: Bitmap): Asset = ByteArrayOutputStream().let { byteStream -> bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream) Asset.createFromBytes(byteStream.toByteArray()) }
بعد ذلك، اربط المادة بعنصر بيانات باستخدام الطريقة putAsset() في
DataMap أو PutDataRequest. بعد ذلك، ضَع عنصر البيانات في
مخزن البيانات باستخدام طريقة putDataItem()، كما هو موضّح في
الأمثلة التالية.
يستخدم المثال التالي PutDataRequest:
private fun Context.sendImagePutDataRequest(): Task<DataItem> { val asset: Asset = createAssetFromBitmap(BitmapFactory.decodeResource(resources, R.drawable.ic_walk)) val request: PutDataRequest = PutDataRequest.create("/image").apply { putAsset("profileImage", asset) } val putTask: Task<DataItem> = Wearable.getDataClient(this).putDataItem(request) return putTask }
يستخدم المثال التالي PutDataMapRequest:
private fun Context.sendImagePutDataMapRequest(): Task<DataItem> { val asset: Asset = createAssetFromBitmap(BitmapFactory.decodeResource(resources, R.drawable.ic_walk)) val request: PutDataRequest = PutDataMapRequest.create("/image").run { dataMap.putAsset("profileImage", asset) asPutDataRequest() } val putTask: Task<DataItem> = Wearable.getDataClient(this).putDataItem(request) return putTask }
تلقّي مواد العرض
بعد إنشاء عنصر، يمكنك عادةً قراءته واستخراجه على الجانب الآخر من الاتصال. يوضّح المثال التالي كيفية تنفيذ دالة معاودة الاتصال لرصد تغيير في مادة العرض واستخراجها:
override fun onDataChanged(dataEvents: DataEventBuffer) { dataEvents .filter { it.type == DataEvent.TYPE_CHANGED && it.dataItem.uri.path == "/image" } .forEach { event -> val asset = DataMapItem.fromDataItem(event.dataItem) .dataMap.getAsset("profileImage") asset?.let { safeAsset -> lifecycleScope.launch { val bitmap = loadBitmapFromAsset(safeAsset) // Do something with the bitmap } } } } private suspend fun loadBitmapFromAsset(asset: Asset): Bitmap? = withContext(Dispatchers.IO) { try { val assetResult = Wearable.getDataClient(this@DataLayerActivity2) .getFdForAsset(asset) .await() assetResult?.inputStream?.use { inputStream -> BitmapFactory.decodeStream(inputStream) } } catch (e: Exception) { e.printStackTrace() null } }
لمزيد من المعلومات، اطّلِع على نموذج مشروع DataLayer على GitHub.