Kalıcı verileri senkronize et

Bu dokümanda, Wear OS cihaz ile avuç içi cihaz arasında verilerin nasıl senkronize edileceği açıklanmaktadır.

Doğrudan ağdan veri gönderme ve senkronize etme

Doğrudan ağ ile iletişim kurmak için Wear OS uygulamaları oluşturma Mobil geliştirme için kullandığınız API'lerin aynısını kullanın ancak Wear OS'e özgü bazı farklılıkları unutmayın.

Wear OS Data Katman API'yi kullanarak verileri senkronize etme

DataClient, bileşenlerin DataItem veya Asset üzerinde okuması ya da yazması için API sunar.

Herhangi bir cihaza bağlı değilken veri öğelerini ve öğeleri ayarlamak mümkündür. Cihazlar bir ağ bağlantısı kurduğunda bu dosyalar senkronize edilir. Bu veriler uygulamanıza özeldir ve yalnızca diğer cihazlardaki uygulamanız tarafından erişilebilir.

  • DataItem, Wear OS ağındaki tüm cihazlar genelinde senkronize edilir. Boyutları genellikle küçüktür.

  • Resim gibi daha büyük bir nesneyi aktarmak için Asset kullanın. Sistem, hangi öğelerin zaten aktarıldığını izler ve tekilleştirme işlemini otomatik olarak gerçekleştirir.

Hizmetlerdeki etkinlikleri dinleyin

WearableListenerService sınıfını genişletin. Sistem, temel WearableListenerService yaşam döngüsünü yönetir, veri öğeleri veya mesaj göndermesi gerektiğinde hizmete bağlanır ve herhangi bir çalışma gerekmediğinde hizmet bağlantısını kaldırır.

Etkinliklerdeki etkinlikleri dinleyin

OnDataChangedListener arayüzünü uygulayın. Yalnızca kullanıcı uygulamanızı etkin bir şekilde kullanırken değişiklikleri dinlemek istediğinizde WearableListenerService yerine bu arayüzü kullanın.

Verileri aktarma

Bluetooth aktarımı üzerinden başka bir cihazdaki ses kaydı gibi ikili büyük nesneleri göndermek için bir veri öğesine Asset ekleyebilir ve ardından veri öğesini çoğaltılan veri deposuna ekleyebilirsiniz.

Öğeler, yeniden iletimi önlemek ve Bluetooth bant genişliğini korumak için verilerin önbelleğe alınmasını otomatik olarak işler. Avuç içi uygulamaların bir resmi indirmesi, giyilebilir cihazda görüntülemek için uygun boyuta küçültmesi ve giyilebilir cihaz uygulamasına bir öğe olarak iletmesi yaygın bir kalıptır. Aşağıdaki örneklerde bu düzen gösterilmektedir.

Not: Veri öğelerinin boyutu teorik olarak 100 KB ile sınırlı olsa da, pratikte daha büyük veri öğeleri kullanılabilir. Daha büyük veri öğelerinde verileri benzersiz yollara göre ayırın ve tüm veriler için tek bir yol kullanmaktan kaçının. Büyük öğelerin aktarılması, kullanıcı deneyimini birçok durumda etkiler. Bu nedenle, uygulamalarınızı test ederek büyük öğeleri aktarırken iyi performans gösterdiklerinden emin olun.

Öğe aktarma

Asset sınıfındaki create...() yöntemlerinden birini kullanarak öğeyi oluşturun. Bit eşlemi bayt akışına dönüştürün ve ardından aşağıdaki örnekte gösterildiği gibi öğeyi oluşturmak için createFromBytes() çağrısını yapın.

Kotlin

private fun createAssetFromBitmap(bitmap: Bitmap): Asset =
    ByteArrayOutputStream().let { byteStream ->
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream)
        Asset.createFromBytes(byteStream.toByteArray())
    }

Java

private static Asset createAssetFromBitmap(Bitmap bitmap) {
    final ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
    return Asset.createFromBytes(byteStream.toByteArray());
}

Daha sonra öğeyi DataMap veya PutDataRequest içinde putAsset() yöntemini kullanarak bir veri öğesine ekleyin. Ardından, aşağıdaki örneklerde gösterildiği gibi putDataItem() yöntemini kullanarak veri öğesini veri deposuna yerleştirin.

Aşağıdaki örnekte PutDataRequest kullanılmaktadır:

Kotlin

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)

Java

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

Aşağıdaki örnekte PutDataMapRequest kullanılmaktadır:

Kotlin

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)

Java

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

Öğeleri al

Bir öğe oluşturulduğunda, muhtemelen onu bağlantının diğer tarafında okumak ve çıkarmak istersiniz. Aşağıda, öğe değişikliğini tespit etmek ve öğeyi ayıklamak için geri çağırma işleminin nasıl uygulanacağına dair bir örnek verilmiştir:

Kotlin

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

Java

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

Daha fazla bilgi için GitHub'da Datalayer örnek projesine bakın.