2015-08-26 31 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

相关问题