Assets 전송


가령 이미지와 같은 바이너리 데이터의 큰 블롭을 블루투스 전송을 통해 송신하기 위해, 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
Posted by 레미파
,