Wear OS verilerini yeni bir mobil cihaza aktarma

Kullanıcılar Wear OS cihaz kurulumu yaparken Wear OS cihazlarını bir cihaza bağlarlar. mobil cihazda devre dışı bırakabilirsiniz. Kullanıcı daha sonra yeni bir mobil cihaz almaya karar verebilir ve mevcut Wear OS cihazını bu yeni mobil cihaza bağlayabilirler. Bazı veriler bir Wear OS cihazıyla ilgili veriler şu anda bağlı olan mobil cihazda depolanıyorsa.

Wear OS 4'ten itibaren, kullanıcılar yeni bir mobil cihaza bağlandıklarında Wear OS verilerini yeni mobil cihaza aktarın. Veriler otomatik olarak senkronize edilir bir şifre ekleyebilirsiniz.

Kullanıcı bir aktarım isteğinde bulunduğunda Giyilebilir Veri Katmanı bunu yayınlar İlk olarak bir mobil cihazda depolanan DataItem nesne mobil cihaz Bu sayede, uygulamanızın kullanıcılarına sorunsuz bir deneyim sunabilirsiniz.

Bu dokümanda, Wear OS uygulamanızı nasıl yapılandırabileceğiniz ve tamamlayıcı mobil uygulamayı kullanarak bu senaryoyu destekleyebilirsiniz.

Hazırlık

Veri aktarım işlemi, bağlı olarak DataItem nesneyi farklı şekillerde işler. verilerin sahibi olan uygulama:

Wear OS uygulamasına ait nesneler
Bu nesneler Wear OS cihazda korunur.
Mobil uygulamaya ait nesneler

Bu nesneler eski cihazda arşivlenir. Ardından sistem, Arşivlenmiş verileri bir DataItemBuffer nesnesine aktarır ve bu verileri mobil uygulama yüklü olmalıdır.

Arşiv teslim edildikten hemen sonra Giyilebilir Veri Katmanı onDataChanged() dinleyicisi, uygulamanıza bildirim gönderilmesine benzer şekilde Veriler Wear OS cihaz tarafından yazıldığında.

Aktarılan verileri koru

Aktarılan DataItem nesneleri korumak uygulamanızın sorumluluğundadır. Veriler yeni mobil cihaza teslim edildikten kısa bir süre sonra, arşiv eski cihazdan silinmiş olabilir.

Aşağıdaki koşulların her birinin doğru olduğundan emin olun:

  1. Uygulamanız, aktarmalısınız.
  2. Her mobil cihazda yüklü mobil uygulamaların paketi vardır. eşleşen imzalar yer alır.

Aksi takdirde, arşivlenen DataItem nesneleri yayınlanmaz ve silindi.

Eski mobil cihazdan veri alma

Eski mobil cihazda arşivlenmiş yeni mobil cihazdaki verileri almak için mobil uygulamanızın onNodeMigrated() geri çağırmasını uygulaması gerekir. WearableListenerService sınıfının bir parçası. Bunun için aşağıdaki adımları uygulayın: için şu adımları izleyin:

  1. Mobil uygulamanızın derleme dosyasına en son sürüme bağımlılık ekleyin son 30 güne kadar

    dependencies {
        ...
        implementation 'com.google.android.gms:play-services-wearable:18.2.0'
    }
    
  2. Uygulamanızda WearableListenerService öğesini beyan edip dışa aktarın manifesto dosyası:

    <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 kapsamını genişleten ve geçersiz kılma işlemlerini içeren bir hizmet sınıfı oluşturun. onNodeMigrated().

    Kotlin

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

    Java

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