مزامنة البيانات

يوضّح هذا المستند كيفية مزامنة البيانات بين جهاز 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.

تعالج مواد العرض تلقائيًا التخزين المؤقت للبيانات لمنع إعادة الإرسال والحفاظ على معدل نقل البيانات عبر البلوتوث. من الأنماط الشائعة أن يقوم تطبيق الهاتف بتنزيل صورة، ثم تصغيرها إلى حجم مناسب للعرض على الساعة، ومشاركتها مع تطبيق الساعة كمادة عرض. توضح الأمثلة التالية هذا النمط.

نقل مادة عرض

أنشئ مادة العرض باستخدام إحدى طرق 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.