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