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
"我这边测试在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
保存图片到本地时,若未显示保存弹窗且未触发回调,可能是以下原因:
-
权限问题:确保应用已获取
ohos.permission.WRITE_MEDIA
和ohos.permission.READ_MEDIA
权限。权限未正确配置会导致保存操作失败。 -
参数配置:检查
showAssetsCreationDialog
的参数是否正确。uri
参数必须指向有效的图片URI,options
参数应包含title
和description
等必要信息。 -
UI线程阻塞:确保
showAssetsCreationDialog
在主线程中调用,避免在子线程中执行导致UI无响应。 -
回调函数:确认回调函数已正确实现并注册,且未被其他逻辑覆盖或提前返回。
-
系统版本兼容性:验证当前HarmonyOS版本是否支持
phAccessHelper.showAssetsCreationDialog
,不同版本可能存在API差异。 -
日志排查:通过
HiLog
输出相关日志,排查是否在调用过程中出现异常或错误。
若以上均无问题,建议检查API文档,确认是否存在已知问题或限制。