HarmonyOS鸿蒙Next中使用phAccessHelper.showAssetsCreationDialog保存图片到本地不显示保存弹窗,也不走回调

HarmonyOS鸿蒙Next中使用phAccessHelper.showAssetsCreationDialog保存图片到本地不显示保存弹窗,也不走回调

export async function saveImgToPhoto(context: Context, srcFileUri: string) { let title = xiangyu_src;

try {
    let phAccessHelper: photoAccessHelper.PhotoAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
    
    let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
        {
            title: title, // 可选
            fileNameExtension: 'jpg',
            photoType: photoAccessHelper.PhotoType.IMAGE,
            subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选
        }
    ];

    let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog([srcFileUri], photoCreationConfigs);
    
    if (desFileUris.length > 0) {
        let resultFile: fs.File = fs.openSync(desFileUris[0], fs.OpenMode.READ_WRITE);
        // 实际场景请使用真实的uri和文件大小
        let srcFile: fs.File = fs.openSync(srcFileUri, fs.OpenMode.READ_ONLY);
        
        let bufSize: number = 2000000;
        let readSize: number = 0;
        let buf = new ArrayBuffer(bufSize);
        let readLen = fs.readSync(srcFile.fd, buf, { offset: readSize, length: bufSize });
        
        if (readLen > 0) {
            readSize += readLen;
            fs.writeSync(resultFile.fd, buf, { length: readLen });
        }
        
        fs.closeSync(srcFile);
        fs.closeSync(resultFile);
        Logger.info('showAssetsCreationDialog success, data is ' + desFileUris);
        return true;
    }
} catch (err) {
    Logger.error('showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);
}

return false;

}

系统:NEXT.0.0.71 问题:询问是否保存照片到本地相册弹窗不响应,之前是可以的,看api文档,不需要权限


更多关于HarmonyOS鸿蒙Next中使用phAccessHelper.showAssetsCreationDialog保存图片到本地不显示保存弹窗,也不走回调的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

"我这边测试在NEXT.0.0.71的样机上可以弹框 不需要权限 这边提供一个我测试的demo,您可以参考一下,可以直接使用,在rawfile文件夹中复制background图片就行:

import { common } from '@kit.AbilityKit'
import { BusinessError } from '@kit.BasicServicesKit'
import fs from '@ohos.file.fs';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { fileUri } from '@kit.CoreFileKit';
import { buffer } from '@kit.ArkTS';

export function myRawfileCopy(context: common.UIAbilityContext) {
  context.resourceManager.getRawFileContent("background.png", (err: BusinessError, data: Uint8Array) => {
    if (err != null) {
      console.error(`open aaa.txt failed: ${err.message}`)
    } else {
      let buffer = data.buffer
      let sanboxPath = context.filesDir
      console.log('myRawfileCopy path' + sanboxPath)
      let file = fs.openSync(context.filesDir + '/test.png', fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE)
      try {
        fs.writeSync(file.fd, buffer) // 拷贝文件到沙箱,为了简便,这里是直接getrawfilecontent然后写入,当文件过大时内存压力会很大,如需优化,可通过buffer进行读取
        fs.close(file.fd)
      } catch (err) {
        console.log('myRawfileCopy error')
      }
    }
  })
}

let context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

export async function saveImgToPhoto(context: Context) {
  try {
    let phAccessHelper: photoAccessHelper.PhotoAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
    let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
      {
        title: 'test2', // 可选
        fileNameExtension:  'png',
        photoType: photoAccessHelper.PhotoType.IMAGE,
        subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选
      }
    ];

    let srcFileUris: Array<string> = [
      fileUri.getUriFromPath(context.filesDir+ '/test.png')
    ];

    let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
    let file1 = fs.openSync(context.filesDir+ '/test.png', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    let arrayBuffer = new ArrayBuffer(4096000);
    let readLen = fs.readSync(file1.fd, arrayBuffer);
    let buf = buffer.from(arrayBuffer, 0, readLen);
    console.info(`content of File: ${buf.toString()}`);
    let file2 = fs.openSync(desFileUris[0], fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    let writeLen = fs.writeSync(file2.fd, arrayBuffer);
    fs.closeSync(file2);
    fs.closeSync(file1);
    console.info('showAssetsCreationDialog success, data is ' + desFileUris);
  } catch (err) {
    console.error('showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);
  }
  return false
}

@Component
@Entry
struct Index {
  build() {
    Column() {
      Button('拷贝文件到沙箱').onClick(() => {
        myRawfileCopy(getContext(this) as common.UIAbilityContext)
      })
      Button('保存到').onClick(() => {
        saveImgToPhoto(getContext(this) as common.UIAbilityContext)
      })
    }
  }
}

更多关于HarmonyOS鸿蒙Next中使用phAccessHelper.showAssetsCreationDialog保存图片到本地不显示保存弹窗,也不走回调的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


showAssetsCreationDialog failed, errCode is 401, errMsg is Invalid input parameter.

问题依然存在

在HarmonyOS Next中使用phAccessHelper.showAssetsCreationDialog保存图片到本地时,若未显示保存弹窗且未触发回调,可能是以下原因:

  1. 权限问题:确保应用已获取ohos.permission.WRITE_MEDIAohos.permission.READ_MEDIA权限。权限未正确配置会导致保存操作失败。

  2. 参数配置:检查showAssetsCreationDialog的参数是否正确。uri参数必须指向有效的图片URI,options参数应包含titledescription等必要信息。

  3. UI线程阻塞:确保showAssetsCreationDialog在主线程中调用,避免在子线程中执行导致UI无响应。

  4. 回调函数:确认回调函数已正确实现并注册,且未被其他逻辑覆盖或提前返回。

  5. 系统版本兼容性:验证当前HarmonyOS版本是否支持phAccessHelper.showAssetsCreationDialog,不同版本可能存在API差异。

  6. 日志排查:通过HiLog输出相关日志,排查是否在调用过程中出现异常或错误。

若以上均无问题,建议检查API文档,确认是否存在已知问题或限制。

在HarmonyOS鸿蒙Next中使用phAccessHelper.showAssetsCreationDialog保存图片时,如果未显示保存弹窗且未触发回调,可能的原因包括:权限未正确配置、参数传递错误或API调用方式不当。首先,确保已申请并授予ohos.permission.WRITE_MEDIA权限。其次,检查showAssetsCreationDialog的参数是否正确,特别是assetTypeoptions。最后,确保在UI线程中调用该API,并在回调中正确处理结果。如果问题依旧,建议查看日志以获取更多调试信息。

回到顶部