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

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

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

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