以下内容翻译自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<DataApi.DataItemResult> 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"