Android Wear数据层资源传输详解 - 基于kesenhoo/android-training-course-in-chinese项目
概述
在Android Wear开发中,资源(Assets)传输是实现可穿戴设备与手持设备间大数据交换的关键技术。本文将深入讲解如何在Android Wear应用中使用Assets进行高效的数据传输,包括资源创建、发送和接收的全过程。
为什么需要资源传输
在可穿戴设备与手持设备通信时,我们经常需要传输图片等二进制数据。直接传输这些数据会面临以下挑战:
- 蓝牙带宽有限,大文件传输效率低
- 重复传输相同内容浪费资源
- 数据元大小限制(100KB)
Android Wear提供的Asset机制完美解决了这些问题,它能够:
- 自动缓存数据避免重复传输
- 支持大文件传输
- 优化蓝牙带宽使用
资源创建与发送
创建Asset对象
将Bitmap转换为Asset的标准方法:
private static Asset createAssetFromBitmap(Bitmap bitmap) {
final ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
return Asset.createFromBytes(byteStream.toByteArray());
}
关键点:
- 使用PNG格式压缩保证图片质量
- ByteArrayOutputStream将Bitmap转为字节流
- createFromBytes()方法创建Asset对象
发送Asset的两种方式
1. 使用PutDataRequest直接发送
// 从资源加载Bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
// 创建Asset
Asset asset = createAssetFromBitmap(bitmap);
// 创建数据请求
PutDataRequest request = PutDataRequest.create("/image");
// 添加Asset
request.putAsset("profileImage", asset);
// 发送数据
Wearable.DataApi.putDataItem(mGoogleApiClient, request);
2. 使用PutDataMapRequest发送
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
Asset asset = createAssetFromBitmap(bitmap);
// 创建数据映射请求
PutDataMapRequest dataMap = PutDataMapRequest.create("/image");
// 将Asset放入数据映射
dataMap.getDataMap().putAsset("profileImage", asset)
// 转换为数据请求并发送
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
.putDataItem(mGoogleApiClient, request);
两种方式的区别:
- PutDataRequest更直接简单
- PutDataMapRequest适合需要传输多个数据项的场景
- 最终都是通过putDataItem()方法发送
接收与处理资源
监听数据变化
@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对象
Asset profileAsset = dataMapItem.getDataMap().getAsset("profileImage");
// 将Asset转换为Bitmap
Bitmap bitmap = loadBitmapFromAsset(profileAsset);
// 使用Bitmap更新UI等操作
}
}
}
将Asset转换为Bitmap
public Bitmap loadBitmapFromAsset(Asset asset) {
if (asset == null) {
throw new IllegalArgumentException("Asset必须非空");
}
// 建立Google API客户端连接
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, "请求了未知的Asset");
return null;
}
// 将输入流解码为Bitmap
return BitmapFactory.decodeStream(assetInputStream);
}
关键注意事项:
- 必须检查Asset是否为null
- 需要先建立GoogleApiClient连接
- 使用getFdForAsset()获取输入流
- 记得断开连接释放资源
- 处理可能的null输入流情况
最佳实践建议
- 图片优化:在传输前将图片调整为适合可穿戴设备屏幕的尺寸
- 错误处理:添加适当的异常处理和日志记录
- 性能考虑:大文件传输可能影响用户体验,需进行充分测试
- 资源释放:及时关闭流和断开连接
- 路径命名:使用有意义的路径名称便于维护
总结
通过本文,我们详细了解了Android Wear数据层中资源传输的完整流程。Asset机制为可穿戴设备与手持设备间的大数据交换提供了高效可靠的解决方案。掌握这些技术后,开发者可以轻松实现图片等二进制数据在设备间的传输,为用户提供更丰富的可穿戴体验。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考