我在使用 Wear.DataApi 同步资产时遇到问题。
当我尝试发送String,long,int等...使用 Wear.DataApi 时,每次运行都很正常。问题是当我将资产加载到 PutDataMapRequest 对象时。图像加载正常,但它没有传输到Wear设备,即使我将当前的时间戳设置为 DataItem 每次都不同。
这是我的代码:
的电话
mGoogleApiClient = new GoogleApiClient.Builder(context)
.addApi(Wearable.API)
.build()
public void sendImage(){
Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.image);
Asset asset = createAssetFromBitmap(bitmap);
PutDataMapRequest dataMap = PutDataMapRequest.create("/image");
dataMap.getDataMap().putAsset("profileImage", asset);
dataMap.getDataMap().putLong("timestamp", System.currentTimeMillis());
PutDataRequest request = dataMap.asPutDataRequest();
request.setUrgent();
Wearable.DataApi.putDataItem(mGoogleApiClient, request);
Log.d(TAG, "Image set for sending");
}
private Asset createAssetFromBitmap(Bitmap bitmap) {
final ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
return Asset.createFromBytes(byteStream.toByteArray());
}
的观看
@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
Log.d(TAG, "Data has changed");
for (DataEvent event : dataEventBuffer) {
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
ImageView image = (ImageView) mContext.findViewById(R.id.image);
image.setImageBitmap(bitmap);
Log.d(TAG, "Bitmap OK, Loaded");
}
}
}
当我没有资产时,它工作。那么,问题出在哪里?我错过了什么
答案 0 :(得分:-1)
鉴于您要发送照片,您可以使用JPEG而非PNG获得批次更好的压缩:
private Asset createAssetFromBitmap(Bitmap bitmap) {
final ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, byteStream);
return Asset.createFromBytes(byteStream.toByteArray());
}
调整压缩率(compress
方法的第二个参数)以满足您的需要。
或者,如果您从已经存储的JPEG文件开始,您可以直接将它们读入ByteArray
。这是我用来做的代码:
RandomAccessFile file = new RandomAccessFile(filename.toString(), "r");
byte[] bytes = new byte[(int) file.length()];
file.read(bytes);
Asset myAsset = Asset.createFromBytes(bytes);
无论哪种方式,都应该让你的Asset
足够小,以便可靠地传输。
如果不是...... WearCompanionLibrary有使用Channel API发送文件的示例代码。它是与Data API完全不同的替代方案。