Wear'daki öğeleri aktarın

Bluetooth aktarımı üzerinden, başka bir cihazdan alınan ses kaydı gibi büyük boyutlu nesneleri göndermek için veri öğesine Asset ekleyebilir ve ardından bu veri öğesini, çoğaltılan veri deposuna yerleştirebilirsiniz.

Öğeler, yeniden iletimini önlemek ve Bluetooth bant genişliğini korumak için verilerin önbelleğe alınmasını otomatik olarak gerçekleştirir. Yaygın olarak kullanılan bir yöntem, el uygulamasının bir resmi indirmesi, giyilebilir cihazda görüntülemek için uygun boyuta küçültmesi ve bunu bir öğe olarak giyilebilir uygulamaya aktarmasıdı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 söz konusu olduğunda 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 öğeleri aktarırken iyi performans gösterdiklerinden emin olmak için uygulamalarınızı test edin.

Öğe aktarma

Asset sınıfındaki create...() yöntemlerinden birini kullanarak öğeyi oluşturun. Bir bit eşlemi bayt akışına dönüştürün ve aşağıdaki örnekte gösterildiği gibi öğeyi oluşturmak için createFromBytes() yöntemini ç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, DataMap veya PutDataRequest içindeki putAsset() yöntemini kullanarak öğeyi 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 örnek "PutDataRequest"i kullanmaktadı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 örnek "PutDataMapRequest"i kullanmaktadı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 muhtemelen bu öğeyi bağlantının diğer tarafında okumak ve ayıklamak istersiniz. Aşağıda, bir öğe değişikliğini algılamak ve öğeyi çıkarmak için geri çağırmanın nasıl uygulanacağına ilişkin 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'daki DataKatman örnek projesine göz atın.