يوضّح هذا المستند كيفية مزامنة البيانات بين جهاز 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 بعنصر بيانات، ثم وضع عنصر البيانات في مخزن البيانات المنسوخ.
ملاحظة: يمكن لواجهة برمجة التطبيقات "طبقة البيانات" إرسال الرسائل ومزامنة البيانات فقط مع الهواتف التي تعمل بنظام التشغيل Android أو ساعات Wear OS. لن تعمل واجهة برمجة التطبيقات Data Layer API إذا كان جهاز Wear OS مقترنًا بجهاز iOS.
لهذا السبب، لا تستخدِم Data Layer API كطريقة أساسية للتواصل مع شبكة. بدلاً من ذلك، اتّبِع النمط نفسه في تطبيق Wear OS كما هو الحال في تطبيق الهاتف، مع بعض الاختلافات البسيطة الموضّحة في مقالة الوصول إلى الشبكة والمزامنة على Wear OS.
تتعامل مواد العرض تلقائيًا مع التخزين المؤقت للبيانات لمنع إعادة الإرسال والحفاظ على نطاق ترددي كافٍ عبر البلوتوث. من الأنماط الشائعة أن ينزّل تطبيق الهاتف صورة، ويصغّرها إلى حجم مناسب لعرضها على الساعة، ثم يشاركها مع تطبيق الساعة كمادة عرض. توضّح الأمثلة التالية هذا النمط.
نقل أحد الأصول
أنشئ مادة العرض باستخدام إحدى طرق 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.