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