转移资产:错误代码4005 ASSET_UNAVAILABLE

时间:2016-02-02 13:55:10

标签: wear-os

这让我发疯了。很久以前我写了一段代码,然后再打开它,而且我无法将我的资产从手机传输到可穿戴设备。

public Bitmap loadBitmapFromAsset(Asset asset) {
    if (asset == null) {
        throw new IllegalArgumentException("Asset must be non-null");
    }
    // convert asset into a file descriptor and block until it's ready
    Log.d(TAG, "api client" + mApiClient);
    DataApi.GetFdForAssetResult result = Wearable.DataApi.getFdForAsset(mApiClient, asset).await();
    if (result == null) {
        Log.w(TAG, "getFdForAsset returned null");
        return null;
    }

    if (result.getStatus().isSuccess()) {
        Log.d(TAG, "success");
    } else {
        Log.d(TAG, result.getStatus().getStatusCode() + ":" + result.getStatus().getStatusMessage());
    }

    InputStream assetInputStream = result.getInputStream();

    if (assetInputStream == null) {
        Log.w(TAG, "Requested an unknown Asset.");
        return null;
    }
    // decode the stream into a bitmap
    return BitmapFactory.decodeStream(assetInputStream);
}

这是我调用loadBitmapFrom Asset方法的代码。

DataMap dataMap = DataMapItem.fromDataItem(event.getDataItem()).getDataMap();

ArrayList<DataMap> dataMaps = dataMap.getDataMapArrayList("dataMaps");

ArrayList<String> names = new ArrayList<>();
ArrayList<String> permalinks = new ArrayList<>();
ArrayList<Asset> images = new ArrayList<>();

for (int i = 0 ; i < dataMaps.size() ; i++) {
   Log.d(TAG, dataMaps.get(i).getString("name"));
   names.add(dataMaps.get(i).getString("name"));
   permalinks.add(dataMaps.get(i).getString("permalink"));
   images.add(dataMaps.get(i).getAsset("image"));
}

editor.putInt("my_selection_size", names.size());
for (int i=0; i <names.size() ; i++) {
    editor.putString("my_selection_name_" + i, names.get(i));
    editor.putString("my_selection_permalink_" + i, permalinks.get(i));
    Log.d(TAG, "asset number " + i + " " + images.get(i));

    Bitmap bitmap = loadBitmapFromAsset(images.get(i));

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] byteArray = stream.toByteArray();

    String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
    editor.putString("my_selection_image_" + i, encoded);
}

在移动端:

private void sendData(PutDataMapRequest dataMap) {

    PutDataRequest request = dataMap.asPutDataRequest();
    request.setUrgent();

    com.google.android.gms.common.api.PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi.putDataItem(mApiClient, request);
    pendingResult.setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
        @Override
        public void onResult(DataApi.DataItemResult dataItemResult) {
            com.orange.radio.horizon.tools.Log.d(TAG, "api client : " + mApiClient);
            if (dataItemResult.getStatus().isSuccess()) {
                com.orange.radio.horizon.tools.Log.d(TAG, "message successfully sent");
            } else if (dataItemResult.getStatus().isInterrupted()) {
                com.orange.radio.horizon.tools.Log.e(TAG, "couldn't send data to watch (interrupted)");
            } else if (dataItemResult.getStatus().isCanceled()) {
                com.orange.radio.horizon.tools.Log.e(TAG, "couldn't send data to watch (canceled)");
            }
        }
    });
    Log.d(TAG, "Sending data to android wear");
}


class ConfigTask extends AsyncTask<String, Void, String> {

    ArrayList<WatchData> mitems;
    int mType;

    public ConfigTask(ArrayList<WatchData> items, int type)
    {
        mitems = items;
        mType = type;
    }

    protected String doInBackground(String... str)
    {
        DataMap dataMap;
        ArrayList<DataMap> dataMaps = new ArrayList<>();
        Bitmap bitmap = null;
        for (int i = 0 ; i < mitems.size() ; i++) {
            dataMap = new DataMap();
            URL url = null;
            try {
                url = new URL(mitems.get(i).mUrlSmallLogo);
                Log.d(TAG, "url : " + url);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
            try {
                bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
            Asset asset = createAssetFromBitmap(bitmap);
            dataMap.putAsset("image", asset);
            dataMap.putString("name", mitems.get(i).mName);
            dataMap.putString("permalink", mitems.get(i).mPermalink);
            dataMaps.add(dataMap);
        }
        PutDataMapRequest request = null;
        switch (mType) {
            case 0 :
                request = PutDataMapRequest.create(SELECTION_PATH);
                break;
            case 1 :
                request = PutDataMapRequest.create(RADIOS_PATH);
                break;
            case 2 :
                request = PutDataMapRequest.create(PODCASTS_PATH);
                break;
        }
        request.getDataMap().putDataMapArrayList("dataMaps", dataMaps);
        request.getDataMap().putString("", "" + System.currentTimeMillis()); //random data to refresh

        Log.d(TAG, "last bitmap : " + bitmap);
        Log.d(TAG, "===============================SENDING THE DATAMAP ARRAYLIST==================================");
        sendData(request);

        return "h";
    }

    protected void onPostExecute(String name)
    {

    }
}

执行该代码时,我发现发生以下错误:

02-02 14:47:59.586    7585-7601/? D/WearMessageListenerService﹕ 4005:ASSET_UNAVAILABLE

我看到了相关的帖子Why does Wearable.DataApi.getFdForAsset produce a result with status 4005 (Asset Unavailable)?,但它并没有真正帮助我

1 个答案:

答案 0 :(得分:0)

我最近遇到了同样的问题......我通过更新Google Play服务解决了这个问题,并为应用和可穿戴模块添加了相同的签名配置。如果它没有在第一次构建时工作,请转到&#34;使缓存/重启无效&#34;在文件中,它应该工作。