214 lines
6.0 KiB
JavaScript
214 lines
6.0 KiB
JavaScript
/**
|
||
* 权限管理工具类
|
||
* 用于统一处理应用权限请求和管理
|
||
*/
|
||
class PermissionManager {
|
||
/**
|
||
* 确保权限已授予
|
||
* @param {String} permissionType - 权限类型,如 'record'(录音权限)
|
||
* @param {Object} options - 配置选项
|
||
* @param {String} options.permissionName - 权限名称,用于提示用户
|
||
* @param {String} options.reason - 权限用途说明
|
||
* @param {Boolean} options.showGuide - 是否显示引导提示
|
||
* @returns {Promise<Boolean>} 返回是否已授予权限
|
||
*/
|
||
static async ensurePermission(permissionType, options = {}) {
|
||
const {
|
||
permissionName = '权限',
|
||
reason = '使用相关功能',
|
||
showGuide = true
|
||
} = options;
|
||
|
||
// #ifdef APP-PLUS
|
||
return new Promise((resolve) => {
|
||
// APP环境使用plus API
|
||
if (typeof plus === 'undefined') {
|
||
console.warn('[PermissionManager] plus API不可用');
|
||
resolve(false);
|
||
return;
|
||
}
|
||
|
||
// 根据权限类型映射到plus权限常量
|
||
let permission = null;
|
||
if (permissionType === 'record' || permissionType === 'microphone') {
|
||
permission = 'RECORD_AUDIO';
|
||
} else if (permissionType === 'camera') {
|
||
permission = 'CAMERA';
|
||
} else if (permissionType === 'location') {
|
||
permission = 'ACCESS_FINE_LOCATION';
|
||
} else {
|
||
console.warn(`[PermissionManager] 未知的权限类型: ${permissionType}`);
|
||
resolve(false);
|
||
return;
|
||
}
|
||
|
||
// 检查权限状态
|
||
plus.android.checkPermission(permission, (result) => {
|
||
if (result === 1) {
|
||
// 已授权
|
||
resolve(true);
|
||
} else {
|
||
// 未授权,请求权限
|
||
plus.android.requestPermission(
|
||
permission,
|
||
(result) => {
|
||
if (result === 1) {
|
||
// 用户同意授权
|
||
resolve(true);
|
||
} else {
|
||
// 用户拒绝授权
|
||
if (showGuide) {
|
||
uni.showModal({
|
||
title: `需要${permissionName}权限`,
|
||
content: `${reason}需要${permissionName}权限才能使用。\n\n请前往:\n手机设置 → 应用管理 → 忆境 → 权限管理 → 开启${permissionName}权限`,
|
||
confirmText: '我知道了',
|
||
showCancel: false
|
||
});
|
||
}
|
||
resolve(false);
|
||
}
|
||
},
|
||
(error) => {
|
||
console.error(`[PermissionManager] 请求${permissionName}权限失败:`, error);
|
||
if (showGuide) {
|
||
uni.showModal({
|
||
title: `需要${permissionName}权限`,
|
||
content: `${reason}需要${permissionName}权限才能使用。\n\n请前往:\n手机设置 → 应用管理 → 时光意境 → 权限管理 → 开启${permissionName}权限`,
|
||
confirmText: '我知道了',
|
||
showCancel: false
|
||
});
|
||
}
|
||
resolve(false);
|
||
}
|
||
);
|
||
}
|
||
}, (error) => {
|
||
console.error(`[PermissionManager] 检查${permissionName}权限失败:`, error);
|
||
resolve(false);
|
||
});
|
||
});
|
||
// #endif
|
||
|
||
// #ifndef APP-PLUS
|
||
// 非APP环境(H5、小程序等)使用uni-app的权限API
|
||
return new Promise((resolve) => {
|
||
// 小程序和H5使用不同的权限检查方式
|
||
// #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ
|
||
// 小程序环境
|
||
const scopeMap = {
|
||
'record': 'scope.record',
|
||
'microphone': 'scope.record',
|
||
'camera': 'scope.camera',
|
||
'location': 'scope.userLocation'
|
||
};
|
||
|
||
const scope = scopeMap[permissionType] || 'scope.record';
|
||
|
||
uni.getSetting({
|
||
success: (res) => {
|
||
if (res.authSetting[scope]) {
|
||
// 已授权
|
||
resolve(true);
|
||
} else if (res.authSetting[scope] === false) {
|
||
// 已拒绝,引导用户去设置
|
||
if (showGuide) {
|
||
uni.showModal({
|
||
title: `需要${permissionName}权限`,
|
||
content: `请在设置中开启${permissionName}权限`,
|
||
confirmText: '去设置',
|
||
cancelText: '取消',
|
||
success: (modalRes) => {
|
||
if (modalRes.confirm) {
|
||
uni.openSetting({
|
||
success: (settingRes) => {
|
||
resolve(settingRes.authSetting[scope] || false);
|
||
},
|
||
fail: () => {
|
||
resolve(false);
|
||
}
|
||
});
|
||
} else {
|
||
resolve(false);
|
||
}
|
||
}
|
||
});
|
||
} else {
|
||
resolve(false);
|
||
}
|
||
} else {
|
||
// 未授权过,请求授权
|
||
uni.authorize({
|
||
scope: scope,
|
||
success: () => {
|
||
resolve(true);
|
||
},
|
||
fail: () => {
|
||
if (showGuide) {
|
||
uni.showModal({
|
||
title: `需要${permissionName}权限`,
|
||
content: `请允许使用${permissionName}进行${reason}`,
|
||
confirmText: '去设置',
|
||
cancelText: '取消',
|
||
success: (modalRes) => {
|
||
if (modalRes.confirm) {
|
||
uni.openSetting({
|
||
success: (settingRes) => {
|
||
resolve(settingRes.authSetting[scope] || false);
|
||
},
|
||
fail: () => {
|
||
resolve(false);
|
||
}
|
||
});
|
||
} else {
|
||
resolve(false);
|
||
}
|
||
}
|
||
});
|
||
} else {
|
||
resolve(false);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
},
|
||
fail: () => {
|
||
// 获取设置失败,默认返回false
|
||
resolve(false);
|
||
}
|
||
});
|
||
// #endif
|
||
|
||
// #ifdef H5
|
||
// H5环境,使用浏览器API
|
||
if (permissionType === 'record' || permissionType === 'microphone') {
|
||
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
|
||
navigator.mediaDevices.getUserMedia({ audio: true })
|
||
.then((stream) => {
|
||
// 立即停止流,只是检查权限
|
||
stream.getTracks().forEach(track => track.stop());
|
||
resolve(true);
|
||
})
|
||
.catch((error) => {
|
||
if (showGuide) {
|
||
alert(`需要${permissionName}权限\n\n${reason}需要${permissionName}权限才能使用。\n\n请在浏览器设置中允许访问${permissionName}。`);
|
||
}
|
||
resolve(false);
|
||
});
|
||
} else {
|
||
if (showGuide) {
|
||
alert(`您的浏览器不支持${permissionName}功能`);
|
||
}
|
||
resolve(false);
|
||
}
|
||
} else {
|
||
resolve(false);
|
||
}
|
||
// #endif
|
||
});
|
||
// #endif
|
||
}
|
||
}
|
||
|
||
export default PermissionManager;
|
||
|