डेटा सिंक करें

इस दस्तावेज़ में, Wear OS डिवाइस और फ़ोन के बीच डेटा सिंक करने का तरीका बताया गया है. डेटा लेयर एपीआई और अपने इन्फ़्रास्ट्रक्चर का इस्तेमाल कब करना चाहिए, इसके बारे में जानने के लिए खास जानकारी वाले दिशा-निर्देश देखें.

सीधे नेटवर्क से डेटा भेजना और सिंक करना

सीधे नेटवर्क से कम्यूनिकेट करने के लिए, Wear OS ऐप्लिकेशन बनाएं. मोबाइल डेवलपमेंट के लिए इस्तेमाल किए जाने वाले एपीआई का ही इस्तेमाल करें. हालांकि, Wear OS के लिए कुछ खास बातों का ध्यान रखें.

Wear OS डेटा लेयर एपीआई का इस्तेमाल करके डेटा सिंक करना

DataClient, कॉम्पोनेंट के लिए एक एपीआई उपलब्ध कराता है, ताकि वे DataItem या Asset में डेटा को ऐक्सेस या सेव कर सकें.

किसी भी डिवाइस से कनेक्ट न होने पर, डेटा आइटम और ऐसेट सेट किए जा सकते हैं. डिवाइसों के इंटरनेट कनेक्शन से कनेक्ट होने पर, ये सिंक हो जाते हैं. यह डेटा आपके ऐप्लिकेशन के लिए निजी होता है. इसे अन्य डिवाइसों पर सिर्फ़ आपका ऐप्लिकेशन ऐक्सेस कर सकता है.

  • DataItem को Wear OS नेटवर्क में मौजूद सभी डिवाइसों पर सिंक किया जाता है. आम तौर पर, इनका साइज़ छोटा होता है.

  • इमेज जैसे बड़े ऑब्जेक्ट को ट्रांसफ़र करने के लिए, Asset का इस्तेमाल करें. सिस्टम इस बात का ट्रैक रखता है कि कौनसी ऐसेट पहले ही ट्रांसफ़र की जा चुकी हैं. साथ ही, डुप्लीकेट कॉपी हटाने की प्रोसेस अपने-आप पूरी करता है.

सेवाओं में इवेंट सुनना

WearableListenerService क्लास की अवधि बढ़ाएं. सिस्टम, बेस WearableListenerService की लाइफ़साइकल को मैनेज करता है. जब डेटा आइटम या मैसेज भेजने की ज़रूरत होती है, तो यह सेवा से जुड़ जाता है. वहीं, जब कोई काम नहीं होता, तो यह सेवा से अलग हो जाता है.

गतिविधियों में इवेंट सुनना

OnDataChangedListener इंटरफ़ेस लागू करें. जब आपको बदलावों को सिर्फ़ तब सुनना हो, जब उपयोगकर्ता आपके ऐप्लिकेशन का इस्तेमाल कर रहा हो, तो WearableListenerService के बजाय इस इंटरफ़ेस का इस्तेमाल करें.

description: Data Layer API में ऐसेट का इस्तेमाल करके, Android फ़ोन और Wear OS स्मार्टवॉच के बीच इमेज जैसे बड़े बाइनरी ऑब्जेक्ट ट्रांसफ़र करें. keywords_public: Wear OS, Data Layer API, ऐसेट, ब्लूटूथ से डेटा ट्रांसफ़र करना, डेटा सिंक करना, DataMap, PutDataRequest

डेटा सिंक करना

ब्लूटूथ ट्रांसपोर्ट की मदद से, बड़े बाइनरी ऑब्जेक्ट शेयर करने के लिए, जैसे कि किसी दूसरे डिवाइस से आवाज़ की रिकॉर्डिंग, डेटा आइटम में Asset अटैच किया जा सकता है. इसके बाद, डेटा आइटम को रेप्लिकेट किए गए डेटास्टोर में डाला जा सकता है.

ध्यान दें: डेटा लेयर एपीआई, सिर्फ़ Android पर चलने वाले फ़ोन या Wear OS स्मार्टवॉच के साथ मैसेज भेज सकता है और डेटा सिंक कर सकता है. अगर Wear OS डिवाइस को iOS डिवाइस के साथ जोड़ा गया है, तो डेटा लेयर एपीआई काम नहीं करेगा.

इस वजह से, नेटवर्क से कम्यूनिकेट करने के लिए, डेटा लेयर एपीआई का इस्तेमाल मुख्य तरीके के तौर पर न करें. इसके बजाय, अपने Wear OS ऐप्लिकेशन में वही पैटर्न अपनाएं जो फ़ोन ऐप्लिकेशन में अपनाया जाता है. हालांकि, इनमें कुछ मामूली अंतर होते हैं. इनके बारे में Wear OS पर नेटवर्क ऐक्सेस और सिंक करना लेख में बताया गया है.

ऐसेट, डेटा को कैश मेमोरी में सेव करने की प्रोसेस को अपने-आप मैनेज करती हैं. इससे डेटा को फिर से भेजने की ज़रूरत नहीं पड़ती और ब्लूटूथ बैंडविड्थ की बचत होती है. आम तौर पर, फ़ोन ऐप्लिकेशन किसी इमेज को डाउनलोड करता है और उसे स्मार्टवॉच पर दिखाने के लिए सही साइज़ में छोटा करता है. इसके बाद, उसे स्मार्टवॉच के लिए ऐप्लिकेशन के साथ ऐसेट के तौर पर शेयर करता है. यहां दिए गए उदाहरणों से इस पैटर्न के बारे में पता चलता है.

किसी ऐसेट को ट्रांसफ़र करना

Asset क्लास में मौजूद create...() तरीकों में से किसी एक का इस्तेमाल करके, ऐसेट बनाएं. बिटमैप को बाइट कलेक्शन में बदलें. इसके बाद, ऐसेट बनाने के लिए createFromBytes() को कॉल करें, जैसा कि यहां दिए गए सैंपल में दिखाया गया है.

private fun createAssetFromBitmap(bitmap: Bitmap): Asset =
    ByteArrayOutputStream().let { byteStream ->
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream)
        Asset.createFromBytes(byteStream.toByteArray())
    }

इसके बाद, DataMap या PutDataRequest में putAsset() तरीके का इस्तेमाल करके, ऐसेट को डेटा आइटम से अटैच करें. इसके बाद, 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
    }
}

ज़्यादा जानकारी के लिए, GitHub पर DataLayer सैंपल प्रोजेक्ट देखें.