index.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // PermissionHandler.js
  2. import permisionUtil from "./permission.js";
  3. import {
  4. popup
  5. } from './native_popup.js';
  6. const prefix = 'permision_';
  7. const PermissionStatus = {
  8. GRANTED: 1,
  9. DENIED: -1,
  10. ERROR: 0
  11. };
  12. // 权限配置对象
  13. const permissionConfig = {
  14. chooseImage: {
  15. permissions: ['android.permission.CAMERA', 'android.permission.READ_EXTERNAL_STORAGE'],
  16. message: '为了正确识别证件内容,实现图片转文字功能等, 我们需要申请您设备的相机和存储权限。'
  17. },
  18. chooseVideo: {
  19. permissions: ['android.permission.CAMERA', 'android.permission.READ_EXTERNAL_STORAGE'],
  20. message: '为了发布信息图片视频等, 我们需要申请您设备的相机和存储权限。'
  21. },
  22. saveImageToPhotosAlbum: {
  23. permissions: ['android.permission.WRITE_EXTERNAL_STORAGE'],
  24. message: '为了保存推广海报到手机相册, 我们需要申请您设备的存储权限。'
  25. },
  26. getLocation: {
  27. permissions: ['android.permission.ACCESS_FINE_LOCATION'],
  28. message: '为了根据您的位置展示信息, 我们需要申请您设备的位置权限。'
  29. },
  30. getRecorderManager: {
  31. permissions: ['android.permission.RECORD_AUDIO'],
  32. message: '为了使用语言消息功能等, 我们需要申请您设备的麦克风权限。'
  33. }
  34. };
  35. // 显示权限说明弹窗
  36. const showPermissionExplanation = function(content) {
  37. return new Promise((resolve, reject) => {
  38. uni.showModal({
  39. title: '权限申请说明',
  40. content: content,
  41. cancelText: '拒绝',
  42. confirmText: '允许',
  43. success: (res) => {
  44. if (res.confirm) {
  45. // 用户点击允许
  46. resolve(true);
  47. } else {
  48. // 用户点击拒绝
  49. reject(false);
  50. }
  51. }
  52. });
  53. });
  54. };
  55. // 请求权限并处理
  56. const requestPermissions = async function(permissions, message) {
  57. try {
  58. const explanationAccepted = await showPermissionExplanation(message);
  59. if (explanationAccepted) {
  60. for (const permission of permissions) {
  61. const status = await permisionUtil.requestAndroidPermission(permission);
  62. if (status !== PermissionStatus.GRANTED) {
  63. return false; // 如果有任何权限请求失败,返回 false
  64. }
  65. }
  66. return true; // 所有权限请求成功
  67. }
  68. } catch (error) {
  69. return false; // 用户拒绝说明弹窗
  70. }
  71. };
  72. // 添加权限拦截器
  73. const addPermissionInterceptor = function(apiName) {
  74. const {
  75. permissions,
  76. message
  77. } = permissionConfig[apiName];
  78. uni.addInterceptor(apiName, {
  79. invoke(args) {
  80. return new Promise(async (resolve, reject) => {
  81. const perm = uni.getStorageSync(prefix + apiName);
  82. if (perm === PermissionStatus.GRANTED) {
  83. resolve(args); // 权限已授予,继续执行
  84. return;
  85. }
  86. const permissionsGranted = await requestPermissions(permissions, message);
  87. if (permissionsGranted) {
  88. uni.setStorageSync(prefix + apiName, PermissionStatus.GRANTED);
  89. resolve(args); // 权限请求成功,继续执行
  90. } else {
  91. reject(args); // 权限请求失败,提示用户手动开启权限
  92. uni.showModal({
  93. title: '权限被拒绝',
  94. content: '请前往设置手动开启权限,以便使用该功能。',
  95. showCancel: false,
  96. confirmText: '知道了'
  97. });
  98. }
  99. });
  100. },
  101. fail(err) {
  102. console.error('权限请求失败', err);
  103. }
  104. });
  105. };
  106. // 导出功能
  107. export default {
  108. addPermissionInterceptor
  109. };