HarmonyOS鸿蒙Next中拉起保存确认弹窗保存base64报showAssetsCreationDialog failed, errCode is 14000011, errMsg is Internal system error
HarmonyOS鸿蒙Next中拉起保存确认弹窗保存base64报showAssetsCreationDialog failed, errCode is 14000011, errMsg is Internal system error
async downloadBase64Image(base64Data: string, title: string): Promise<void> {
const data = base64Data.split(',')[1]; // 去除 data:image/jpeg;base64,
console.log('base64Data', data)
const base64Helper = new util.Base64Helper();
const buffer = base64Helper.decodeSync(data).buffer;
const context = getContext(this); // ArkTS 中 this 通常指 UIAbility
const filePath = `${context.filesDir}/${title}.png`; // 保存到应用私有目录
console.log('filePath', filePath)
const file = fs.openSync(filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
try {
// 拷贝文件到沙箱
fs.writeSync(file.fd, buffer)
fs.close(file.fd)
console.log('writeSync')
} catch (err) {
console.log('myRawfileCopy error', JSON.stringify(err))
}
console.info(`Base64 图片已写入:${filePath}`);
let fileUri = `file://${filePath}`; // 返回 URI 格式
const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext(this));
try {
// 获取需要保存到媒体库的位于应用沙箱的图片/视频uri
let srcFileUris: Array<string> = [
fileUri // 实际场景请使用真实的uri
];
let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
{
fileNameExtension: 'png',
photoType: photoAccessHelper.PhotoType.IMAGE,
subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选
title: title
}
];
let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
console.info('showAssetsCreationDialog success, data is ' + desFileUris);
} catch (err) {
console.error('showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);
}
}
拉起保存确认弹窗保存base64 报 showAssetsCreationDialog failed, errCode is 14000011, errMsg is Internal system error,具体代码如上
更多关于HarmonyOS鸿蒙Next中拉起保存确认弹窗保存base64报showAssetsCreationDialog failed, errCode is 14000011, errMsg is Internal system error的实战教程也可以访问 https://www.itying.com/category-93-b0.html
官网showAssetsCreationDialog文档显示,srcFileUris参数需要是保存到媒体库中的图片/视频文件对应的媒体库uri。建议楼主更换成媒体库URI再试试。
更多关于HarmonyOS鸿蒙Next中拉起保存确认弹窗保存base64报showAssetsCreationDialog failed, errCode is 14000011, errMsg is Internal system error的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
试试看这个demo是否能用
import { common } from '@kit.AbilityKit';
import { fileIo, fileUri } from '@kit.CoreFileKit';
import { buffer } from '@kit.ArkTS';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { promptAction, window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';
import fs from '@ohos.file.fs';
import { image } from '@kit.ImageKit';
@Entry
@Component
struct SaveAlbum {
@State Base64: string = ''
async pixelToBase64(pixelMap: PixelMap) {
// 转换成base64
const imagePackerApi: image.ImagePacker = image.createImagePacker();
let packOpts: image.PackingOption = { format: 'image/jpeg', quality: 100 };
const data = await imagePackerApi.packing(pixelMap, packOpts);
let buf: buffer.Buffer = buffer.from(data);
return 'data:image/jpeg;base64,' + buf.toString('base64', 0, buf.length);
}
writeFile(data: string): string {
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;
let uri = ''
try {
let filePath = filesDir + "/1.jpg";
uri = fileUri.getUriFromPath(filePath);
let file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
console.info("file fd: " + file.fd);
const reg = new RegExp("data:image/\\w+;base64,");
const base64 = data.replace(reg , "");
console.log("base64flag", base64)
const dataBuffer = buffer.from(base64 , 'base64')
let writeLen = fs.writeSync(file.fd , dataBuffer.buffer);
fs.closeSync(file);
}
catch (Error) {}
return uri
}
async SavePicture() {
try {
let context = getContext(this) as common.UIAbilityContext;
let windowClass: window.Window | undefined = undefined;
window.getLastWindow(context, async (err: BusinessError, windowObj) => {
windowClass = windowObj;
let pixelMap = await windowClass.snapshot();
this.Base64 = await this.pixelToBase64(pixelMap);
let uri = this.writeFile(this.Base64)
console.log("保存的路径" + uri)
let srcFileUris: Array<string> = [
// 获取需要保存到媒体库的位于应用沙箱的图片/视频uri
uri
];
let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
{
title: '1',
fileNameExtension: 'jpg',
photoType: photoAccessHelper.PhotoType.IMAGE,
// 可选
subtype: photoAccessHelper.PhotoSubtype.DEFAULT,
}
];
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
console.info('showAssetsCreationDialog success, data is ' + desFileUris);
try {
// 通过uri打开媒体库文件
if (desFileUris.length > 0) {
console.log("desFileUris[0]:" + desFileUris.length)
//获取图片的base64字符串
let imageStr = this.Base64.split(',');
//打开文件
let file = fs.openSync(desFileUris[0], fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
//base64字符串转成
const decodeBuffer = buffer.from(imageStr[1], 'base64').buffer;
//写入文件
fs.writeSync(file.fd, decodeBuffer);
fs.closeSync(file.fd);
promptAction.showToast({ message: '已保存至相册!' })
}
else {
promptAction.showToast({ message: '拒绝!' })
}
}
catch (err) {
console.info(err)
promptAction.showToast({ message: '保存失败!' })
}
})
}
catch (err) {
console.error('showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);
}
}
build() {
RelativeContainer() {
Column() {
Button('保存图片')
.margin(10)
.onClick(() => {
this.SavePicture()
})
}
}
.height('100%')
.width('100%')
}
}
错误代码14000011
该错误代码14000011表明系统内部出现异常导致无法调用showAssetsCreationDialog接口。可能原因包括:
- 传入的base64数据格式非法
- 文件系统权限不足
- 系统资源紧张
- 弹窗调用时机不当
解决方法
- 检查base64字符串是否符合规范
- 确保已申请ohos.permission.WRITE_MEDIA权限
- 确认系统存储空间充足
- 避免在页面生命周期回调中调用弹窗
这个错误14000011通常是由于文件权限或路径问题导致的。以下是关键点分析:
-
首先确认文件是否成功写入沙箱路径,检查console输出的filePath是否有效。
-
文件URI格式问题:
- 确保fileUri格式正确,应该是
file://${filePath}
- 建议使用更可靠的方式构造URI:
let fileUri = 'file://' + filePath.replace(/^\/+/, '');
- 权限问题:
- 确保已声明必要的权限:
"requestPermissions": [
{
"name": "ohos.permission.READ_MEDIA",
"reason": "需要读取媒体文件"
},
{
"name": "ohos.permission.WRITE_MEDIA",
"reason": "需要保存图片到相册"
}
]
- 文件有效性检查: 在调用showAssetsCreationDialog前,建议先验证文件是否存在且可读:
try {
let stat = fs.statSync(filePath);
if (!stat.isFile()) {
console.error('File not exist');
return;
}
} catch (e) {
console.error('File check failed', e);
return;
}
- 文件路径问题:
- 确保context.filesDir返回的是有效路径
- 可以尝试改用context.cacheDir作为临时存储位置
- 异步处理: 建议将整个流程包装在try-catch中,确保能捕获所有可能的错误。