猫猫儿
猫猫儿
  • 发布:2021-06-15 20:00
  • 更新:2021-06-16 10:51
  • 阅读:1586

【报Bug】Android11下无法访问公用目录的第三方数据

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: WIN10

HBuilderX类型: 正式

HBuilderX版本号: 3.1.19

手机系统: Android

手机系统版本号: Android 11

手机厂商: 小米

手机机型: Redmi Note 9 Pro

页面类型: vue

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

let IMAGE_UNSPECIFIED = 'image/*';
let PHOTOZOOM = 2;
let PHOTOLAT = 1;
let main = plus.android.runtimeMainActivity();
let Intent = plus.android.importClass('android.content.Intent');
let MediaStore = plus.android.importClass('android.provider.MediaStore');
let File = plus.android.importClass('java.io.File');
let Uri = plus.android.importClass('android.net.Uri');
let intent = new Intent(Intent.ACTION_PICK, null);
let outPutPath;
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);
main.startActivityForResult(intent, PHOTOZOOM);
main.onActivityResult = async (requestCode, resultCode, data) => {
if (PHOTOZOOM == requestCode) {
let publicPictures = '/storage/emulated/0/Pictures/';//Android 11
let fullpath = new File(publicPictures);
if (!fullpath.exists()) fullpath.mkdir();
outPutPath = ${publicPictures}img-${new Date().getTime()}.jpg;
let file = new File(outPutPath);
let outPutUri = Uri.fromFile(file);
let uri = data.getData();
let cropIntent = new Intent('com.android.camera.action.CROP');
cropIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
cropIntent.setDataAndType(uri, IMAGE_UNSPECIFIED);
cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, outPutUri);
cropIntent.putExtra('crop', 'true');
cropIntent.putExtra('aspectX', 1);
cropIntent.putExtra('aspectY', 1);
cropIntent.putExtra('outputX', 200);
cropIntent.putExtra('outputY', 200);
main.startActivityForResult(cropIntent, PHOTOLAT);
} else if (requestCode == PHOTOLAT) {
if (!new File(outPutPath).exists()) return;
console.log(//此处出现问题,所有操作API均会报错
await uni.saveImageToPhotosAlbum({
filePath: outPutPath
})
);
}
};

操作步骤:

如复现代码所示

预期结果:

正常操作,返回信息

实际结果:

操作失败,所有文件、图片操作相关API全部无一例外失效(包括但不限于uni.saveImageToPhotosAlbum、uni.getImageInfo、uni.compressImage)

bug描述:

我早期通过nativejs实现的选图片、裁剪图片功能在升级到Android11后出现问题:
(这个方案是早期写的,并且更新日志中uni.chooseImage新增的crop属性文档上也找不到,所以没有升级改动)

该段代码在低于11的设备上正常运行,未作修改升级到11后就无法使用。这个情况已在单独的测试项目稳定复现。
以uni.saveImageToPhotosAlbum为例,会报错saveImageToPhotosAlbum:fail UNKOWN ERROR3,各API报错均不相同,如uni.compressImage会提示参数错误等。

值得注意的是,如果将裁剪后的outPutPath的图片使用系统文件管理工具手动修改文件名(即使是修改成其他再修改回原文件名),再使用同一操作API就一切正常,如果不进行这个操作,即使将所有其他操作清空,对这个文件单独再进行操作也会报错。

目前的问题是调用时不再会提示不支持,在直接使用uni.chooseImage或者plus.gallery.pick返回的图片路径操作API也恢复正常,但是通过系统裁剪的就会出现这样的问题。

2021-06-15 20:00 负责人:DCloud_App_Array 分享
已邀请:
DCloud_Android_ST

DCloud_Android_ST

Android 11设备强制分区存储,不推荐使用nativejs来实现IO操作的功能。推荐使用模块内部提供的功能或者采用uni原生插件来实现

该问题目前已经被锁定, 无法添加新回复