2016-02-02 21 views
0

這讓我瘋狂。我剛纔寫了一個代碼正在運行的代碼,並再次打開它,結果發生我無法將我的資產從手機轉移到可穿戴設備的情況。轉移資產:錯誤代碼4005 ASSET_UNAVAILABLE

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)?但事與願違真的幫我

+0

請顯示調用loadBitmapFromAsset()的代碼。 –

+0

編輯代碼,但在停止工作之前,它突然工作,未對我的代碼進行任何更改......我只是無法理解它來自哪裏 – krakig

+1

您可能會看到最近發生的更改的效果在播放服務中對數據項進行批量處理,然後進行數據同步,這可以將同步時間延遲20分鐘左右(以便將電池用於非緊急任務);有一個選項可以將PutDataRequest或PutDataMapRequest標記爲緊急,在這種情況下,同步發生在該預定進程之外。 –

回答

0

我最近有同樣的問題...我解決了它通過更新Goog le play服務,並將相同的簽名配置添加到應用程序和可穿戴模塊。如果它在第一次構建時不起作用,請轉到文件中的「使緩存/重新啓動失效」,它應該可以工作。