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

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

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

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

Wear OS Data Layer API का इस्तेमाल करके डेटा सिंक करना

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

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

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

  • किसी बड़ी चीज़ को ट्रांसफ़र करने के लिए, 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 पर नेटवर्क ऐक्सेस और सिंक करना लेख में बताया गया है.

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

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

Asset क्लास में मौजूद create...() तरीकों में से किसी एक का इस्तेमाल करके, ऐसेट बनाएं. बिटमैप को बाइट ऐरे में बदलें. इसके बाद, ऐसेट बनाने के लिए 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
    }
}

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