2014-07-18 33 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