| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- // PermissionHandler.js
- import permisionUtil from "./permission.js";
- import {
- popup
- } from './native_popup.js';
- const prefix = 'permision_';
- const PermissionStatus = {
- GRANTED: 1,
- DENIED: -1,
- ERROR: 0
- };
- // 权限配置对象
- const permissionConfig = {
- chooseImage: {
- permissions: ['android.permission.CAMERA', 'android.permission.READ_EXTERNAL_STORAGE'],
- message: '为了正确识别证件内容,实现图片转文字功能等, 我们需要申请您设备的相机和存储权限。'
- },
- chooseVideo: {
- permissions: ['android.permission.CAMERA', 'android.permission.READ_EXTERNAL_STORAGE'],
- message: '为了发布信息图片视频等, 我们需要申请您设备的相机和存储权限。'
- },
- saveImageToPhotosAlbum: {
- permissions: ['android.permission.WRITE_EXTERNAL_STORAGE'],
- message: '为了保存推广海报到手机相册, 我们需要申请您设备的存储权限。'
- },
- getLocation: {
- permissions: ['android.permission.ACCESS_FINE_LOCATION'],
- message: '为了根据您的位置展示信息, 我们需要申请您设备的位置权限。'
- },
- getRecorderManager: {
- permissions: ['android.permission.RECORD_AUDIO'],
- message: '为了使用语言消息功能等, 我们需要申请您设备的麦克风权限。'
- }
- };
- // 显示权限说明弹窗
- const showPermissionExplanation = function(content) {
- return new Promise((resolve, reject) => {
- uni.showModal({
- title: '权限申请说明',
- content: content,
- cancelText: '拒绝',
- confirmText: '允许',
- success: (res) => {
- if (res.confirm) {
- // 用户点击允许
- resolve(true);
- } else {
- // 用户点击拒绝
- reject(false);
- }
- }
- });
- });
- };
- // 请求权限并处理
- const requestPermissions = async function(permissions, message) {
- try {
- const explanationAccepted = await showPermissionExplanation(message);
- if (explanationAccepted) {
- for (const permission of permissions) {
- const status = await permisionUtil.requestAndroidPermission(permission);
- if (status !== PermissionStatus.GRANTED) {
- return false; // 如果有任何权限请求失败,返回 false
- }
- }
- return true; // 所有权限请求成功
- }
- } catch (error) {
- return false; // 用户拒绝说明弹窗
- }
- };
- // 添加权限拦截器
- const addPermissionInterceptor = function(apiName) {
- const {
- permissions,
- message
- } = permissionConfig[apiName];
- uni.addInterceptor(apiName, {
- invoke(args) {
- return new Promise(async (resolve, reject) => {
- const perm = uni.getStorageSync(prefix + apiName);
- if (perm === PermissionStatus.GRANTED) {
- resolve(args); // 权限已授予,继续执行
- return;
- }
- const permissionsGranted = await requestPermissions(permissions, message);
- if (permissionsGranted) {
- uni.setStorageSync(prefix + apiName, PermissionStatus.GRANTED);
- resolve(args); // 权限请求成功,继续执行
- } else {
- reject(args); // 权限请求失败,提示用户手动开启权限
- uni.showModal({
- title: '权限被拒绝',
- content: '请前往设置手动开启权限,以便使用该功能。',
- showCancel: false,
- confirmText: '知道了'
- });
- }
- });
- },
- fail(err) {
- console.error('权限请求失败', err);
- }
- });
- };
- // 导出功能
- export default {
- addPermissionInterceptor
- };
|