为什么Wearable.DataApi.getFdForAsset会生成状态为4005(资产不可用)的结果?

时间:2015-08-26 12:54:10

标签: android wear-os

我编写了一个Android Wear应用程序,它使用Data API从手机应用程序接收包含在Asset中的图像。该应用程序过去工作正常,并没有在很长一段时间内更改,但最近我开始发现从手机应用程序传递的图像无法在可穿戴设备的屏幕上呈现。在调查中我发现其中一个方法getFdForAsset失败,可穿戴状态代码为4005,这意味着资产不可用。见https://developers.google.com/android/reference/com/google/android/gms/wearable/WearableStatusCodes

我在调用我的可穿戴应用程序的onDataChanged方法时处理数据事件,如下所示:

    public void onDataChanged(DataEventBuffer dataEvents) {
    LOGD(TAG, "XXXX MainActivity.onDataChanged()");

    final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents);
    dataEvents.close();

    LOGD(TAG, "onDataChanged data event count=" + events.size());
    for (DataEvent event : events) {
        if (event.getType() == DataEvent.TYPE_CHANGED) {
            String path = event.getDataItem().getUri().getPath();
            if (IMAGE_PATH.equals(path)) {
                DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
                LOGD(TAG, "onDataChanged getting image asset");
                Asset photo = dataMapItem.getDataMap()
                        .getAsset(IMAGE_KEY);
                LOGD(TAG, "onDataChanged photo asset="+photo);
                final String toi_name = dataMapItem.getDataMap().getString(GYBO_NAME);
                final String toi_info = dataMapItem.getDataMap().getString(GYBO_INFO);
                current_toi_name = toi_name;
                current_toi_info = toi_info;
                LOGD(TAG, "onDataChanged TOI name="+toi_name);
                LOGD(TAG, "onDataChanged TOI info="+toi_info);
                Bitmap bitmap = loadBitmapFromAsset(google_api_client, photo);

然后尝试使用此方法从Asset创建位图:

    private Bitmap loadBitmapFromAsset(GoogleApiClient apiClient, Asset asset) {
    if (asset == null) {
        throw new IllegalArgumentException("XXXX Asset must be non-null");
    }

    DataApi.GetFdForAssetResult result = Wearable.DataApi.getFdForAsset(
            apiClient, asset).await();
    if (result == null) {
        Log.w(TAG, "XXXX getFdForAsset returned null");
        return null;
    }

    if (result.getStatus().isSuccess()) {
        Log.d(TAG, "XXXX loadBitmapFromAsset getFdForAsset was successful");
    } else {
        Log.d(TAG, "XXXX loadBitmapFromAsset getFdForAsset was not successful. Error="+result.getStatus().getStatusCode()+":"+result.getStatus().getStatusMessage());
        // Seeing status code 4005 here which means Asset Unavailable
    }

    InputStream assetInputStream = result.getInputStream();
    if (assetInputStream == null) {
        Log.w(TAG, "XXXX Requested an unknown Asset");
        result.release();
        return null;
    }
    result.release();
    return BitmapFactory.decodeStream(assetInputStream);
}

Asset对象本身不为null,因此它来自移动应用程序OK。并且数据事件的路径被正确识别为包含图像的路径。

有没有人知道为什么我会得到这个结果以及如何解决它?

由于

1 个答案:

答案 0 :(得分:2)

一件重要的事情...... 可穿戴以及移动模块必须具有相同的签名证书;只要确保你通过build.gradle定义它就是一样的。这会影响转移资产......即使有不同的证书,其他数据也无法同步发布;

我最近在解决这个问题,发现这是ASSET_UNAVAILABLE的原因,同时在现有应用程序中添加了穿戴模块,该应用程序具有在build.gradle中定义的自定义调试签名证书 - 我甚至需要此证书才能进行资产同步的可穿戴设备工作。