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

4 回复

官网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通常是由于文件权限或路径问题导致的。以下是关键点分析:

  1. 首先确认文件是否成功写入沙箱路径,检查console输出的filePath是否有效。

  2. 文件URI格式问题:

  • 确保fileUri格式正确,应该是file://${filePath}
  • 建议使用更可靠的方式构造URI:
let fileUri = 'file://' + filePath.replace(/^\/+/, '');
  1. 权限问题:
  • 确保已声明必要的权限:
"requestPermissions": [
  {
    "name": "ohos.permission.READ_MEDIA",
    "reason": "需要读取媒体文件"
  },
  {
    "name": "ohos.permission.WRITE_MEDIA",
    "reason": "需要保存图片到相册"
  }
]
  1. 文件有效性检查: 在调用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;
}
  1. 文件路径问题:
  • 确保context.filesDir返回的是有效路径
  • 可以尝试改用context.cacheDir作为临时存储位置
  1. 异步处理: 建议将整个流程包装在try-catch中,确保能捕获所有可能的错误。
回到顶部