model.json5配置權限
{"name": 'ohos.permission.READ_MEDIA',"reason":"$string:permission_reason_IMG","usedScene": {}}
ui使用
const url = albumClass.onRequestCameraPermission()
類
import { abilityAccessCtrl, common, PermissionRequestResult } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';
import { photoAccessHelper } from '@kit.MediaLibraryKit';/*相機*/
class AlbumClass {atManager: abilityAccessCtrl.AtManager;context: common.UIAbilityContext;private hasRequestedOnce: boolean = false; // 是否已經請求過一次constructor(context?: common.UIAbilityContext) {this.context = context ?? (getContext(this) as common.UIAbilityContext);this.atManager = abilityAccessCtrl.createAtManager();}/*** 智能權限請求:第一次只彈窗,第二次跳轉設置頁* @returns Promise<boolean> true=已授權,false=未授權*/public async requestPermissionSmart(): Promise<boolean> {if (!this.hasRequestedOnce) {// 第一次點擊,只彈系統權限彈窗const result = await this.requestPermission();if (!result) {// 用戶拒絕,標記已請求過,但不執行任何操作this.hasRequestedOnce = true;return false;}return true;} else {// 第二次點擊,跳轉設置頁return await this.requestPermissionInSettings();}}/*** 首次彈窗請求相機權限* @returns Promise<boolean> true=已授權,false=未授權*/public requestPermission(): Promise<boolean> {return this.atManager.requestPermissionsFromUser(this.context, ['ohos.permission.READ_MEDIA']).then((data: PermissionRequestResult) => {hilog.info(0x0000, 'PhotoClass', `data: ${JSON.stringify(data)}`);return data.authResults[0] === 0;}).catch((err: BusinessError) => {hilog.error(0x0000, 'PhotoClass', `data: ${JSON.stringify(err)}`);return false;});}/*** 跳轉設置頁請求相機權限* @returns Promise<boolean> true=已授權,false=未授權*/public requestPermissionInSettings(): Promise<boolean> {return this.atManager.requestPermissionOnSetting(this.context, ['ohos.permission.READ_MEDIA']).then((data: Array<abilityAccessCtrl.GrantStatus>) => {return data[0] === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;}).catch((err: BusinessError) => {hilog.error(0x0000, 'PhotoClass', `data: ${JSON.stringify(err)}`);return false;});}/*** 重置狀態(如果需要重新開始)*/public resetState(): void {this.hasRequestedOnce = false;}/*入口*/async onRequestCameraPermission() {const granted = await albumClass.requestPermissionSmart();if (granted) {let url = await this.updateAvatar();promptAction.showToast({ message: '相機權限已授權' });return url;} else {// 用戶拒絕,不執行任何操作,等待用戶再次點擊promptAction.showToast({ message: '如需使用相機,請再次點擊按鈕' });return ""}}async updateAvatar() {// 1. 選擇相冊照片// 選擇照片配置const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions()photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPEphotoSelectOptions.maxSelectNumber = 1// 選擇照片對象const photoPicker = new photoAccessHelper.PhotoViewPicker()const photoResult = await photoPicker.select(photoSelectOptions)const uri = photoResult.photoUris[0]return uri}
}export const albumClass = new AlbumClass();