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

يوضّح هذا المستند كيفية مزامنة البيانات بين جهاز Wear OS وهاتف. يمكنك الاطّلاع على إرشادات النظرة العامة لمعرفة متى يجب استخدام Data Layer API ومتى يجب استخدام البنية الأساسية.

إرسال البيانات ومزامنتها مباشرةً من الشبكة

يمكنك إنشاء تطبيقات Wear OS للتواصل مباشرةً مع الشبكة. استخدِم واجهات برمجة التطبيقات نفسها التي تستخدمها لتطوير تطبيقات الأجهزة الجوّالة، ولكن ضَع في اعتبارك بعض الاختلافات الخاصة بنظام التشغيل Wear OS.

مزامنة البيانات باستخدام Wear OS Data Layer API

تعرض السمة DataClient واجهة برمجة تطبيقات للمكوّنات لقراءة DataItem أو Asset أو الكتابة فيهما.

يمكنك ضبط عناصر البيانات والأصول بدون الاتصال بأي أجهزة. تتم مزامنتها عندما تنشئ الأجهزة اتصالاً بالشبكة. هذه البيانات خاصة بتطبيقك ولا يمكن الوصول إليها إلا من خلال تطبيقك على الأجهزة الأخرى.

  • تتم مزامنة DataItem على جميع الأجهزة في شبكة Wear OS. ويكون حجمها صغيرًا بشكل عام.

  • استخدِم Asset لنقل عنصر أكبر، مثل صورة. يتتبّع النظام الأساسي الأصول التي تم نقلها من قبل وينفّذ عملية إزالة البيانات المكرّرة تلقائيًا.

الاستماع إلى الأحداث في الخدمات

يمكنك توسيع الفئة WearableListenerService. يدير النظام الأساسي دورة حياة WearableListenerService الأساسية، ويربط بالخدمة عندما يحتاج إلى إرسال عناصر بيانات أو رسائل، ويزيل ربط الخدمة عندما لا يكون هناك عمل مطلوب.

الاستماع إلى الأحداث في الأنشطة

يمكنك تنفيذ واجهة OnDataChangedListener. استخدِم هذه الواجهة بدلاً من WearableListenerService عندما تريد الاستماع إلى التغييرات فقط عندما يكون المستخدم يستخدم تطبيقك بنشاط.

description: Transfer large binary objects, such as images, between Android phones and Wear OS watches using Assets in the Data Layer API. keywords_public: Wear OS, Data Layer API, Assets, Bluetooth data transfer, data synchronization, DataMap, PutDataRequest

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

لمشاركة كائنات ثنائية كبيرة عبر نقل Bluetooth، مثل تسجيل صوتي من جهاز آخر، يمكنك إرفاق 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.