Verileri senkronize et

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

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

Ağla doğrudan 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'a özgü bazı farklılıkları göz önünde bulundurun.

Wear OS Veri Katmanı API'sini kullanarak verileri senkronize etme

DataClient, bileşenlerin DataItem veya Asset'de okuma veya yazma yapması için bir API sağlar.

Hiçbir cihaza bağlı değilken veri öğelerini ve öğelerini ayarlamak mümkündür. Cihazlar ağ bağlantısı kurarken senkronize edilir. Bu veriler uygulamanız için özeldir ve yalnızca uygulamanızın diğer cihazlarda erişimine açıktır.

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

  • 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 tekilleştirme işlemi gerçekleştirir.

Hizmetlerdeki etkinlikleri dinleme

WearableListenerService sınıfını genişletin. Sistem, veri öğeleri veya mesaj göndermesi gerektiğinde hizmete bağlanarak ve iş gerekmediğinde hizmetin bağlantısını kaldırarak temel WearableListenerService öğesinin yaşam döngüsünü yönetir.

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 aktarımı üzerinden büyük ikili nesneler (ör. başka bir cihazdan alınan ses kaydı) göndermek için bir veri öğesine Asset ekleyebilir ve ardından veri öğesini kopyalanan veri deposuna koyabilirsiniz.

Öğeler, yeniden iletimi önlemek ve Bluetooth bant genişliğini korumak için verilerin önbelleğe alınmasını otomatik olarak yönetir. El uygulamasının bir resmi indirmesi, giyilebilir cihazda gösterilecek şekilde uygun bir boyuta küçültmesi ve giyilebilir cihaz uygulamasına öğe olarak aktarması yaygın bir kalıptır. Aşağıdaki örnekler bu kalıbı göstermektedir.

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ı çoğu durumda kullanıcı deneyimini etkiler. Bu nedenle, büyük öğeleri aktarırken iyi performans göstermeleri için uygulamalarınızı test edin.

Öğe aktarma

Asset sınıfındaki create...() yöntemlerinden birini kullanarak öğeyi oluşturun. Bir bitmap'i 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.

KotlinJava
private fun createAssetFromBitmap(bitmap: Bitmap): Asset =
    ByteArrayOutputStream().let { byteStream ->
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream)
        Asset.createFromBytes(byteStream.toByteArray())
    }
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'teki 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ılır:

KotlinJava
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)
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ılır:

KotlinJava
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)
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 muhtemelen bağlantının diğer tarafında öğeyi okumak ve ayıklamak istersiniz. Bir öğe değişikliğini algılamak ve öğeyi ayıklamak için geri çağırma işlevinin nasıl uygulanacağına dair bir örnek aşağıda verilmiştir:

KotlinJava
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
    }
}
@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.