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 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
  }

  public async onRequestPermission() {
    try {
      // 第一步:尝试直接请求权限
      let granted = await albumClass.requestPermission();

      if (granted) {
        promptAction.showToast({ message: '相册权限已授权' });
        console.log('相册权限已获取,可以访问相册');
        let url = await this.updateAvatar(); // ✅ 调用选择头像
        return url; // ✅ 返回URL
      }

      // 第二步:如果直接请求失败,自动跳转设置页面
      promptAction.showToast({
        message: '权限被拒绝,正在跳转设置页面...',
        duration: 2000
      });

      // 等待一下让用户看到提示

      // 自动跳转到设置页面
      granted = await albumClass.requestPermissionInSettings();

      if (granted) {
        promptAction.showToast({ message: '相册权限已授权' });
        let url = await this.updateAvatar(); // ✅ 调用选择头像
        return url; // ✅ 返回URL
      } else {
        promptAction.showToast({
          message: '请在设置页面手动开启相册权限后返回应用',
          duration: 4000
        });
        return ''
      }

    } catch (error) {
      console.error('权限请求失败:', error);
      promptAction.showToast({
        message: '权限请求失败,请检查网络连接后重试',
        duration: 3000
      });
      return ''
    }
  }
}

export const albumClass = new AlbumClass();

使用

      const url = await albumClass.onRequestPermission();

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐