我已经编写了一个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);
然后尝试使用此方法从资源创建位图:
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对象本身不为空,因此它来自移动应用程序OK。并且数据事件的路径被正确地识别为包含图像的路径。
有谁知道我为什么会得到这个结果,以及如何解决它?
谢谢
发布于 2016-02-01 03:13:44
有一件重要的事..。wearable和移动模块必须具有相同的签名证书;只需确保您通过build.gradle定义的签名证书是相同的。这会影响资产转移...其他数据被同步,即使使用不同的证书也没有问题;
我最近正在与这个问题作斗争,并发现这是ASSET_UNAVAILABLE的原因,同时添加穿戴模块到现有的应用程序中,该应用程序具有在build.gradle中定义的自定义调试签名证书-我必须拥有这个证书,即使是可穿戴的资产同步工作。
发布于 2015-09-20 09:34:59
您是如何发送图像的?我发现如果我使用Asset.createFromUri()
,它就不能工作,并给出资产不可用的错误。但当我切换到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);
}
https://stackoverflow.com/questions/32227254
复制相似问题