我编写了一个Android Wear应用程序,该应用程序使用Data API从手机应用程序接收包裹在资产中的图像。这个应用程序以前工作得很好,很长时间没有改变,但最近我开始发现从手机应用程序传递的图像无法在可穿戴设备的屏幕上渲染。在调查中,我发现其中一种方法,getFdForAsset失败,可穿戴状态码为4005,这意味着资产不可用。参见https://developers.google.com/android/reference/com/google/android/gms/wearable/WearableStatusCodes
我在调用可穿戴应用程序的ondatachchanged方法时处理数据事件,如下所示:
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。并且数据事件的路径被正确识别为包含图像的路径。
有没有人知道为什么我得到这个结果,以及如何解决它?
谢谢
重要的是…可穿戴模块和移动模块必须具有相同的签名证书;只要确保你在构建中定义了它。Gradle是一样的。这影响到资产的转移……其他数据即使使用不同的证书也是无问题同步的;
我最近在与这个问题作斗争,发现这是ASSET_UNAVAILABLE的原因,同时将磨损模块添加到现有的应用程序中,该应用程序在构建中定义了自定义调试签名证书。gradle -我必须有这个证书,即使是可穿戴的资产同步工作
如何发送图像?我发现如果我使用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);
}