ডেটা সিঙ্ক করুন

এই ডকুমেন্টটি বর্ণনা করে কিভাবে একটি Wear OS ডিভাইস এবং একটি হ্যান্ডহেল্ড ডিভাইসের মধ্যে ডেটা সিঙ্ক্রোনাইজ করতে হয়।

নেটওয়ার্ক থেকে সরাসরি ডেটা পাঠান এবং সিঙ্ক করুন

নেটওয়ার্কের সাথে সরাসরি যোগাযোগের জন্য Wear OS অ্যাপ তৈরি করুন। মোবাইল ডেভেলপমেন্টের জন্য আপনি যে API গুলি ব্যবহার করেন সেই একই API গুলি ব্যবহার করুন, তবে Wear-OS-নির্দিষ্ট কিছু পার্থক্য মনে রাখবেন।

Wear OS ডেটা লেয়ার API ব্যবহার করে ডেটা সিঙ্ক্রোনাইজ করুন

একটি DataClient একটি API প্রকাশ করে যাতে উপাদানগুলি DataItem বা Asset এ পড়তে বা লিখতে পারে।

কোনও ডিভাইসের সাথে সংযুক্ত না থাকাকালীন ডেটা আইটেম এবং সম্পদ সেট করা সম্ভব। ডিভাইসগুলি যখন একটি নেটওয়ার্ক সংযোগ স্থাপন করে তখন সেগুলি সিঙ্ক্রোনাইজ করা হয়। এই ডেটা আপনার অ্যাপের ব্যক্তিগত এবং অন্যান্য ডিভাইসে শুধুমাত্র আপনার অ্যাপের কাছে অ্যাক্সেসযোগ্য।

  • একটি Wear OS নেটওয়ার্কের সমস্ত ডিভাইসে একটি DataItem সিঙ্ক্রোনাইজ করা হয়। এগুলি সাধারণত আকারে ছোট হয়।

  • একটি বৃহত্তর বস্তু, যেমন একটি চিত্র স্থানান্তর করতে একটি Asset ব্যবহার করুন। সিস্টেমটি কোন সম্পদ ইতিমধ্যে স্থানান্তরিত হয়েছে তা ট্র্যাক করে এবং স্বয়ংক্রিয়ভাবে ডিডুপ্লিকেশন সম্পাদন করে।

পরিষেবার ইভেন্টগুলি শুনুন

WearableListenerService ক্লাসটি প্রসারিত করুন। সিস্টেমটি বেস WearableListenerService এর জীবনচক্র পরিচালনা করে, যখন ডেটা আইটেম বা বার্তা পাঠানোর প্রয়োজন হয় তখন পরিষেবাটির সাথে আবদ্ধ হয় এবং যখন কোনও কাজের প্রয়োজন হয় না তখন পরিষেবাটি আনবাইন্ড করে।

কার্যকলাপের ঘটনাগুলি শুনুন

OnDataChangedListener ইন্টারফেসটি বাস্তবায়ন করুন। ব্যবহারকারী যখন সক্রিয়ভাবে আপনার অ্যাপ ব্যবহার করছেন তখনই পরিবর্তনগুলি শুনতে চাইলে WearableListenerService এর পরিবর্তে এই ইন্টারফেসটি ব্যবহার করুন।

ডেটা স্থানান্তর করুন

ব্লুটুথ ট্রান্সপোর্টের মাধ্যমে বাইনারি বৃহৎ বস্তু পাঠাতে, যেমন অন্য ডিভাইস থেকে ভয়েস রেকর্ডিং, আপনি একটি ডেটা আইটেমের সাথে একটি Asset সংযুক্ত করতে পারেন এবং তারপর ডেটা আইটেমটি প্রতিলিপিকৃত ডেটাস্টোরে রাখতে পারেন।

পুনঃপ্রচার রোধ করতে এবং ব্লুটুথ ব্যান্ডউইথ সংরক্ষণের জন্য সম্পদগুলি স্বয়ংক্রিয়ভাবে ডেটা ক্যাশিং পরিচালনা করে। একটি সাধারণ প্যাটার্ন হল একটি হ্যান্ডহেল্ড অ্যাপের একটি ছবি ডাউনলোড করা, পরিধেয় ডিভাইসে প্রদর্শনের জন্য উপযুক্ত আকারে সঙ্কুচিত করা এবং পরিধেয় অ্যাপে সম্পদ হিসাবে প্রেরণ করা। নিম্নলিখিত উদাহরণগুলি এই প্যাটার্নটি প্রদর্শন করে।

দ্রষ্টব্য: যদিও তাত্ত্বিকভাবে ডেটা আইটেমের আকার ১০০ কিলোবাইট পর্যন্ত সীমাবদ্ধ, বাস্তবে বৃহত্তর ডেটা আইটেম ব্যবহার করা যেতে পারে। বৃহত্তর ডেটা আইটেমের জন্য, অনন্য পাথ দ্বারা ডেটা পৃথক করুন এবং সমস্ত ডেটার জন্য একটি একক পাথ ব্যবহার করা এড়িয়ে চলুন। বৃহৎ সম্পদ স্থানান্তর অনেক ক্ষেত্রে ব্যবহারকারীর অভিজ্ঞতাকে প্রভাবিত করে, তাই বৃহৎ সম্পদ স্থানান্তর করার সময় আপনার অ্যাপগুলি ভালভাবে কাজ করে কিনা তা নিশ্চিত করতে পরীক্ষা করুন।

একটি সম্পদ স্থানান্তর করুন

Asset ক্লাসের create...() পদ্ধতিগুলির একটি ব্যবহার করে সম্পদ তৈরি করুন। একটি বিটম্যাপকে বাইট স্ট্রিমে রূপান্তর করুন এবং তারপর createFromBytes() কল করে সম্পদ তৈরি করুন, যেমনটি নিম্নলিখিত নমুনায় দেখানো হয়েছে।

কোটলিন

private fun createAssetFromBitmap(bitmap: Bitmap): Asset =
    ByteArrayOutputStream().let { byteStream ->
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream)
        Asset.createFromBytes(byteStream.toByteArray())
    }

জাভা

private static Asset createAssetFromBitmap(Bitmap bitmap) {
    final ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
    return Asset.createFromBytes(byteStream.toByteArray());
}

এরপর, DataMap অথবা PutDataRequestputAsset() পদ্ধতি ব্যবহার করে একটি ডেটা আইটেমের সাথে অ্যাসেটটি সংযুক্ত করুন। তারপর নিম্নলিখিত নমুনাগুলিতে দেখানো putDataItem() পদ্ধতি ব্যবহার করে ডেটা আইটেমটি ডেটাস্টোরে রাখুন।

নিম্নলিখিত নমুনাটি PutDataRequest ব্যবহার করে:

কোটলিন

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)

জাভা

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 ব্যবহার করে:

কোটলিন

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)

জাভা

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 নমুনা প্রকল্পটি দেখুন।