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

Wear OS ডিভাইস ও ফোনের মধ্যে কীভাবে ডেটা সিঙ্ক করতে হয় তা এই ডকুমেন্টে বর্ণনা করা আছে। কখন Data Layer API ব্যবহার করতে হবে এবং কখন আপনার ইনফ্রাস্ট্রাকচার ব্যবহার করতে হবে সেই সম্পর্কে ওভারভিউ নির্দেশিকা দেখুন।

নেটওয়ার্ক থেকে সরাসরি ডেটা পাঠানো ও সিঙ্ক করা

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

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

DataClient কম্পোনেন্ট DataItem বা Asset-এ রিড বা রাইট করার জন্য API এক্সপোজ করে।

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

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

  • ছবি বা এই ধরনের বড় অবজেক্ট ট্রান্সফার করতে Asset ব্যবহার করুন। কোন কোন অ্যাসেট আগেই ট্রান্সফার করা হয়েছে তা সিস্টেম ট্র্যাক করে এবং অটোমেটিক ডুপ্লিকেট সরিয়ে দেয়।

পরিষেবাতে ইভেন্ট শোনা

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

অ্যাক্টিভিটিতে ইভেন্ট শোনা

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

বিবরণ: 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 কাজ করবে না।

এই কারণে, নেটওয়ার্কের সাথে যোগাযোগ করার প্রাথমিক উপায় হিসেবে 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-এর নমুনা প্রোজেক্ট দেখুন।