传输资源

以下内容翻译自android wear的官方教程,本人水平有限,如有错误欢迎指出
home
以下正文


为了通过蓝牙发送大块的二进制数据,比如图片。你可以把Asset
对象赋给data item 并将data item放入重复数据存储处(replicated data store)(前面章节介绍的,可以自动将数据在手表和手机之间分别同步存储一份数据)。

Assets自动的缓存数据以防止数据因网络问题重发。一个常见的应用场景是,手机上下载了一张图片,然后把它压缩到在手表上显示的合适的大小,然后用asset把图片发送到手表上。下面的示例展示了这个应用场景。

注意:尽管数据大小被限制为100KB,但assets仍然可以想传多大就传多大。但是,传输过大的资源在很多情况下会影响用户的体验,所以在传输大资源的时候先要确保你的app的表现是否良好。

传输一个资源

create...()方法创建一个Asset类,在这里我们把一个二进制图片转换成一个比特流然后调用 createFromBytes()
方法来创建这个资源。

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

当你有一个asset之后,用 DataMap
或 PutDataRequest
的 putAsset()方法将它赋给一个data item,然后把data item用 [putDataItem()
](http://developer.android.youdaxue.com/reference/com/google/android/gms/wearable/DataApi.html#putDataItem(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.PutDataRequest))存放到data store。

使用PutDataRequest

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
Asset asset = createAssetFromBitmap(bitmap);
PutDataRequest request = PutDataRequest.create("/image");
request.putAsset("profileImage", asset);
Wearable.DataApi.putDataItem(mGoogleApiClient, request);

使用PutDataMapRequest

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();
PendingResult pendingResult = Wearable.DataApi
        .putDataItem(mGoogleApiClient, request);

接收assets

当asset被建立完成,你可能希望在另一端读取这个asset,下面是通过实现回调来发现asset被改变并读取这个asset:

@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);
      // 对这个 bitmap做一些处理
    }
  }
}

public Bitmap loadBitmapFromAsset(Asset asset) {
    if (asset == null) {
        throw new IllegalArgumentException("Asset must be non-null");
    }
    ConnectionResult result =
           mGoogleApiClient.blockingConnect(TIMEOUT_MS, TimeUnit.MILLISECONDS);
    if (!result.isSuccess()) {
        return null;
    }
    // 将asset转换成文件描述符,并在准备完成前阻塞
    InputStream assetInputStream = Wearable.DataApi.getFdForAsset(
            mGoogleApiClient, asset).await().getInputStream();
            mGoogleApiClient.disconnect();

    if (assetInputStream == null) {
        Log.w(TAG, "Requested an unknown Asset.");
        return null;
    }

    // 将流解码成 bitmap
    return BitmapFactory.decodeStream(assetInputStream);
}

来自译者的话

这一章内容比较简略,像mGoogleApiClient,以及"/image"这些内容在前面的章节已经说明过,奉上链接一份mGoogleApiClient,"/image"

你可能感兴趣的:(传输资源)