HarmonyOS 鸿蒙Next 保存文件相关问题
HarmonyOS 鸿蒙Next 保存文件相关问题
保存文件的过程需要无感知,不要让用户选择保存路径,要保存在自己的目录,并且让用户不能在文件管理中打开,因为这个文件是用户的电子证照,每次展示都需要进行活体实人认证,不应该被一次保存多次使用,请问应该怎么实现?需不需要用到受限权限?
2 回复
可以选择保存到沙箱路径,用户无法感知无法打开无法选择路径,不知符不符合的需求 //该demo是从资源目录保存到沙箱目录并预览的demo
import { filePreview } from '@kit.PreviewKit';
import { BusinessError } from '@kit.BasicServicesKit';
import fs from '@ohos.file.fs';
import fileUri from "@ohos.file.fileuri";
let uiContext = getContext(this);
let displayInfo: filePreview.DisplayInfo = {
x: 100,
y: 100,
width: 800,
height: 800
};
let fileInfo: filePreview.PreviewInfo = {
title: 'th.jpg',
uri: 'file://com.example.previewfileapp/data/storage/el2/base/haps/entry/files/th.jpg',
mimeType: 'image/jpeg'
};
@Entry
@Component
struct Index {
build() {
Column() {
Row() {
Button('复制')
.onClick(() => {
try {
getContext(this).resourceManager.getRawFileContent("th.jpg", (error: BusinessError, value: Uint8Array) => {
if (error != null) {
console.error("error is " + error);
} else {
let myBuffer:ArrayBufferLike = value.buffer
let context = getContext(this);
//沙箱路径
let filePath = context.filesDir + '/' + "th.jpg";
console.log("testTag-filePath:" + filePath);
let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
let writeLen = fs.writeSync(file.fd, myBuffer);
console.info("testTag-write data to file succeed and size is:" + writeLen);
fs.closeSync(file);
}
});
} catch (error) {
let code = (error as BusinessError).code;
let message = (error as BusinessError).message;
console.error(`callback getRawFileContent failed, error code: ${code}, message: ${message}.`);
}
})
}
.justifyContent(FlexAlign.SpaceAround)
.width('100%')
Row() {
Button('预览')
.onClick(() => {
filePreview.openPreview(uiContext, fileInfo, displayInfo).then(() => {
console.info('Succeeded in opening preview');
}).catch((err: BusinessError) => {
console.error(`Failed to open preview, err.code = ${err.code}, err.message = ${err.message}`);
});
})
}
.justifyContent(FlexAlign.SpaceAround)
.width('100%')
}
.justifyContent(FlexAlign.SpaceAround)
.height('100%')
.width('100%')
}
}
//uri: this.context.filesDir + ‘/’ + “temp.pdf”, 此处需增加应用名,可参考以下demo
let filePath = this.context.filesDir + '/' + "temp.pdf"
let uri = fileUri.getUriFromPath(filePath );
fileInfo: filePreview.PreviewInfo = {
title: 'temp.pdf',
uri: uri ,
mimeType: 'application/pdf'
}
更多关于HarmonyOS 鸿蒙Next 保存文件相关问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
针对HarmonyOS 鸿蒙Next 保存文件相关问题,以下提供直接解答:
在HarmonyOS中保存文件,首先需要确定文件存储的路径和访问权限。系统提供了文件管理器API,允许应用在其私有存储区域或公共存储区域(如外部SD卡)中创建、读取、编辑和删除文件。
-
私有存储:
- 使用
context.getFilesDir()
获取应用私有文件目录。 - 使用
FileOutputStream
或FileWriter
写入文件。
- 使用
-
公共存储:
- 需要申请
READ_EXTERNAL_STORAGE
和WRITE_EXTERNAL_STORAGE
权限(在Manifest文件中声明,并在运行时请求)。 - 使用
Environment.getExternalStorageDirectory()
获取外部存储根目录。 - 自定义子目录和文件名,使用
FileOutputStream
或FileWriter
进行文件写入。
- 需要申请
-
SAF(存储访问框架):
- 对于更细粒度的存储访问控制,建议使用SAF。
- 调用
Intent
启动文件选择器,让用户选择保存位置。 - 使用
Uri
和ContentResolver
进行文件操作。
确保在保存文件时处理好异常,如IOException
,并记录必要的日志以便调试。此外,注意文件命名规范和权限管理,避免文件名冲突和权限不足导致的保存失败。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html