2014-07-18 31 views
0

我在被存储在DataItemAsset使用DataItemMap,我和我的穿戴式设备的同步存储Bitmap秒。如果我使用过所有我DataItem S的迭代:Android Wear位图DataItem的资产规模

DataItemBuffer list = api.getDataItems(connection.getClient()).await() 
for(DataItem item : list) { 
    ... 
} 

如何才能得到每个Asset的大小?

编辑:当我使用

DataMapItem dataMapItem = DataMapItem.fromDataItem(item); 
Asset asset = dataMapItem.getDataMap().getAsset(BITMAP_KEY); 
int size = asset.getData().length; 

我得到的是说,一个NPE:

尝试获取空数组的长度

Asset用放:

PutDataMapRequest putRequest = PutDataMapRequest.create(path); 
DataMap map = putRequest.getDataMap(); 

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
b.compress(Bitmap.CompressFormat.PNG, 100, stream); 
stream.flush(); 
Asset asset = Asset.createFromBytes(stream.toByteArray()); 
map.putAsset(mapKey, asset); 

Wearable.DataApi.putDataItem(connection.getClient(), putRequest.asPutDataRequest()); 

回答

3

根据this您必须通过DataApi阅读资产:

GoogleApiClient client = ...; 
PendingResult<DataApi.GetFdForAssetResult> pendingResult = Wearable.DataApi.getFdForAsset(client, asset); 
DataApi.GetFdForAssetResult assetResult = pendingResult.await(); 
InputStream assetInputStream = assetResult.getInputStream(); 

编辑: 如果你只是需要的大小,不依赖于资产。在发送端,简单的写大小到的数据图:

PutDataMapRequest putRequest = PutDataMapRequest.create(path); 
DataMap map = putRequest.getDataMap(); 

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
b.compress(Bitmap.CompressFormat.PNG, 100, stream); 
stream.flush(); 
byte[] byteArray = stream.toByteArray(); 
Asset asset = Asset.createFromBytes(byteArray); 
map.putAsset(mapKey, asset); 
map.putLong("dataSize", byteArray.length); 

Wearable.DataApi.putDataItem(connection.getClient(), putRequest.asPutDataRequest()); 

当你想读的大小,只需做到以下几点:

DataMapItem dataMapItem = DataMapItem.fromDataItem(item); 
long size = dataMapItem.getDataMap().getLong("dataSize"); 
+0

我知道我可以做到这一点,但我不想阅读资产看看它有多大是。但是,该链接从未提及任何有关获取资产大小的内容,所以我希望有一种更简单的方法可以实现。 – Eliezer

+0

DataApi在读取数据之前不知道大小。我认为传输大小的最佳方式是在将数据添加到数据项中时将其放入发送端的数据映射中。 – Tom

+0

我其实想要读取发件人端的大小,但可能是在放置一周后,所以我没有要测量的原始数据。 – Eliezer

-1

它看起来像你将资产添加到错误的地图。你正在做“putRequest.asPutDataRequest”而不是“map.asPutDataRequest”。做到这一点:

PutDataMapRequest putRequest = PutDataMapRequest.create(path); 

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
b.compress(Bitmap.CompressFormat.PNG, 100, stream); 
stream.flush(); 
Asset asset = Asset.createFromBytes(stream.toByteArray()); 
putRequest.putAsset(mapKey, asset); 

Wearable.DataApi.putDataItem(connection.getClient(), putRequest.asPutDataRequest()); 

然后,你不应该得到那个NPE了。

+0

'PutDataMapRequest'没有一个'putAsset'方法。 http://developer.android.com/reference/com/google/android/gms/wearable/PutDataMapRequest.html – Eliezer