贵州有网站的企业,深圳创建公司注意事项,网站域名要怎样规划,建设部网站注册查询【HarmonyOS】 鸿蒙保存图片或视频到相册
前言
鸿蒙中保存图片或者视频#xff0c;或者其他媒体文件到设备的媒体库#xff0c;可以是相册#xff0c;也可以是文件管理等。共有两种方式#xff1a;
需要应用申请受限权限#xff0c;获取文件读写的权限#xff08;调用…【HarmonyOS】 鸿蒙保存图片或视频到相册
前言
鸿蒙中保存图片或者视频或者其他媒体文件到设备的媒体库可以是相册也可以是文件管理等。共有两种方式
需要应用申请受限权限获取文件读写的权限调用需要ohos.permission.READ_IMAGEVIDEO和ohos.permission.WRITE_IMAGEVIDEO的权限这样就可以将媒体资源图片or视频or等等保存到媒体库。通过安全控件用户触发后表示同意可以临时授权给应用就行保存处理。
关于第二种安全控件又分为saveButton保存按钮和showAssetsCreationDialog授权弹框两种形式。前者的按钮样式不能自定义所以后者以弹框的形式让用户操作触发入口的样式应用就可以自定义了。后者算是前者的一种替代补充。
一、保存图片和视频授权示例
需要申请ohos.permission.READ_IMAGEVIDEO和ohos.permission.WRITE_IMAGEVIDEO权限。该权限是管制权限需要你的应用去通过场景申请【申请使用受限权限】
配置权限READ_IMAGEVIDEOWRITE_IMAGEVIDEO
requestPermissions: [{name: ohos.permission.READ_IMAGEVIDEO,usedScene: {abilities: [EntryAbility],when: inuse},reason: $string:CAMERA},{name: ohos.permission.WRITE_IMAGEVIDEO,usedScene: {abilities: [EntryAbility],when: inuse},reason: $string:CAMERA}
]向用户申请权限
// 创建申请权限明细async reqPermissionsFromUser(): Promisenumber[] {let context getContext() as common.UIAbilityContext;let atManager abilityAccessCtrl.createAtManager();let grantStatus await atManager.requestPermissionsFromUser(context, [ohos.permission.READ_IMAGEVIDEO,ohos.permission.WRITE_IMAGEVIDEO]);return grantStatus.authResults;}// 用户申请权限async requestPermission() {let grantStatus await this.reqPermissionsFromUser();for (let i 0; i grantStatus.length; i) {if (grantStatus[i] 0) {// 用户授权可以继续访问目标操作}}}保存图片到媒体库
public async savePicture(buffer: ArrayBuffer): Promisevoid {let helper : photoAccessHelper.PhotoAccessHelper photoAccessHelper.getPhotoAccessHelper(getContext(this) as common.UIAbilityContext);let options: photoAccessHelper.CreateOptions {title: Date.now().toString()};let photoUri: string await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, jpg, options);console.info(photoUri)// createAsset的调用需要ohos.permission.READ_IMAGEVIDEO和ohos.permission.WRITE_IMAGEVIDEO的权限let file: fs.File fs.openSync(photoUri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);await fs.write(file.fd, buffer);fs.closeSync(file);
}二、saveButton示例
import { photoAccessHelper } from kit.MediaLibraryKit;Entry
Component
struct saveButtonExample {saveButtonOptions: SaveButtonOptions {icon: SaveIconStyle.FULL_FILLED,text: SaveDescription.SAVE_IMAGE,buttonType: ButtonType.Capsule} // 设置安全控件按钮属性build() {Row() {Column() {SaveButton(this.saveButtonOptions) // 创建安全控件按钮.onClick(async (event, result: SaveButtonOnClickResult) {if (result SaveButtonOnClickResult.SUCCESS) {try {let context getContext();let phAccessHelper photoAccessHelper.getPhotoAccessHelper(context);// 需要确保fileUri对应的资源存在let fileUri file://com.example.temptest/data/storage/el2/base/haps/entry/files/test.jpg;let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest(context, fileUri);await phAccessHelper.applyChanges(assetChangeRequest);console.info(createAsset successfully, uri: assetChangeRequest.getAsset().uri);} catch (err) {console.error(create asset failed with error: ${err.code}, ${err.message});}} else {console.error(SaveButtonOnClickResult create asset failed);}})}.width(100%)}.height(100%)}
}三、 showAssetsCreationDialog示例
import { photoAccessHelper } from kit.MediaLibraryKit;
import { fileIo } from kit.CoreFileKit;let context getContext(this);
let phAccessHelper photoAccessHelper.getPhotoAccessHelper(context);async function showAssetsCreationDialogExample() {try {// 指定待保存到媒体库的位于应用沙箱的图片urilet srcFileUri file://com.example.temptest/data/storage/el2/base/haps/entry/files/test.jpg;let srcFileUris: Arraystring [srcFileUri];// 指定待保存照片的创建选项包括文件后缀和照片类型标题和照片子类型可选let photoCreationConfigs: ArrayphotoAccessHelper.PhotoCreationConfig [{title: test, // 可选fileNameExtension: jpg,photoType: photoAccessHelper.PhotoType.IMAGE,subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选}];// 基于弹窗授权的方式获取媒体库的目标urilet desFileUris: Arraystring await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);// 将来源于应用沙箱的照片内容写入媒体库的目标urilet desFile: fileIo.File await fileIo.open(desFileUris[0], fileIo.OpenMode.WRITE_ONLY);let srcFile: fileIo.File await fileIo.open(srcFileUri, fileIo.OpenMode.READ_ONLY);await fileIo.copyFile(srcFile.fd, desFile.fd);fileIo.closeSync(srcFile);fileIo.closeSync(desFile);console.info(create asset by dialog successfully);} catch (err) {console.error(failed to create asset by dialog successfully errCode is: ${err.code}, ${err.message});}
}注意 1. 使用createAsset需要指定是视频还是图片 fileio.open并不校验文件内容 2. 使用createImageAssetRequest接口如果要保存视频需要用createVideoeAssetRequest 或者还可以直接使用createAssetRequest和addResource的方式