uni-app Android11 写入文件问题
uni-app Android11 写入文件问题
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| HBuilderX | 3.1.22 | 离线 |
产品分类:HTML5+
手机系统:Android
手机系统版本号:Android 11
手机厂商:小米
手机机型:MIUI V12.5.1.0.QCPCNXMI
示例代码:
var FileInputStream = plus.android.importClass("java.io.FileInputStream");
var out = new FileOutputStream(fullPath);
var Int8Bytes = new Int8Array(5075);
var Bytes = Array.from(Int8Bytes);
out.write(Bytes);
out.flush();
out.close();
操作步骤:
var out = new FileOutputStream(fullPath);
var Int8Bytes = new Int8Array(5075);
var Bytes = Array.from(Int8Bytes);
out.write(Bytes);
out.flush();
out.close();
预期结果:
和Android9一样,能写入长字符数组
实际结果:
更多关于uni-app Android11 写入文件问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于uni-app Android11 写入文件问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在 Android 11 上,由于系统引入了作用域存储(Scoped Storage)的强制要求,应用对公共目录的写入权限受到了更严格的限制。这可能导致你之前能在 Android 9 上正常运行的代码,在 Android 11 上无法写入文件。
你的代码使用了 plus.android.importClass 来调用原生 Java 接口,这绕过了 uni-app 的文件 API,直接操作文件系统。在 Android 11 上,如果你的 fullPath 指向的是公共目录(如外部存储的根目录或某些子目录),应用默认没有写入权限,除非你满足以下条件之一:
-
使用应用私有目录:这是最推荐的方式。你可以通过
plus.io.PRIVATE_WWW、plus.io.PRIVATE_DOC等路径来获取应用私有目录,这些目录在 Android 11 上可以自由读写。例如:var fullPath = plus.io.convertLocalFileSystemURL('_www/yourfile.txt'); -
使用 uni-app 的文件 API:避免直接调用原生 Java 接口,改用 uni-app 提供的
uni.saveFile、uni.writeFile等 API,它们会处理 Android 11 的兼容性问题。 -
请求 MANAGE_EXTERNAL_STORAGE 权限:如果你的应用必须写入公共目录,可以在 manifest.json 中配置
"android.permission.MANAGE_EXTERNAL_STORAGE"权限,并在运行时请求用户授权。但请注意,Google Play 对此权限的使用有严格限制,可能导致应用被下架。
建议修改:
将文件写入应用私有目录,或使用 uni-app 的文件 API 来替代原生 Java 调用。这样可以确保在 Android 11 及更高版本上的兼容性。例如,使用 uni.writeFile:
uni.writeFile({
filePath: fullPath,
data: Int8Bytes.buffer,
success: () => console.log('写入成功')
});

