huawei.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. // permissionHelper.js
  2. // 权限说明配置(可以根据需要扩展)
  3. const permissionList = [
  4. {
  5. name: 'android.permission.CAMERA',
  6. title: '使用摄像头权限',
  7. content: '用于更换、上传您的头像、图片功能,不授权该权限会影响app的正常使用'
  8. },
  9. {
  10. name: 'android.permission.READ_EXTERNAL_STORAGE',
  11. title: '读照片及文件权限',
  12. content: '用于更换、上传您的头像、图片功能,不授权该权限会影响app的正常使用'
  13. },
  14. {
  15. name: 'android.permission.ACCESS_FINE_LOCATION',
  16. title: '访问精确位置权限',
  17. content: '用于获取用户位置,以便为用户提供有地域特点的服务'
  18. }
  19. // ... 可以在此添加其他权限
  20. ];
  21. /**
  22. * 检查特定权限状态
  23. * @param {string} permission - 要检查的权限名称
  24. * @returns {Promise<boolean>} - 返回权限是否已授予
  25. */
  26. export function checkPermission(permission) {
  27. return new Promise((resolve) => {
  28. // iOS 处理
  29. if (plus.os.name === 'iOS') {
  30. // iOS 权限检查方式与 Android 不同,通常需要调用特定API或尝试使用功能
  31. resolve(true); // 简化处理,实际项目需完善
  32. return;
  33. }
  34. // Android 处理
  35. const main = plus.android.runtimeMainActivity();
  36. const result = main.checkSelfPermission(permission);
  37. resolve(result === 0); // 0 表示已授权
  38. });
  39. }
  40. /**
  41. * 申请单个权限
  42. * @param {string} permission - 要申请的权限名称
  43. * @returns {Promise<Object>} - 返回授权结果对象
  44. */
  45. export function requestSinglePermission(permission) {
  46. return new Promise((resolve) => {
  47. plus.android.requestPermissions([permission], (e) => {
  48. resolve(e);
  49. });
  50. });
  51. }
  52. /**
  53. * 显示权限说明弹窗
  54. * @param {Object} permissionInfo - 权限信息对象
  55. * @returns {Promise<boolean>} - 用户是否同意申请
  56. */
  57. export function showPermissionExplanation(permissionInfo) {
  58. return new Promise((resolve) => {
  59. uni.showModal({
  60. title: permissionInfo.title,
  61. content: permissionInfo.content,
  62. confirmText: '去开启',
  63. cancelText: '暂不',
  64. success: (res) => {
  65. resolve(res.confirm);
  66. },
  67. fail: (err) => {
  68. console.error('显示权限说明弹窗失败:', err);
  69. resolve(false);
  70. }
  71. });
  72. });
  73. }
  74. /**
  75. * 引导用户前往应用系统设置页面
  76. */
  77. export function openAppSystemSettings() {
  78. // iOS 处理
  79. if (plus.os.name === 'iOS') {
  80. const UIApplication = plus.ios.importClass('UIApplication');
  81. const NSURL = plus.ios.importClass('NSURL');
  82. const app = UIApplication.sharedApplication();
  83. const settingUrl = NSURL.URLWithString('app-settings:');
  84. plus.ios.invoke(app, 'openURL:', settingUrl);
  85. plus.ios.deleteObject(settingUrl);
  86. plus.ios.deleteObject(NSURL);
  87. plus.ios.deleteObject(app);
  88. return;
  89. }
  90. // Android 处理
  91. const mainActivity = plus.android.runtimeMainActivity();
  92. const Intent = plus.android.importClass('android.content.Intent');
  93. const Settings = plus.android.importClass('android.provider.Settings');
  94. const Uri = plus.android.importClass('android.net.Uri');
  95. try {
  96. const intent = new Intent();
  97. intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  98. const uri = Uri.fromParts('package', mainActivity.getPackageName(), null);
  99. intent.setData(uri);
  100. mainActivity.startActivity(intent);
  101. } catch (error) {
  102. uni.showToast({
  103. title: '无法打开设置页面',
  104. icon: 'none'
  105. });
  106. }
  107. }
  108. /**
  109. * 处理权限申请结果
  110. * @param {string} permission - 权限名称
  111. * @param {Object} result - 授权结果对象
  112. * @param {Object} permissionInfo - 权限信息对象(用于提示)
  113. */
  114. export async function handlePermissionResult(permission, result, permissionInfo) {
  115. // 权限被永久拒绝(用户选择了"不再询问")
  116. if (result.deniedAlways && result.deniedAlways.length > 0) {
  117. uni.showModal({
  118. title: '权限未开启',
  119. content: `您已拒绝${permissionInfo.title},请到系统设置中手动开启`,
  120. confirmText: '前往设置',
  121. success: (res) => {
  122. if (res.confirm) {
  123. openAppSystemSettings();
  124. }
  125. }
  126. });
  127. }
  128. // 权限被临时拒绝(用户只是点了"拒绝")
  129. else if (result.deniedPresent && result.deniedPresent.length > 0) {
  130. uni.showToast({
  131. title: `${permissionInfo.title}未被授权,部分功能可能无法使用`,
  132. icon: 'none',
  133. duration: 3000
  134. });
  135. }
  136. // 如果 granted 长度 > 0,表示权限已获取
  137. }
  138. /**
  139. * 主权限申请流程
  140. * @param {string} permission - 需要申请的权限名称
  141. * @returns {Promise<boolean>} - 最终是否获取了权限
  142. */
  143. export async function requestEssentialPermission(permission) {
  144. const permissionInfo = permissionList.find(item => item.name === permission);
  145. if (!permissionInfo) {
  146. console.error('未找到该权限的配置信息');
  147. return false;
  148. }
  149. try {
  150. // 1. 首先检查是否已有权限
  151. const hasPermission = await checkPermission(permission);
  152. if (hasPermission) {
  153. return true;
  154. }
  155. // 2. 没有权限,展示说明弹窗
  156. const userAgreed = await showPermissionExplanation(permissionInfo);
  157. if (!userAgreed) {
  158. // 用户不同意申请,记录或处理
  159. return false;
  160. }
  161. // 3. 用户同意,申请系统权限
  162. const result = await requestSinglePermission(permission);
  163. // 4. 处理申请结果
  164. await handlePermissionResult(permission, result, permissionInfo);
  165. // 5. 最终检查权限状态
  166. const finalStatus = await checkPermission(permission);
  167. return finalStatus;
  168. } catch (error) {
  169. console.error('权限申请流程出错:', error);
  170. return false;
  171. }
  172. }