নতুন মোবাইল ডিভাইসে Wear OS ডেটা ট্রান্সফার করা

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

Wear OS 4 থেকে শুরু করে, ব্যবহারকারীরা নতুন মোবাইল ডিভাইসের সাথে কানেক্ট করলে, তারা নতুন মোবাইল ডিভাইসে Wear OS ডেটা ট্রান্সফার করতে পারবেন। ডেটা ট্রান্সফার করা হলে তা অটোমেটিক সিঙ্ক হয়ে যায়।

ব্যবহারকারী ট্রান্সফারের অনুরোধ করলে, ওয়্যারেবল ডেটা লেয়ার DataItem অবজেক্ট ডেলিভার করে, যা মূলত একটি মোবাইল ডিভাইসে সেভ করা থাকে এবং অন্য মোবাইল ডিভাইসে ট্রান্সফার করা হয়। এটি আপনার অ্যাপের ব্যবহারকারীদের জন্য একটি বাধাহীন অভিজ্ঞতা প্রদান করে।

এই পরিস্থিতিতে কাজ করার জন্য আপনি কীভাবে Wear OS অ্যাপ ও এর কম্প্যানিয়ন মোবাইল অ্যাপ কনফিগার করতে পারবেন, তা এই ডকুমেন্টে বর্ণনা করা হয়েছে।

প্রস্তুতি

ডেটা ট্রান্সফার প্রসেস DataItem অবজেক্টকে আলাদাভাবে ম্যানেজ করে, এটি নির্ভর করে কোন অ্যাপের ডেটার উপর:

Wear OS অ্যাপের মালিকানাধীন অবজেক্ট
এইসব অবজেক্ট Wear OS ডিভাইসে সংরক্ষিত থাকে।
মোবাইল অ্যাপের মালিকানাধীন অবজেক্ট

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

আর্কাইভ ডেলিভার করার সাথে সাথেই, Wearable Data Layer onNodeMigrated() লিসনারকে ইনভোক করে, ঠিক যেভাবে Wear OS ডিভাইস ডেটা লেখার সময় আপনার অ্যাপকে বিজ্ঞপ্তি পাঠানো হয়।

ট্রান্সফার করা ডেটা সংরক্ষণ করা

ট্রান্সফার করা DataItem অবজেক্ট সেভ করে রাখার দায়িত্ব আপনার অ্যাপের। নতুন মোবাইল ডিভাইসে ডেটা ডেলিভার করার কিছুক্ষণ পরেই, আর্কাইভ করা ডেটা পুরনো ডিভাইস থেকে মুছে দেওয়া হয়।

নিচে উল্লেখ করা প্রতিটি শর্ত পূরণ হচ্ছে কিনা তা নিশ্চিত করুন:

  1. ট্রান্সফারে যুক্ত থাকা দুটি মোবাইল ডিভাইসেই আপনার অ্যাপ ইনস্টল করা আছে।
  2. প্রতিটি মোবাইল ডিভাইসে ইনস্টল করা মোবাইল অ্যাপে প্যাকেজ সিগনেচার থাকে যা মিলে যায়।

অন্যথায়, আর্কাইভ করা DataItem অবজেক্ট ডেলিভার করা হয় না এবং পরিবর্তে সেগুলি বাতিল করা হয়।

পুরনো মোবাইল ডিভাইস থেকে ডেটা পাওয়া

পুরনো মোবাইল ডিভাইসে আর্কাইভ করা ডেটা নতুন মোবাইল ডিভাইসে পেতে হলে, আপনার মোবাইল অ্যাপকে onNodeMigrated() কলব্যাক ইমপ্লিমেন্ট করতে হবে, এটি WearableListenerService ক্লাসের অংশ। এটি করতে, নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:

  1. আপনার মোবাইল অ্যাপের বিল্ড ফাইলে, Google Play পরিষেবায় থাকা পরিধানযোগ্য লাইব্রেরির লেটেস্ট ভার্সনের উপর নির্ভরতা অন্তর্ভুক্ত করুন:

    dependencies {
        ...
        implementation 'com.google.android.gms:play-services-wearable:20.0.1'
    }
    
  2. আপনার অ্যাপের ম্যানিফেস্ট ফাইলে WearableListenerService ঘোষণা ও এক্সপোর্ট করুন:

    <service
        android:name=".snippets.datalayer.MyWearableListenerService"
        android:exported="true"
        tools:ignore="ExportedService">
        <intent-filter>
            <action android:name="com.google.android.gms.wearable.NODE_MIGRATED" />
            <data android:scheme="wear" android:host="*" />
        </intent-filter>
    </service>

  3. WearableListenerService-এর এক্সটেনশন ও onNodeMigrated()-এর ওভাররাইড সহ একটি পরিষেবা ক্লাস তৈরি করুন।

    class MyWearableListenerService : WearableListenerService() {
        val dataClient: DataClient = Wearable.getDataClient(this)
    
        private fun shouldHandleDataItem(nodeId: String, dataItem: DataItem): Boolean {
            // Your logic here
            return dataItem.uri.path?.startsWith("/my_feature_path/") == true
        }
    
        private fun handleDataItem(nodeId: String, dataItem: DataItem) {
            val data = dataItem.data ?: return
            val path = dataItem.uri.path ?: return
            // Your logic here
            if (data.toString().startsWith("Please restore")) {
                dataClient.putDataItem(PutDataRequest.create(path).setData(data))
            }
        }
    
        override fun onNodeMigrated(nodeId: String, archive: DataItemBuffer) {
            val dataItemsToHandle = mutableListOf<DataItem>()
    
            for (dataItem in archive) {
                if (shouldHandleDataItem(nodeId, dataItem)) {
                    dataItemsToHandle.add(dataItem.freeze())
                }
            }
    
            // Callback stops automatically after 20 seconds of data processing.
            // If you think you need more time, delegate to a coroutine or thread.
            runBlocking {
                for (dataItem in dataItemsToHandle) {
                    handleDataItem(nodeId, dataItem)
                }
            }
        }
    }