Kalıcı verileri senkronize et

Bu dokümanda, Wear OS cihaz ile elde etti.

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

Doğrudan ağ ile iletişim kurmak için Wear OS uygulamaları oluşturma Aynısını kullan Mobil geliştirme için kullandığınız ancak Wear-OS'e özgü bazı API'ler göz önünde bulunduruyoruz.

Wear OS Data Katman API'yi kullanarak verileri senkronize etme

DataClient, bileşenlerin bir DataItem veya Asset.

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 aktarıldığını izler ve otomatik olarak tekilleştirilir.

Hizmetlerdeki etkinlikleri dinleyin

WearableListenerService sınıfını genişletin. Sistem, temel WearableListenerService ürününün yaşam döngüsü boyunca geçerlidir. Bu durumda, veri öğeleri veya mesajlar göndermesi ve çalışma olmadığında hizmetin bağlantısını kaldırması gerekir. gerekir.

Etkinliklerdeki etkinlikleri dinleyin

OnDataChangedListener arayüzünü uygulayın. Bunun yerine bu arayüzü kullanın yalnızcaWearableListenerService kullandığının bir göstergesidir.

Verileri aktarma

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

Öğeler, yeniden iletimi önlemek için verilerin önbelleğe alınmasını otomatik olarak işler. koruyabilirsiniz. Avuç içi uygulamalarının resim indirip uygun boyuta küçültmesi yaygın bir kalıptır. ve giyilebilir cihazda öğe olarak aktarmak için kullanılabilir. Aşağıdaki örnekler nasıl oluşturulduğunu göstereceğim.

Not: Veri öğelerinin boyutu teorik olarak 100 KB ile sınırlı olsa da, pratikte daha büyük veri öğeleri kullanılabilir. Örneğin, daha büyük veri öğelerini, verileri benzersiz yollarla ayırın ve tüm veriler için tek bir yol kullanarak. Büyük öğelerin aktarılması, birçok farklı cihazda kullanıcı deneyimini etkiler. Bu nedenle, büyük öğeleri aktarırken iyi performans gösterdiklerinden emin olmak için uygulamalarınızı test edin.

Öğe aktarma

Şu öğedeki create...() yöntemlerinden birini kullanarak öğeyi oluşturun: Asset sınıfı. Bit eşlemi bayt akışına dönüştürüp şunu çağırın: createFromBytes() öğesini aşağıdaki örnekte gösterildiği gibi oluşturun.

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 şurada putAsset() yöntemini kullanarak bir veri öğesine ekleyin: DataMap veya PutDataRequest. Ardından, putDataItem() yöntemini çağırın.

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 bunu, bağlantının diğer tarafında yapar. Burada, geri çağırma işlevini kullanın:

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.