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

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

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

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

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

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 अटैच किया जा सकता है. जैसे, किसी दूसरे डिवाइस से की गई वॉइस रिकॉर्डिंग. इसके बाद, डेटा आइटम को रेप्लिका किए गए डेटास्टोर में रखा जा सकता है. हालांकि, अगर दो कनेक्ट किए गए डिवाइसों के बीच सिर्फ़ एक बार डेटा ट्रांसफ़र करना है, तो सोचें कि क्या सीधे तौर पर डेटा ट्रांसफ़र करना ज़्यादा सही रहेगा.

ध्यान दें: Data Layer API, सिर्फ़ Android या Wear OS घड़ियों पर चलने वाले फ़ोन के साथ मैसेज भेज सकता है और डेटा सिंक कर सकता है. अगर Wear OS डिवाइस को iOS डिवाइस के साथ पेयर किया जाता है, तो 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())
    }

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