Transferring Assets
Android - Building Apps for Wearables/Sending and Syncing Data 2014. 9. 10. 15:00Assets 전송
가령 이미지와 같은 바이너리 데이터의 큰 블롭을 블루투스 전송을 통해 송신하기 위해, Asset에 데이터 아이템을 첨부하고 복제된 데이터 저장소에 데이터 아이템을 넣는다.
Assets는 자동으로 재전송 및 블루투스 대역폭 절약을 위해 데이터 캐싱을 처리한다. 이미지를 다운로드 할 수 있는 휴대용 앱, 그것을 웨어러블에서 보여주기 위해 적절한 크기로 축소, 그리고 그것을 Asset의 형태로 웨어러블 앱에 전송하는 것과 같은 흔한 패턴이다. 다음 예는 이 패턴을 보여준다.
메모: 데이터 아이템의 크기 제한이 100KB 일지라도, assets은 원하는대로 크게 할 수 있다. 하지만, 큰 assets의 전송은 많은 경우에서 사용자 경험에 영향을 미친므로, 당신은 큰 assets을 전송하는 경우 잘 작동하는지 확인하기 위해 앱을 테스트하라.
Asset 전송
Asset
클래스에서 create...() 메소드들중 하나를 사용해 asset을 생성하라. 여기에, 우리는 비트맵을 바이트 스트림으로 전환하고, assets을 생성하기 위해 createFromBytes()
를 호출한다.
private static Asset createAssetFromBitmap(Bitmap bitmap) {
final ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
return Asset.createFromBytes(byteStream.toByteArray());
}
당신이 asset을 갖게 되었을 때, DataMap
혹은 PutDataRequest
의 putAsset() 메소드로 데이터 아이템에 부착하고 난 뒤 putDataItem()
의 데이터 저장소 안에 데이터 아이템을 넣어라:
PutDataRequest 사용
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
Asset asset = createAssetFromBitmap(bitmap);
PutDataRequest request = PutDataRequest.create("/image");
request.putAsset("profileImage", asset);
Wearable.DataApi.putDataItem(mGoogleApiClient, request);
PutDataMapRequest 사용
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
Asset asset = createAssetFromBitmap(bitmap);
PutDataMapRequest dataMap = PutDataMapRequest.create("/image");
dataMap.getDataMap().putAsset("profileImage", asset)
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
.putDataItem(mGoogleApiClient, request);
Assets 수신
asset가 생성될 때, 당신은 다른쪽 연결에서 그것을 읽고 압축을 해제하기를 원할지도 모른다. 여기 asset의 변화를 감지하고 Asset의 변경 및 압축 해제를 위한 콜백의 구현 방법의 예가 있다:
@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(dataItem);
Asset profileAsset = dataMapItem.getDataMap().getAsset("profileImage");
Bitmap bitmap = loadBitmapFromAsset(profileAsset);
// Do something with the bitmap
}
}
}
public Bitmap loadBitmapFromAsset(Asset asset) {
if (asset == null) {
throw new IllegalArgumentException("Asset must be non-null");
}
ConnectionResult result =
mGoogleApiClient.blockingConnect(TIMEOUT_MS, TimeUnit.MILLISECONDS);
if (!result.isSuccess()) {
return null;
}
// convert asset into a file descriptor and block until it's ready
InputStream assetInputStream = Wearable.DataApi.getFdForAsset(
mGoogleApiClient, asset).await().getInputStream();
mGoogleApiClient.disconnect();
if (assetInputStream == null) {
Log.w(TAG, "Requested an unknown Asset.");
return null;
}
// decode the stream into a bitmap
return BitmapFactory.decodeStream(assetInputStream);
}
'Android - Building Apps for Wearables > Sending and Syncing Data' 카테고리의 다른 글
Handling Data Layer Events (0) | 2014.09.10 |
---|---|
Sending and Receiving Messages (0) | 2014.09.10 |
Syncing Data Items (0) | 2014.09.10 |
Accessing the Wearable Data Layer (0) | 2014.09.10 |
Sending and Syncing Data (0) | 2014.09.10 |