Verileri senkronize et

Bu belgede, Wear OS cihaz ile elde taşınabilir cihaz arasında verilerin nasıl senkronize edileceği açıklanmaktadır.

Verileri doğrudan ağdan gönderme ve senkronize etme

Doğrudan ağ ile iletişim kurmak için Wear OS uygulamaları oluşturun. Mobil geliştirme için kullandığınız API'leri kullanın ancak Wear OS'e özgü bazı farklılıkları göz önünde bulundurun.

Wear OS Data Layer API'yi kullanarak verileri senkronize etme

Bir DataClient, bileşenlerin DataItem veya Asset'ye okuma ya da yazma işlemi yapması için bir API sunar.

Herhangi bir cihaza bağlı değilken veri öğelerini ve öğeleri ayarlayabilirsiniz. Cihazlar ağ bağlantısı kurduğunda senkronize edilir. Bu veriler uygulamanıza özeldir ve diğer cihazlarda yalnızca uygulamanız tarafından erişilebilir.

  • Bir DataItem, Wear OS ağındaki tüm cihazlarda senkronize edilir. Genellikle küçük boyutludurlar.

  • Resim gibi daha büyük bir nesneyi aktarmak için Asset kullanın. Sistem, hangi öğelerin aktarıldığını takip eder ve otomatik olarak yinelenen öğeleri kaldırır.

Hizmetlerdeki etkinlikleri dinleme

WearableListenerService sınıfını genişletin. Sistem, temel WearableListenerService'nın yaşam döngüsünü yönetir. Veri öğeleri veya mesajlar göndermesi gerektiğinde hizmete bağlanır, iş gerekmediğinde ise hizmetin bağlantısını kaldırır.

Etkinliklerdeki etkinlikleri dinleme

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

Verileri aktarın

Bluetooth üzerinden büyük ikili nesneler (ör. başka bir cihazdan alınan ses kaydı) göndermek için bir veri öğesine Asset ekleyip veri öğesini çoğaltılmış veri deposuna yerleştirebilirsiniz.

Öğeler, yeniden iletimi önlemek ve Bluetooth bant genişliğinden tasarruf etmek için verilerin önbelleğe alınmasını otomatik olarak yönetir. Genel bir yöntem, elde taşınabilir cihaz uygulamasının bir resmi indirmesi, giyilebilir cihazda görüntülemek için uygun boyuta küçültmesi ve giyilebilir cihaz uygulamasına öğe olarak iletmesidir. Aşağıdaki örneklerde bu kalıp 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 öğeleri için 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ı, birçok durumda kullanıcı deneyimini etkiler. Bu nedenle, büyük öğeler aktarılırken uygulamalarınızın iyi performans göstermesini sağlamak için uygulamalarınızı test edin.

Öğe aktarma

create...() sınıfındaki yöntemlerden birini kullanarak öğeyi oluşturun. Asset Bir 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() işlevini çağırı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());
}

Ardından, öğeyi DataMap veya PutDataRequest içinde putAsset() yöntemiyle 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ılmıştı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ılmıştı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);

Öğe alma

Bir öğe oluşturulduğunda, bağlantının diğer tarafında bu öğeyi okumak ve ayıklamak isteyebilirsiniz. Bir öğe değişikliğini algılamak ve öğeyi ayıklamak için geri çağırmanın nasıl uygulanacağına dair bir örneği aşağıda bulabilirsiniz:

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'daki DataLayer örnek projesine bakın.