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

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

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

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

এই দৃশ্যটিকে সমর্থন করার জন্য আপনি কীভাবে আপনার Wear OS অ্যাপ এবং এর সহযোগী মোবাইল অ্যাপ কনফিগার করতে পারেন তা এই দস্তাবেজটি বর্ণনা করে।

প্রস্তুতি

ডেটা স্থানান্তর প্রক্রিয়া DataItem বস্তুগুলিকে ভিন্নভাবে পরিচালনা করে, কোন অ্যাপটি ডেটার মালিক তার উপর নির্ভর করে:

Wear OS অ্যাপের মালিকানাধীন বস্তু
এই বস্তুগুলি Wear OS ডিভাইসে সংরক্ষিত আছে।
মোবাইল অ্যাপের মালিকানাধীন বস্তু

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

সংরক্ষণাগার বিতরণের পরপরই, পরিধানযোগ্য ডেটা স্তরটি onDataChanged() শ্রোতাকে আহ্বান করে, একইভাবে Wear OS ডিভাইস দ্বারা ডেটা লেখার সময় আপনার অ্যাপকে কীভাবে বিজ্ঞপ্তি দেওয়া হয়।

স্থানান্তরিত ডেটা সংরক্ষণ করুন

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

নিশ্চিত করুন যে নিম্নলিখিত প্রতিটি শর্ত সত্য:

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

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

পুরানো মোবাইল ডিভাইস থেকে ডেটা গ্রহণ করুন

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

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

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

    <service
    android:name=".MyWearableListenerService"
    android:exported="true">
    <intent-filter>
        ...
        <action android:name="com.google.android.gms.wearable.NODE_MIGRATED" />
        <data android:scheme="wear" />
    </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 suspend 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())
                }
            }
    
            CoroutineScope(Job() + Dispatchers.IO).launch {
                for (dataItem in dataItemsToHandle) {
                    handleDataItem(nodeId, dataItem)
                }
            }
        }
    }
    
    

    জাভা

    
    public class MyWearableListenerService extends WearableListenerService {
        private final DataClient dataClient = Wearable.getDataClient(this);
    
        private boolean shouldHandleDataItem(String nodeId, DataItem dataItem) {
            // Your logic here
            return Objects.requireNonNull(dataItem.getUri().getPath())
                    .startsWith("/my_feature_path/");
        }
    
        private void handleDataItem(String nodeId, DataItem dataItem) {
            byte[] data = dataItem.getData();
            String path = dataItem.getUri().getPath();
            // Your logic here
            if (data != null && path != null && Arrays.toString(data)
                    .startsWith("Please restore")) {
                assert path != null;
                dataClient.putDataItem(
                        PutDataRequest.create(path).setData(data));
            }
        }
    
        @Override
        public void onNodeMigrated(@NonNull String nodeId, DataItemBuffer archive) {
            List<DataItem> dataItemsToHandle = new ArrayList<>();
    
            for (DataItem dataItem : archive) {
                if (shouldHandleDataItem(nodeId, dataItem)) {
                    dataItemsToHandle.add(dataItem.freeze());
                }
            }
    
            Thread thread = new Thread(() -> {
                for (DataItem dataItem : dataItemsToHandle) {
                    handleDataItem(nodeId, dataItem);
                }
            });
            thread.start();
        }
    }
    
    
{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}