इस दस्तावेज़ में, Wear OS डिवाइस और फ़ोन या टैबलेट के बीच डेटा सिंक करने का तरीका बताया गया है.
नेटवर्क से सीधे डेटा भेजना और सिंक करना
Wear OS ऐप्लिकेशन बनाएं, ताकि वे सीधे नेटवर्क से कम्यूनिकेट कर सकें. मोबाइल डेवलपमेंट के लिए इस्तेमाल किए जाने वाले एपीआई का ही इस्तेमाल करें. हालांकि, Wear OS के लिए कुछ खास बातों का ध्यान रखें.
Wear OS Data Layer API का इस्तेमाल करके डेटा सिंक करना
DataClient
, कॉम्पोनेंट के लिए एक एपीआई उपलब्ध कराता है, ताकि वे DataItem
या Asset
को पढ़ या लिख सकें.
किसी भी डिवाइस से कनेक्ट न होने पर भी, डेटा आइटम और ऐसेट सेट की जा सकती हैं. जब डिवाइस नेटवर्क कनेक्शन बनाते हैं, तब ये सिंक हो जाते हैं. यह डेटा आपके ऐप्लिकेशन के लिए निजी होता है. इसे सिर्फ़ आपके ऐप्लिकेशन के ज़रिए, अन्य डिवाइसों पर ऐक्सेस किया जा सकता है.
DataItem
को Wear OS नेटवर्क में शामिल सभी डिवाइसों के साथ सिंक किया जाता है. ये आम तौर पर साइज़ में छोटे होते हैं.इमेज जैसे बड़े ऑब्जेक्ट को ट्रांसफ़र करने के लिए,
Asset
का इस्तेमाल करें. सिस्टम यह ट्रैक करता है कि कौनसी ऐसेट पहले ही ट्रांसफ़र की जा चुकी हैं. साथ ही, डुप्लीकेट ऐसेट को अपने-आप हटा देता है.
सेवाओं में इवेंट के लिए सुनना
WearableListenerService
क्लास को एक्सटेंड करें. सिस्टम, बेस WearableListenerService
के लाइफ़साइकल को मैनेज करता है. जब इसे डेटा आइटम या मैसेज भेजने होते हैं, तब यह सेवा से जुड़ जाता है. जब कोई काम नहीं करना होता है, तब यह सेवा से हट जाता है.
गतिविधियों में इवेंट के लिए सुनना
OnDataChangedListener
इंटरफ़ेस लागू करें. जब आपको बदलावों के बारे में सिर्फ़ तब सुनना हो, जब उपयोगकर्ता आपके ऐप्लिकेशन का इस्तेमाल कर रहा हो, तो WearableListenerService
के बजाय इस इंटरफ़ेस का इस्तेमाल करें.
डेटा ट्रांसफ़र करें
ब्लूटूथ ट्रांसपोर्ट के ज़रिए बाइनरी लार्ज ऑब्जेक्ट भेजने के लिए, जैसे कि किसी दूसरे डिवाइस से वॉइस रिकॉर्डिंग, डेटा आइटम में
Asset
अटैच किया जा सकता है. इसके बाद, डेटा आइटम को रेप्लिका किए गए डेटास्टोर में रखा जा सकता है.
ऐसेट, डेटा को फिर से ट्रांसमिट होने से रोकने और ब्लूटूथ बैंडविड्थ को बचाने के लिए, डेटा को अपने-आप कैश मेमोरी में सेव करती हैं. आम तौर पर, हैंडहेल्ड डिवाइस पर मौजूद ऐप्लिकेशन, इमेज को डाउनलोड करता है. इसके बाद, उसे पहनने लायक डिवाइस पर दिखाने के लिए, सही साइज़ में छोटा करता है. इसके बाद, उसे पहनने लायक डिवाइस पर मौजूद ऐप्लिकेशन को ऐसेट के तौर पर भेजता है. यहां दिए गए उदाहरणों में, इस पैटर्न के बारे में बताया गया है.
ध्यान दें: सिद्धांत के तौर पर, डेटा आइटम का साइज़ 100 केबी तक सीमित होता है. हालांकि, असल में इससे बड़े डेटा आइटम का इस्तेमाल किया जा सकता है. बड़े डेटा आइटम के लिए, डेटा को यूनीक पाथ के हिसाब से अलग-अलग करें. साथ ही, सभी डेटा के लिए एक ही पाथ का इस्तेमाल न करें. बड़ी ऐसेट ट्रांसफ़र करने से, कई मामलों में उपयोगकर्ता अनुभव पर असर पड़ता है. इसलिए, अपने ऐप्लिकेशन की जांच करें, ताकि यह पक्का किया जा सके कि बड़ी ऐसेट ट्रांसफ़र करते समय वे अच्छी तरह से काम करते हैं.
किसी ऐसेट को ट्रांसफ़र करना
Asset
क्लास में मौजूद create...()
तरीकों में से किसी एक का इस्तेमाल करके, ऐसेट बनाएं.
बिटमैप को बाइट स्ट्रीम में बदलें. इसके बाद, ऐसेट बनाने के लिए
createFromBytes()
को कॉल करें. इसे यहां दिए गए सैंपल में दिखाया गया है.
Kotlin
private fun createAssetFromBitmap(bitmap: Bitmap): Asset = ByteArrayOutputStream().let { byteStream -> bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream) Asset.createFromBytes(byteStream.toByteArray()) }
Java
private static Asset createAssetFromBitmap(Bitmap bitmap) { final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream); return Asset.createFromBytes(byteStream.toByteArray()); }
इसके बाद, ऐसेट को
DataMap
या
PutDataRequest
में putAsset()
तरीके का इस्तेमाल करके, डेटा आइटम से अटैच करें. इसके बाद, डेटा आइटम को डेटास्टोर में रखने के लिए,
putDataItem()
तरीके का इस्तेमाल करें. इसके उदाहरण यहां दिए गए हैं.
इस उदाहरण में PutDataRequest
का इस्तेमाल किया गया है:
Kotlin
val asset: Asset = BitmapFactory.decodeResource(resources, R.drawable.image).let { bitmap -> createAssetFromBitmap(bitmap) } val request: PutDataRequest = PutDataRequest.create("/image").apply { putAsset("profileImage", asset) } val putTask: Task<DataItem> = Wearable.getDataClient(context).putDataItem(request)
Java
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); Asset asset = createAssetFromBitmap(bitmap); PutDataRequest request = PutDataRequest.create("/image"); request.putAsset("profileImage", asset); Task<DataItem> putTask = Wearable.getDataClient(context).putDataItem(request);
इस उदाहरण में PutDataMapRequest
का इस्तेमाल किया गया है:
Kotlin
val asset: Asset = BitmapFactory.decodeResource(resources, R.drawable.image).let { bitmap -> createAssetFromBitmap(bitmap) } val request: PutDataRequest = PutDataMapRequest.create("/image").run { dataMap.putAsset("profileImage", asset) asPutDataRequest() } val putTask: Task<DataItem> = Wearable.getDataClient(context).putDataItem(request)
Java
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); Asset asset = createAssetFromBitmap(bitmap); PutDataMapRequest dataMap = PutDataMapRequest.create("/image"); dataMap.getDataMap().putAsset("profileImage", asset); PutDataRequest request = dataMap.asPutDataRequest(); Task<DataItem> putTask = Wearable.getDataClient(context).putDataItem(request);
ऐसेट पाना
जब कोई ऐसेट बनाई जाती है, तो हो सकता है कि आपको कनेक्शन के दूसरे हिस्से पर उसे पढ़ना और एक्सट्रैक्ट करना हो. ऐसेट में हुए बदलाव का पता लगाने और ऐसेट को निकालने के लिए, कॉलबैक को लागू करने का तरीका यहां बताया गया है:
Kotlin
override fun onDataChanged(dataEvents: DataEventBuffer) { dataEvents .filter { it.type == DataEvent.TYPE_CHANGED && it.dataItem.uri.path == "/image" } .forEach { event -> val bitmap: Bitmap? = DataMapItem.fromDataItem(event.dataItem) .dataMap.getAsset("profileImage") .let { asset -> loadBitmapFromAsset(asset) } // Do something with the bitmap } } fun loadBitmapFromAsset(asset: Asset): Bitmap? { // Convert asset into a file descriptor and block until it's ready val assetInputStream: InputStream? = Tasks.await(Wearable.getDataClient(context).getFdForAsset(asset)) ?.inputStream return assetInputStream?.let { inputStream -> // Decode the stream into a bitmap BitmapFactory.decodeStream(inputStream) } ?: run { Log.w(TAG, "Requested an unknown Asset.") null } }
Java
@Override public void onDataChanged(DataEventBuffer dataEvents) { for (DataEvent event : dataEvents) { if (event.getType() == DataEvent.TYPE_CHANGED && event.getDataItem().getUri().getPath().equals("/image")) { DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem()); Asset profileAsset = dataMapItem.getDataMap().getAsset("profileImage"); Bitmap bitmap = loadBitmapFromAsset(profileAsset); // Do something with the bitmap } } } public Bitmap loadBitmapFromAsset(Asset asset) { if (asset == null) { throw new IllegalArgumentException("Asset must be non-null"); } // Convert asset into a file descriptor and block until it's ready InputStream assetInputStream = Tasks.await(Wearable.getDataClient(context).getFdForAsset(asset)) .getInputStream(); if (assetInputStream == null) { Log.w(TAG, "Requested an unknown Asset."); return null; } // Decode the stream into a bitmap return BitmapFactory.decodeStream(assetInputStream); }
ज़्यादा जानकारी के लिए, GitHub पर DataLayer का सैंपल प्रोजेक्ट देखें.