鸿蒙中相册权限
·
类
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();
更多推荐



所有评论(0)