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

1 回复

更多关于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 指向的是公共目录(如外部存储的根目录或某些子目录),应用默认没有写入权限,除非你满足以下条件之一:

  1. 使用应用私有目录:这是最推荐的方式。你可以通过 plus.io.PRIVATE_WWWplus.io.PRIVATE_DOC 等路径来获取应用私有目录,这些目录在 Android 11 上可以自由读写。例如:

    var fullPath = plus.io.convertLocalFileSystemURL('_www/yourfile.txt');
    
  2. 使用 uni-app 的文件 API:避免直接调用原生 Java 接口,改用 uni-app 提供的 uni.saveFileuni.writeFile 等 API,它们会处理 Android 11 的兼容性问题。

  3. 请求 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('写入成功')
});
回到顶部