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

इस दस्तावेज़ में, 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 सैंपल प्रोजेक्ट देखें.