将资产发送到 Android wear
Sending Assets to Android wear
我在与 Wear.DataApi 同步资产时遇到问题。
当我尝试使用 Wear.DataApi 发送 String、long、int 等时,一切都运行良好。问题是当我将资产加载到 PutDataMapRequest 对象时。图像加载正常,但它没有传输到 Wear 设备,即使我放置了当前的 timestamp 以使 DataItem 不同每次。
这是我的代码:
Phone
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");
}
}
}
当我没有放置任何资产时它会起作用。那么,问题出在哪里?我是不是漏了什么
鉴于您要发送照片,使用 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 有使用通道 API 发送文件的示例代码。它是 Data API.
完全不同的替代方案
我在与 Wear.DataApi 同步资产时遇到问题。
当我尝试使用 Wear.DataApi 发送 String、long、int 等时,一切都运行良好。问题是当我将资产加载到 PutDataMapRequest 对象时。图像加载正常,但它没有传输到 Wear 设备,即使我放置了当前的 timestamp 以使 DataItem 不同每次。
这是我的代码:
Phone
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");
}
}
}
当我没有放置任何资产时它会起作用。那么,问题出在哪里?我是不是漏了什么
鉴于您要发送照片,使用 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 有使用通道 API 发送文件的示例代码。它是 Data API.
完全不同的替代方案