主页 > 电脑硬件  > 

鸿蒙中打开相机相册

鸿蒙中打开相机相册

1。module.json5中配置相应的权限

requestPermissions: [ { "name": "ohos.permission.CAMERA", "reason": "$string:permission_reason_camera", "usedScene": { "abilities": [ "EntryAbility" ], "when": "inuse" } }, { "name": 'ohos.permission.READ_MEDIA', "reason":"$string:permission_reason_IMG", "usedScene": {} } ],

2.src/main/resources/base/element/string.json配置提示说明

{ "name": "permission_reason_camera", "value": "Used for scanning barcodes" }, { "name": "permission_reason_IMG", "value": "用于获取图库信息" }

3.ui部分

import { PhotoClass } from './utils/PhotoClass'; @Entry @Component struct MyComponent { build() { Column() { Button('相机') .onClick(async () => { const takePicture = await PhotoClass.requestCameraPermission() as string if (takePicture) { console.log("拍照成功,URI: ", takePicture); // 打印成功情况 } else { console.error("拍照失败,没有返回的图片 URI"); } }) Button('相册').onClick(async () => { try { const takePicture = await PhotoClass.photoAlbum(getContext()); // 使用 await 获取相册返回的结果 console.log("访问相册成功,URI: ", takePicture); // 打印成功情况 } catch (error) { console.error("访问相册过程中发生错误: ", error); } }) } } }

4.添加相应工具

  4-1:PhotoClass

import { camera, cameraPicker } from "@kit.CameraKit" import { abilityAccessCtrl, common, Permissions } from "@kit.AbilityKit" import { BusinessError } from "@kit.BasicServicesKit" import { CustomDialogExampleTwo } from "./PhotoAuthorizationDialog"; import { permission } from "./Permission"; export class PhotoClass { private static dialogControllerTwo: CustomDialogController | null = new CustomDialogController({ builder: CustomDialogExampleTwo(), onWillDismiss: (dismissDialogAction: DismissDialogAction) => { console.info("reason=" + JSON.stringify(dismissDialogAction.reason)); console.log("dialog onWillDismiss"); if (dismissDialogAction.reason === DismissReason.PRESS_BACK || dismissDialogAction.reason === DismissReason.TOUCH_OUTSIDE) { dismissDialogAction.dismiss(); } }, offset: { dx: 0, dy: -25 } }); private static PermissionsData: Permissions[] = ['ohos.permission.READ_MEDIA']; private static context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; public static async startCameraPicker(context: Context): Promise<string | undefined> { try { const pickerProfile: cameraPicker.PickerProfile = { cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK }; const pickerResult: cameraPicker.PickerResult = await cameraPicker.pick(context, [cameraPicker.PickerMediaType.PHOTO, cameraPicker.PickerMediaType.VIDEO], pickerProfile ); console.log("The picker result is: " + JSON.stringify(pickerResult)); if (pickerResult.resultCode === 0) { const takePicture = pickerResult.resultUri; context.eventHub.emit("updateImage", pickerResult.resultUri); return takePicture } } catch (error) { const err = error as BusinessError; console.error(`The pick call failed. Error code: ${err.code}`); return undefined } return undefined } public static async photoAlbum(context: Context): Promise<string> { let url: string = ''; const isAccess = await permission.checkAccess(PhotoClass.PermissionsData[0]); if (isAccess) { url = await permission.updateAvatar(); } else { url = await permission.reqPermissionsFromUser(PhotoClass.PermissionsData, PhotoClass.context); } return url; } public static async reqPermissionsFromUser(): Promise<number[]> { const context = getContext() as common.UIAbilityContext; const atManager = abilityAccessCtrl.createAtManager(); const grantStatus = await atManager.requestPermissionsFromUser(context, ['ohos.permission.CAMERA']); return grantStatus.authResults; } public static async requestCameraPermission(): Promise<string | undefined> { const grantStatus = await PhotoClass.reqPermissionsFromUser(); for (const status of grantStatus) { if (status === 0) { return await PhotoClass.startCameraPicker(PhotoClass.context); } else if (status === -1 && PhotoClass.dialogControllerTwo) { await PhotoClass.dialogControllerTwo.open(); } } return undefined } }

4-2:Permission

import { photoAccessHelper } from "@kit.MediaLibraryKit"; import { abilityAccessCtrl, bundleManager, common, Permissions, Want } from '@kit.AbilityKit'; import { BusinessError } from "@kit.BasicServicesKit"; import { promptAction } from "@kit.ArkUI"; class Permission { private atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager(); private confirmConfig: promptAction.ShowDialogOptions = { title: "温馨提示", message: "未授权访问媒体资源无法打开相册,是否前往设置进行授权?", buttons: [ { text: '离开', color: '40vp' }, { text: '去授权', color: '#000' } ] } // 检查是否授权 async checkAccess(permissions: Permissions) { let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION | bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_METADATA; const ApplicationInfo = bundleManager.getBundleInfoForSelfSync(bundleFlags) let tokenID: number = ApplicationInfo.appInfo.accessTokenId // permissions.forEach((item: Permissions) => { const data = await this.atManager.checkAccessToken(tokenID, permissions) if (data === 0) { return true } else { return false } } // 申请授权 async reqPermissionsFromUser(permissions: Array<Permissions>, context: common.UIAbilityContext) { // 选中图片信息 const data = await this.atManager.requestPermissionsFromUser(context, permissions) let grantStatus: Array<number> = data.authResults; if (grantStatus[0] === 0) { // 用户授权,可以继续访问目标操作 const str = await this.updateAvatar() return str } else { // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限 promptAction.showDialog(this.confirmConfig).then((confirm) => { if (confirm.index === 1) { this.openPermissionSetting(permissions) } }) return '' } } // 打开权限设置 async openPermissionSetting(permissions: Array<Permissions>) { let context: Context = getContext(this) as common.UIAbilityContext; this.atManager.requestPermissionOnSetting(context, permissions) .then((data: Array<abilityAccessCtrl.GrantStatus>) => { if (data[0] === 0) { promptAction.showToast({ message: '授权成功' }) } else { promptAction.showToast({ message: '授权失败,请重新授权' }) } }) .catch((err: BusinessError) => { console.log('openPermissionSettingErr', JSON.stringify(err)) }); } // 打开相册 async updateAvatar() { // 1. 选择相册照片 // 选择照片配置 const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions() photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE photoSelectOptions.maxSelectNumber = 1 // 选择照片对象 const photoPicker = new photoAccessHelper.PhotoViewPicker() const photoResult = await photoPicker.select(photoSelectOptions) const uri = photoResult.photoUris[0] return uri } } export const permission = new Permission()

4-3:PhotoAuthorizationDialog

import { common, Want } from "@kit.AbilityKit" @CustomDialog export struct CustomDialogExampleTwo { controllerTwo?: CustomDialogController build() { Column() { Text('应用相机权限未开启,是否前往开启').fontSize(20).margin({ top: 45, bottom: 45 }) Flex({ justifyContent: FlexAlign.SpaceAround }) { Button('取消').width('45%') .onClick(() => { this.controllerTwo?.close() }).backgroundColor('#f4f4f4').fontColor(Color.Black) Button('前往').width('45%') .onClick(() => { let context = getContext(this) as common.UIAbilityContext; let want: Want = { bundleName: 'com.huawei.hmos.settings', //设置应用bundleName abilityName: 'com.huawei.hmos.settings.MainAbility', //设置应用abilityName uri: "application_info_entry", //通知管理页面 parameters: { pushParams: context.abilityInfo.bundleName } } context.startAbility(want) this.controllerTwo?.close() }).backgroundColor('#ff313b').fontColor(Color.White) }.margin({ bottom: 20 }) } } }

标签:

鸿蒙中打开相机相册由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“鸿蒙中打开相机相册