uniapp如何将content:// uri转换为实际文件路径

在uniapp中,如何将Android系统返回的content:// URI(比如从文件选择器获取的)转换为实际可用的文件路径?尝试过使用plus.io.resolveLocalFileSystemURL方法但转换失败,是否有完整的解决方案或示例代码?需要兼容Android 10以上版本的文件权限限制。

2 回复

在Uniapp中,可以通过uni.getFileSystemManager()获取文件管理器,使用saveFile方法将content:// URI保存为临时文件路径。例如:

uni.getFileSystemManager().saveFile({
  tempFilePath: contentUri,
  success: (res) => {
    console.log(res.savedFilePath)
  }
})

注意:部分平台可能不支持此操作。


在 UniApp 中,content:// URI 通常用于访问 Android 系统上的共享文件(如相册、文件管理器中的文件)。由于 UniApp 基于跨平台框架,直接处理 content:// URI 可能需要通过原生插件或特定 API 实现。以下是解决方案:

方法一:使用 UniApp 的 uni.chooseFile API(推荐)

如果是从相册或文件管理器选择文件,直接使用 uni.chooseFile 获取临时路径,无需手动转换:

uni.chooseFile({
  count: 1,
  success: (res) => {
    const tempPath = res.tempFilePaths[0]; // 直接获取临时文件路径
    console.log("文件路径:", tempPath);
  }
});

方法二:通过原生插件处理(Android 平台)

如果已获得 content:// URI(例如通过其他插件返回),需编写原生插件或使用以下步骤转换:

  1. 在原生层(Android)处理
    在 Android 原生代码中,通过 ContentResolvercontent:// URI 转换为实际文件路径。示例代码(Java):
    public String getFilePathFromUri(Uri uri) {
        String path = null;
        String[] projection = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
        if (cursor != null && cursor.moveToFirst()) {
            int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            path = cursor.getString(columnIndex);
            cursor.close();
        }
        return path; // 返回实际路径,如 /storage/emulated/0/...
    }
    
  2. 封装为 UniApp 插件
    将上述原生代码封装为 UniApp 原生插件,供 JavaScript 调用。

注意事项:

  • 权限问题:确保应用有存储权限(android.permission.READ_EXTERNAL_STORAGE)。
  • 平台限制:iOS 不使用 content:// URI,需用 uni.chooseImage 等 API。
  • 临时路径有效性:UniApp 返回的临时路径可能仅在当前会话有效,如需持久化需保存到本地。

总结:

优先使用 UniApp 内置 API(如 uni.chooseFile)避免直接处理 content://。如需强制转换,需通过原生开发实现。

回到顶部