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

এই ডকুমেন্টটিতে একটি Wear OS ডিভাইস এবং একটি ফোনের মধ্যে ডেটা সিঙ্ক্রোনাইজ করার পদ্ধতি বর্ণনা করা হয়েছে। কখন ডেটা লেয়ার এপিআই (Data Layer API) এবং কখন আপনার নিজস্ব পরিকাঠামো ব্যবহার করতে হবে, তা জানতে ওভারভিউ গাইডেন্সটি দেখুন।

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

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

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

একটি DataClient কম্পোনেন্টগুলির জন্য একটি DataItem বা Asset থেকে ডেটা পড়া বা লেখার জন্য একটি API প্রদান করে।

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

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

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

পরিষেবাগুলিতে অনুষ্ঠানগুলির জন্য শুনুন

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

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

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

বিবরণ: ডেটা লেয়ার এপিআই-এর অ্যাসেটস ব্যবহার করে অ্যান্ড্রয়েড ফোন এবং ওয়্যার ওএস ঘড়ির মধ্যে ছবির মতো বড় বাইনারি অবজেক্ট স্থানান্তর করুন। কীওয়ার্ডস_পাবলিক: ওয়্যার ওএস, ডেটা লেয়ার এপিআই, অ্যাসেটস, ব্লুটুথ ডেটা ট্রান্সফার, ডেটা সিনক্রোনাইজেশন, ডেটাম্যাপ, পুটডেটারিকোয়েস্ট

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

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

দ্রষ্টব্য: ডেটা লেয়ার এপিআই শুধুমাত্র অ্যান্ড্রয়েড চালিত ফোন অথবা ওয়্যার ওএস ঘড়ির সাথেই বার্তা পাঠাতে এবং ডেটা সিঙ্ক্রোনাইজ করতে পারে। যদি কোনো ওয়্যার ওএস ডিভাইস একটি আইওএস ডিভাইসের সাথে পেয়ার করা থাকে, তাহলে ডেটা লেয়ার এপিআই কাজ করবে না।

এই কারণে, কোনো নেটওয়ার্কের সাথে যোগাযোগের প্রধান উপায় হিসেবে ডেটা লেয়ার এপিআই (Data Layer API) ব্যবহার করবেন না। এর পরিবর্তে, আপনার Wear OS অ্যাপে ফোন অ্যাপের মতোই একই পদ্ধতি অনুসরণ করুন—তবে কিছু সামান্য পার্থক্য থাকবে, যা Wear OS-এ নেটওয়ার্ক অ্যাক্সেস এবং সিঙ্ক (Network access and sync on 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
    }
}

আরও তথ্যের জন্য, গিটহাবে DataLayer নমুনা প্রকল্পটি দেখুন।