2015-08-26 28 views
3

我已經編寫了一個Android Wear應用程序,該應用程序使用數據API從手機應用程序接收包裝在資產中的圖像。該應用曾經工作得很好,並且在年齡方面沒有改變,但最近我開始發現從手機應用傳來的圖像無法在可穿戴屏幕上呈現。在調查中,我發現其中一種方法getFdForAsset失敗,可穿戴狀態代碼爲4005,意味着資產不可用。查看列在呼叫https://developers.google.com/android/reference/com/google/android/gms/wearable/WearableStatusCodes爲什麼Wearable.DataApi.getFdForAsset產生狀態爲4005(資產不可用)的結果?

我處理數據事件到我的穿戴式應用的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); 

,然後嘗試在此方法來創建從資產位圖:

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); 
} 

資產對象本身不是空的,所以它從移動應用程序中發現OK。數據事件的路徑被正確識別爲包含圖像的路徑。

有沒有人有任何想法,爲什麼我得到這個結果以及如何解決它?

謝謝

+0

你解決了嗎?我有同樣的問題,當它工作正常之前 – krakig

回答

1

你是如何發送圖像?我發現如果我使用Asset.createFromUri(),它不起作用,並給我ASSET UNAVAILABLE錯誤。但是,當我切換到Asset.createFromFd(),它的工作。

這裏是爲我工作的代碼:

private static Asset createAssetFromBitmap(String imagePath) throws FileNotFoundException { 
     // creating from Uri doesn't work: gives a ASSET_UNAVAILABLE error 
     //return Asset.createFromUri(Uri.parse(imagePath)); 

     final File file = new File(imagePath);  
     final ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); 

     return Asset.createFromFd(fd); 
    } 
2

一個重要的事情...... 穿戴式以及移動模塊必須具有相同的簽名證書;只要確定你是否通過build.gradle來定義它就是一樣的。這會影響資產轉移......即使有不同的證書,其他數據也不會同步發佈;

我最近在處理這個問題,發現這是ASSET_UNAVAILABLE的原因,同時在現有的應用程序中添加了磨損模塊,該應用程序在build.gradle中定義了自定義調試簽名證書 - 我必須擁有該證書,甚至可以用於資產的可穿戴設備同步工作。

+0

我有同樣的問題,我打開另一個線程,看着我的gradle文件,它看起來像我有相同的配置 – krakig

+0

我還沒有機會嘗試此建議可能暫時沒有,因爲我現在忙於其他事情。順便說一下,@ursimon非常感謝您的建議。很高興分享您的經驗。讓我完全困惑這一個! – martianw

相關問題