将资产发送到 Android wear

Sending Assets to Android wear

我在与 Wear.DataApi 同步资产时遇到问题。

当我尝试使用 Wear.DataApi 发送 String、long、int 等时,一切都运行良好。问题是当我将资产加载到 PutDataMapRequest 对象时。图像加载正常,但它没有传输到 Wear 设备,即使我放置了当前的 timestamp 以使 DataItem 不同每次。

这是我的代码:

Phone

mGoogleApiClient = new GoogleApiClient.Builder(context)
            .addApi(Wearable.API)
            .build()


public void sendImage(){
    Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.image);
    Asset asset = createAssetFromBitmap(bitmap);
    PutDataMapRequest dataMap = PutDataMapRequest.create("/image");
    dataMap.getDataMap().putAsset("profileImage", asset);
    dataMap.getDataMap().putLong("timestamp", System.currentTimeMillis());
    PutDataRequest request = dataMap.asPutDataRequest();
    request.setUrgent();
    Wearable.DataApi.putDataItem(mGoogleApiClient, request);

    Log.d(TAG, "Image set for sending");
}

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


观看

@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
    Log.d(TAG, "Data has changed");

    for (DataEvent event : dataEventBuffer) {
        if (event.getType() == DataEvent.TYPE_CHANGED &&
                event.getDataItem().getUri().getPath().equals("/image")) {
            DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
            Asset profileAsset = dataMapItem.getDataMap().getAsset("profileImage");
            Bitmap bitmap = loadBitmapFromAsset(profileAsset);

            // Do something with the bitmap
            ImageView image = (ImageView) mContext.findViewById(R.id.image);
            image.setImageBitmap(bitmap);
            Log.d(TAG, "Bitmap OK, Loaded");
        }
    }
}


当我没有放置任何资产时它会起作用。那么,问题出在哪里?我是不是漏了什么

鉴于您要发送照片,使用 JPEG 而不是 PNG 可以获得 很多 更好的压缩率:

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

调整压缩率(compress 方法的第二个参数)以满足您的需要。

或者,如果您从存储中已有的 JPEG 文件开始,您可以直接将它们读入 ByteArray。这是我用于执行此操作的代码:

RandomAccessFile file = new RandomAccessFile(filename.toString(), "r");
byte[] bytes = new byte[(int) file.length()];
file.read(bytes);
Asset myAsset = Asset.createFromBytes(bytes);

无论哪种方式,这应该让您的 Asset 足够小以可靠地传输。

如果没有...WearCompanionLibrary 有使用通道 API 发送文件的示例代码。它是 Data API.

完全不同的替代方案