鸿蒙中相册权限弹窗

model.json5配置权限

TypeScript 复制代码
 {
        "name": 'ohos.permission.READ_MEDIA',
        "reason":"$string:permission_reason_IMG",
        "usedScene": {}

      }

ui使用

TypeScript 复制代码
  const url = albumClass.onRequestCameraPermission()

TypeScript 复制代码
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_TYPE
    photoSelectOptions.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();
相关推荐
ifeng09183 小时前
HarmonyOS分布式任务调度——跨设备智能任务分配与迁移
分布式·华为·harmonyos
杨朝为-蓝松抠图SDK6 小时前
相机直播,HDMI线怎么选择
数码相机·绿幕抠图·绿幕直播·蓝松抠图·直播间搭建·发丝级抠图
鸿蒙小白龙7 小时前
OpenHarmony蓝牙技术全解析:从设备发现到数据传输的完整流程
harmonyos·鸿蒙·鸿蒙系统·open harmony
shenshizhong9 小时前
鸿蒙HDF框架源码分析
前端·源码·harmonyos
夏之繁花10 小时前
BeautyPlus v7.21.0 美颜相机修图编辑
数码相机·美颜相机
柠檬甜不甜呀10 小时前
海康相机与机器人标定
数码相机·计算机视觉·机器人
宇宙最强的无天佛祖13 小时前
鸿蒙开发中快速获取相册图片的缩略图
harmonyos
冰冷的bin14 小时前
【Harmony】鸿蒙相机拍照使用简单示例
数码相机·华为·harmonyos
爱笑的眼睛1118 小时前
HarmonyOS RemoteWindow远程窗口组件的分布式能力深度解析
华为·harmonyos
鲜枣课堂21 小时前
华为最新光通信架构AI-OTN,如何应对AI浪潮?
人工智能·华为·架构