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

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

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

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

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

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

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

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

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

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

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

ক্রিয়াকলাপে ইভেন্টগুলির জন্য শুনুন

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

তথ্য স্থানান্তর

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

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

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

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

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(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
    }
}

জাভা

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