HarmonyOS 鸿蒙Next PermissionName: ohos.permission.READ_IMAGEVIDEO Install Failed: error: failed to install bundle.
HarmonyOS 鸿蒙Next PermissionName: ohos.permission.READ_IMAGEVIDEO Install Failed: error: failed to install bundle. Install Failed: error: failed to install bundle.
code:9568289
error: install failed due to grant request permissions failed.
PermissionName: ohos.permission.READ_IMAGEVIDEO
ohos.permission.READ_IMAGEVIDEO是受限权限?ACL?
更多关于HarmonyOS 鸿蒙Next PermissionName: ohos.permission.READ_IMAGEVIDEO Install Failed: error: failed to install bundle.的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你用了ohos.permission.READ_IMAGEVIDEO这个权限,但是你的profile中没有这个权限,所以出错。
解决方法就是申请ohos.permission.READ_IMAGEVIDEO这个权限,一般情况下是申请不到的。
更多关于HarmonyOS 鸿蒙Next PermissionName: ohos.permission.READ_IMAGEVIDEO Install Failed: error: failed to install bundle.的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
const writeLen = fs.writeSync(destFile.fd, buffer, {
offset: 0,
length: buffer.byteLength
});
writeSync第二个参数是ArrayBuffer | string,不是Uint8Array。
我现在用photoViewPicker选择照片,然后复制到沙箱进行操作。理论上应该是不需要申请权限,但总是报139000020错误
你把相关代码贴出来,才能分析哪里出问题
fileIo有现成的copyFile方法的。
//检查文件夹是否存在,不存在 递归创建多级文件夹
createFolder(dirPath:string) {
// 首先判断文件夹是否存在
let isExist = false;
try {
isExist = fileIo.accessSync(dirPath, fileIo.AccessModeType.EXIST);
if (isExist) {
console.info('文件夹已存在');
return;
}
} catch (error) {
// TODO: Implement error handling.
}
// 创建文件夹 recursive参数为true时可递归创建多级目录
fileIo.mkdir(dirPath, true ).then(() => {
console.info('mkdir succeed');
}).catch((err: BusinessError) => {
console.error(`mkdir failed. error message: ${err.message}, error code: ${err.code}`);
});
}
//生成沙箱文件路径
wrapFilePath(context:Context):string{
let dirPath = context.filesDir + '/xxxx';//改成自己项目的沙箱目录
this.createFolder(dirPath);
let fileName = `${new Date().getTime()}`;
let filePath = dirPath + `/${fileName}.jpg`;//后缀可以根据选择的图片来
return filePath;
}
//从相册选择图片,并复制到沙箱
async getPhotoPickerResult(context: Context): Promise<string> {
let photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
photoSelectOptions.maxSelectNumber = 1; // 选择一张图片
let photoPicker = new photoAccessHelper.PhotoViewPicker();
let photoUri = '';
try {
let result = await photoPicker.select(photoSelectOptions);
let uri = result.photoUris[0];
try {
let file = fileIo.openSync(uri, fileIo.OpenMode.READ_ONLY);
let filePath = this.wrapFilePath(context);
fileIo.copyFileSync(file.fd, filePath);
fileIo.close(file);
// 沙箱路径
photoUri = fileUri.getUriFromPath(filePath);
} catch (error) {
// TODO: Implement error handling.
}
console.info(`Sandbox uri: ${photoUri}`);
} catch (error) {
// TODO: Implement error handling.
}
return photoUri;
}
已解决
用安全组件吧,这个申请太麻烦
嗯
如果只是让用户主动选图,然后把选中的图片复制到应用沙箱,优先不要声明和申请 ohos.permission.READ_IMAGEVIDEO。官方相册接口里也说明,通过 picker 方式请求图片/视频资源时,不需要申请这个权限。
你现在的安装失败 9568289 / grant request permissions failed / READ_IMAGEVIDEO,大概率就是因为包里声明了这个相册读取权限,但应用没有对应的权限授权/ACL 条件。先把 module.json5 里的 READ_IMAGEVIDEO 声明和运行时申请都去掉,再用 PhotoViewPicker.select() 返回的 photoUris 处理。
复制到沙箱时注意几点:源路径用 picker 返回的 uri 原样传给 fileIo.openSync(srcUri);目标文件建议放 context.cacheDir 或 context.filesDir,open 时带 READ_WRITE | CREATE;复制完成后关闭源/目标 fd;不要把 picker 返回的 uri 手动转换成普通本地路径。
只有需要读取整库、后台批量扫描相册等非用户单次选择场景时,才考虑 READ_IMAGEVIDEO,并按受限权限/ACL 和上架审核要求准备真实使用场景说明。
最开始是没有申请权限的,总是报错139000020。后面尝试了一下申请READ_IMAGEVIDEO权限。理论上说我的场景是不需要申请权限的。通过photoviewpicker选择照片,复制到沙盒目录,然后对沙盒目录的文件进行处理
文档里不是写了吗?查一下。
安装失败原因:ohos.permission.READ_IMAGEVIDEO 在 HarmonyOS Next 中属于受限权限,需在 module.json5 中以正确格式声明,且应用签名证书需具备该权限的授权。若未满足,系统将阻止安装。请检查 module.json5 中权限声明字段的拼写与层级,并确认签名证书已包含该权限。
ohos.permission.READ_IMAGEVIDEO 属于受限权限(ACL权限),无法直接使用。如果应用未在 AppGallery Connect 中申请该权限的 ACL 授权,安装时就会报错 9568289 并提示 grant request permissions failed。
解决方式:登录 AGC,在“我的项目” -> 选择应用 -> “用户与访问” -> “权限管理” 中申请 ohos.permission.READ_IMAGEVIDEO 的 ACL,审核通过后重新下载包含该权限的签名文件(p7b),再打包安装即可。同时确认 module.json5 的 requestPermissions 中已正确声明该权限。

