鸿蒙中相册权限弹窗

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();
相关推荐
一只大侠的侠5 小时前
Flutter开源鸿蒙跨平台训练营 Day 10特惠推荐数据的获取与渲染
flutter·开源·harmonyos
御承扬11 小时前
鸿蒙NDK UI之文本自定义样式
ui·华为·harmonyos·鸿蒙ndk ui
前端不太难11 小时前
HarmonyOS 游戏上线前必做的 7 类极端场景测试
游戏·状态模式·harmonyos
大雷神11 小时前
HarmonyOS智慧农业管理应用开发教程--高高种地--第29篇:数据管理与备份
华为·harmonyos
讯方洋哥12 小时前
HarmonyOS App开发——关系型数据库应用App开发
数据库·harmonyos
巴德鸟13 小时前
华为手机鸿蒙4回退到鸿蒙3到鸿蒙2再回退到EMUI11 最后关闭系统更新
华为·智能手机·harmonyos·降级·升级·回退·emui
一起养小猫13 小时前
Flutter for OpenHarmony 实战_魔方应用UI设计与交互优化
flutter·ui·交互·harmonyos
一只大侠的侠14 小时前
Flutter开源鸿蒙跨平台训练营 Day7Flutter+ArkTS双方案实现轮播图+搜索框+导航组件
flutter·开源·harmonyos
那就回到过去14 小时前
VRRP协议
网络·华为·智能路由器·ensp·vrrp协议·网络hcip
相思难忘成疾14 小时前
通向HCIP之路:第四步:边界网关路由协议—BGP(概念、配置、特点、常见问题及其解决方案)
网络·华为·hcip