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

इस दस्तावेज़ में, 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);

ऐसेट पाना

जब कोई ऐसेट बनाई जाती है, तो शायद आपको उसे कनेक्शन के दूसरे हिस्से पर पढ़ना और एक्सट्रैक्ट करना हो. ऐसेट में हुए बदलाव का पता लगाने और ऐसेट को निकालने के लिए, कॉलबैक को लागू करने का तरीका यहां बताया गया है:

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(this).getFdForAsset(asset))
            ?.inputStream

    return assetInputStream?.let { inputStream ->
        // Decode the stream into a bitmap
        BitmapFactory.decodeStream(inputStream)
    } ?: run {
        // Requested an unknown asset
        null
    }
}

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