HarmonyOS 鸿蒙Next通过uri查询文件路径的问题

发布于 1周前 作者 songsunli 来自 鸿蒙OS

HarmonyOS 鸿蒙Next通过uri查询文件路径的问题

安卓这边可以通过uri 直接查询到文件的路径


 代码截图


 鸿蒙未找到查询方法

10 回复

有的图片,也在数据库中查询不到,求救啊

 

欢迎开发小伙伴们进来帮帮楼主


来大佬帮忙看看,谢谢!

开发者您好,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还能做吗?

请确认uri是否正确
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,我将尽力提供帮助。

回到顶部