HarmonyOS 鸿蒙Next通过uri查询文件路径的问题
HarmonyOS 鸿蒙Next通过uri查询文件路径的问题
安卓这边可以通过uri 直接查询到文件的路径
鸿蒙未找到查询方法
欢迎开发小伙伴们进来帮帮楼主
开发者您好,DataAbilityHelper的query()方法可以根据uri查询文件路径;如下代码根据某张图片的uri查询图片的id,绝对路径以及文件名:
DataAbilityHelper helper = DataAbilityHelper.creator(this);
ResultSet resultSet= helper.query(uri, new String[]{AVStorage.Images.Media.ID, AVStorage.Images.Media.DATA,AVStorage.Images.Media.DISPLAY_NAME,}, null);
//获取文件路径
String filePath= resultSet.getString(resultSet.getColumnIndexForName(AVStorage.Images.Media.DATA));
uri如下 content://com.huawei.filemanager.share.fileprovider/root/storage/emulated/0/Huawei/Themes/themecache/com.huawei.livewallpaer.brocade.BrocadeService.jpg
查询 报错 java.lang.IllegalArgumentException: Scheme is illegal
大佬,帮忙看看
uri dataability:///media/external/images/media/5734
错误提示 android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
大佬,帮忙看看
API 11还能做吗?
private void findMediaFile() { LogUtil.info(TAG, "findMediaFile::do find");DataAbilityHelper helper = DataAbilityHelper.creator(getContext()); try { DataAbilityPredicates dataAbilityPredicates = new DataAbilityPredicates("_id>?"); dataAbilityPredicates.setWhereArgs(Arrays.asList("0")); Uri myUri = AVStorage.Video.Media.EXTERNAL_DATA_ABILITY_URI; // columns为null,查询记录所有字段,当前例子表示查询id字段 ResultSet result = helper.query(myUri, null, dataAbilityPredicates); if (result == null) { LogUtil.info(TAG, "findMediaFile::not find media file"); return; } while (result.goToNextRow()) { int id = result.getInt(result.getColumnIndexForName(AVStorage.Video.Media.ID));// 获取id字段的值 Uri uri = Uri.appendEncodedPathToUri(AVStorage.Video.Media.EXTERNAL_DATA_ABILITY_URI, String.valueOf(id)); String decodedPath = uri.getDecodedPath(); String lastPath = uri.getLastPath(); LogUtil.info(TAG, "findMediaFile::uri is: " + uri.toString() + " and decodedPath is: " + decodedPath + " and lastPath is: " + lastPath); } ResultSet resultSet = helper.query(myUri, new String[]{AVStorage.Video.Media.ID, AVStorage.Video.Media.DATA, AVStorage.Video.Media.DISPLAY_NAME,}, null); while (resultSet.goToNextRow()){ int columnIndexForName = resultSet.getColumnIndexForName(AVStorage.Video.Media.DATA); if(columnIndexForName >= 0){ String filePath = resultSet.getString(columnIndexForName); LogUtil.info(TAG, "findMediaFile::1--filePath is: " + filePath); File file = new File(filePath); if(file.exists()){ LogUtil.info(TAG, "file rw is: " + file.canRead() + "_" + file.canWrite()); } }else { LogUtil.error(TAG, "findMediaFile::2--columnIndexForName is invalid"); } } } catch (DataAbilityRemoteException e) { LogUtil.error(TAG, "findMediaFile::error is: " + e.getMessage()); }
}
使用上面的代码,亲测可以,这是用来获取视频的,其他媒体文件只需要修改为对应的就可以
关于HarmonyOS鸿蒙Next通过URI查询文件路径的问题,首先确保URI格式正确。对于文件URI,可以直接使用uri.getPath()
获取文件路径。对于内容提供者URI,需使用ContentResolver
查询MediaStore或相应Provider获取实际文件路径。注意检查应用是否有相应的文件访问权限。如果问题依旧没法解决,请加我微信,我的微信是itying888,我将尽力提供帮助。