Assetsを転送する

2014/8/5 5035hit

ウェアラブル向けアプリを作る 目次
原文
画像データのような大きなバイナリーのblobデータをBluetoothで転送するためにAssetをData itemにアタッチして replicated data storeにputします。

Assetsは自動的に再送信を抑制し、Bluetoothの帯域を節約するためにキャッシュされます。一般的なパターンとして、携帯端末向けアプリで画像データをダウンロードし、ウェアラブルのディスプレイサイズに合わせて適切に縮小したあとAssetsとしてウェアラブルアプリに転送します。このパターンのデモは以下のとおりです。

メモ:data itemのサイズは100kbの制限でassetsはそれに近いくらい大きくなる可能性があります。しかしながら、大きすぎるassertsは多くの場合ユーザーエクスペリエンスに悪影響を与えてしまいます。そのため、大きなAssetsを転送する場合は、アプリをテストしてください。

Assetの転送

Assetクラス内のcreate...()メソッドの一つを使ってassetを作ります。ここでは、bitmapをbyte streamに変換し、createFromBytes()を呼びassetを作ります。

private static Asset createAssetFromBitmap(Bitmap bitmap) {
final ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
return Asset.createFromBytes(byteStream.toByteArray());
}

もしAssetを持っている場合data itemにアタッチするためにDataMapPutDataRequest内のputAsset() メソッドを呼び、putDataItem()でdata storeの中にdata itemをputします。

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);
// 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;
}
// assetをファイル識別子の中に変換し準備が終わるまでブロックします
InputStream assetInputStream = Wearable.DataApi.getFdForAsset(
mGoogleApiClient, asset).await().getInputStream();
mGoogleApiClient.disconnect();

if (assetInputStream == null) {
Log.w(TAG, "Requested an unknown Asset.");
return null;
}
// streamをbitmapにデコードします
return BitmapFactory.decodeStream(assetInputStream);
}



Except as noted, this content is licensed under Creative Commons Attribution 2.5. For details and restrictions, see the Content License.

前:Data itemを同期する 次:メッセージの送信と受信

関連キーワード

[Android][Java][モバイル][IT][翻訳][ウェアラブル]

コメントを投稿する

名前URI
コメント