#介绍

封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启

#代码解析

  1. var isIos
  2. // #ifdef APP-PLUS
  3. isIos = (plus.os.name == "iOS")
  4. // #endif
  5. // 判断推送权限是否开启
  6. function judgeIosPermissionPush() {
  7. var result = false;
  8. var UIApplication = plus.ios.import("UIApplication");
  9. var app = UIApplication.sharedApplication();
  10. var enabledTypes = 0;
  11. if (app.currentUserNotificationSettings) {
  12. var settings = app.currentUserNotificationSettings();
  13. enabledTypes = settings.plusGetAttribute("types");
  14. console.log("enabledTypes1:" + enabledTypes);
  15. if (enabledTypes == 0) {
  16. console.log("推送权限没有开启");
  17. } else {
  18. result = true;
  19. console.log("已经开启推送功能!")
  20. }
  21. plus.ios.deleteObject(settings);
  22. } else {
  23. enabledTypes = app.enabledRemoteNotificationTypes();
  24. if (enabledTypes == 0) {
  25. console.log("推送权限没有开启!");
  26. } else {
  27. result = true;
  28. console.log("已经开启推送功能!")
  29. }
  30. console.log("enabledTypes2:" + enabledTypes);
  31. }
  32. plus.ios.deleteObject(app);
  33. plus.ios.deleteObject(UIApplication);
  34. return result;
  35. }
  36. // 判断定位权限是否开启
  37. function judgeIosPermissionLocation() {
  38. var result = false;
  39. var cllocationManger = plus.ios.import("CLLocationManager");
  40. var status = cllocationManger.authorizationStatus();
  41. result = (status != 2)
  42. console.log("定位权限开启:" + result);
  43. // 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation
  44. /* var enable = cllocationManger.locationServicesEnabled();
  45. var status = cllocationManger.authorizationStatus();
  46. console.log("enable:" + enable);
  47. console.log("status:" + status);
  48. if (enable && status != 2) {
  49. result = true;
  50. console.log("手机定位服务已开启且已授予定位权限");
  51. } else {
  52. console.log("手机系统的定位没有打开或未给予定位权限");
  53. } */
  54. plus.ios.deleteObject(cllocationManger);
  55. return result;
  56. }
  57. // 判断麦克风权限是否开启
  58. function judgeIosPermissionRecord() {
  59. var result = false;
  60. var avaudiosession = plus.ios.import("AVAudioSession");
  61. var avaudio = avaudiosession.sharedInstance();
  62. var permissionStatus = avaudio.recordPermission();
  63. console.log("permissionStatus:" + permissionStatus);
  64. if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {
  65. console.log("麦克风权限没有开启");
  66. } else {
  67. result = true;
  68. console.log("麦克风权限已经开启");
  69. }
  70. plus.ios.deleteObject(avaudiosession);
  71. return result;
  72. }
  73. // 判断相机权限是否开启
  74. function judgeIosPermissionCamera() {
  75. var result = false;
  76. var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
  77. var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
  78. console.log("authStatus:" + authStatus);
  79. if (authStatus == 3) {
  80. result = true;
  81. console.log("相机权限已经开启");
  82. } else {
  83. console.log("相机权限没有开启");
  84. }
  85. plus.ios.deleteObject(AVCaptureDevice);
  86. return result;
  87. }
  88. // 判断相册权限是否开启
  89. function judgeIosPermissionPhotoLibrary() {
  90. var result = false;
  91. var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
  92. var authStatus = PHPhotoLibrary.authorizationStatus();
  93. console.log("authStatus:" + authStatus);
  94. if (authStatus == 3) {
  95. result = true;
  96. console.log("相册权限已经开启");
  97. } else {
  98. console.log("相册权限没有开启");
  99. }
  100. plus.ios.deleteObject(PHPhotoLibrary);
  101. return result;
  102. }
  103. // 判断通讯录权限是否开启
  104. function judgeIosPermissionContact() {
  105. var result = false;
  106. var CNContactStore = plus.ios.import("CNContactStore");
  107. var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
  108. if (cnAuthStatus == 3) {
  109. result = true;
  110. console.log("通讯录权限已经开启");
  111. } else {
  112. console.log("通讯录权限没有开启");
  113. }
  114. plus.ios.deleteObject(CNContactStore);
  115. return result;
  116. }
  117. // 判断日历权限是否开启
  118. function judgeIosPermissionCalendar() {
  119. var result = false;
  120. var EKEventStore = plus.ios.import("EKEventStore");
  121. var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
  122. if (ekAuthStatus == 3) {
  123. result = true;
  124. console.log("日历权限已经开启");
  125. } else {
  126. console.log("日历权限没有开启");
  127. }
  128. plus.ios.deleteObject(EKEventStore);
  129. return result;
  130. }
  131. // 判断备忘录权限是否开启
  132. function judgeIosPermissionMemo() {
  133. var result = false;
  134. var EKEventStore = plus.ios.import("EKEventStore");
  135. var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
  136. if (ekAuthStatus == 3) {
  137. result = true;
  138. console.log("备忘录权限已经开启");
  139. } else {
  140. console.log("备忘录权限没有开启");
  141. }
  142. plus.ios.deleteObject(EKEventStore);
  143. return result;
  144. }
  145. // Android权限查询
  146. function requestAndroidPermission(permissionID) {
  147. return new Promise((resolve, reject) => {
  148. plus.android.requestPermissions(
  149. [permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装
  150. function(resultObj) {
  151. var result = 0;
  152. for (var i = 0; i < resultObj.granted.length; i++) {
  153. var grantedPermission = resultObj.granted[i];
  154. console.log('已获取的权限:' + grantedPermission);
  155. result = 1
  156. }
  157. for (var i = 0; i < resultObj.deniedPresent.length; i++) {
  158. var deniedPresentPermission = resultObj.deniedPresent[i];
  159. console.log('拒绝本次申请的权限:' + deniedPresentPermission);
  160. result = 0
  161. }
  162. for (var i = 0; i < resultObj.deniedAlways.length; i++) {
  163. var deniedAlwaysPermission = resultObj.deniedAlways[i];
  164. console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
  165. result = -1
  166. }
  167. resolve(result);
  168. // 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
  169. // if (result != 1) {
  170. // gotoAppPermissionSetting()
  171. // }
  172. },
  173. function(error) {
  174. console.log('申请权限错误:' + error.code + " = " + error.message);
  175. resolve({
  176. code: error.code,
  177. message: error.message
  178. });
  179. }
  180. );
  181. });
  182. }
  183. // 使用一个方法,根据参数判断权限
  184. function judgeIosPermission(permissionID) {
  185. if (permissionID == "location") {//定位
  186. return judgeIosPermissionLocation()
  187. } else if (permissionID == "camera") {//摄像头
  188. return judgeIosPermissionCamera()
  189. } else if (permissionID == "photoLibrary") {//相册
  190. return judgeIosPermissionPhotoLibrary()
  191. } else if (permissionID == "record") {//麦克风
  192. return judgeIosPermissionRecord()
  193. } else if (permissionID == "push") {//推送
  194. return judgeIosPermissionPush()
  195. } else if (permissionID == "contact") {//通讯录
  196. return judgeIosPermissionContact()
  197. } else if (permissionID == "calendar") {//日历
  198. return judgeIosPermissionCalendar()
  199. } else if (permissionID == "memo") {//备忘录
  200. return judgeIosPermissionMemo()
  201. }
  202. return false;
  203. }
  204. // 跳转到**应用**的权限页面
  205. function gotoAppPermissionSetting() {
  206. if (isIos) {
  207. var UIApplication = plus.ios.import("UIApplication");
  208. var application2 = UIApplication.sharedApplication();
  209. var NSURL2 = plus.ios.import("NSURL");
  210. // var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");
  211. var setting2 = NSURL2.URLWithString("app-settings:");
  212. application2.openURL(setting2);
  213. plus.ios.deleteObject(setting2);
  214. plus.ios.deleteObject(NSURL2);
  215. plus.ios.deleteObject(application2);
  216. } else {
  217. // console.log(plus.device.vendor);
  218. var Intent = plus.android.importClass("android.content.Intent");
  219. var Settings = plus.android.importClass("android.provider.Settings");
  220. var Uri = plus.android.importClass("android.net.Uri");
  221. var mainActivity = plus.android.runtimeMainActivity();
  222. var intent = new Intent();
  223. intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  224. var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
  225. intent.setData(uri);
  226. mainActivity.startActivity(intent);
  227. }
  228. }
  229. // 检查系统的设备服务是否开启
  230. // var checkSystemEnableLocation = async function () {
  231. function checkSystemEnableLocation() {
  232. if (isIos) {
  233. var result = false;
  234. var cllocationManger = plus.ios.import("CLLocationManager");
  235. var result = cllocationManger.locationServicesEnabled();
  236. console.log("系统定位开启:" + result);
  237. plus.ios.deleteObject(cllocationManger);
  238. return result;
  239. } else {
  240. var context = plus.android.importClass("android.content.Context");
  241. var locationManager = plus.android.importClass("android.location.LocationManager");
  242. var main = plus.android.runtimeMainActivity();
  243. var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
  244. var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
  245. console.log("系统定位开启:" + result);
  246. return result
  247. }
  248. }
  249. module.exports = {
  250. judgeIosPermission: judgeIosPermission,
  251. requestAndroidPermission: requestAndroidPermission,
  252. checkSystemEnableLocation: checkSystemEnableLocation,
  253. gotoAppPermissionSetting: gotoAppPermissionSetting
  254. }

#使用步骤

  1. //引入模块
  2. import permission from '@/common/js/permission.js';
  3. //ios调用
  4. permision.judgeIosPermission("location");//判断定位权限是否开启
  5. permision.judgeIosPermission("push");//判断推送权限是否开启
  6. permision.judgeIosPermission("camera");//判断摄像头权限是否开启
  7. permision.judgeIosPermission("photoLibrary");//判断相册权限是否开启
  8. permision.judgeIosPermission("record");//判断麦克风权限是否开启
  9. permision.judgeIosPermission("contact");//判断通讯录权限是否开启
  10. permision.judgeIosPermission("calendar");//判断日历权限是否开启
  11. permision.judgeIosPermission("memo");//判断备忘录权限是否开启
  12. //获取Android权限 返回值:-1:被永久拒绝授权 0:未获取授权 1:已获取授权
  13. permission.requestAndroidPermission('android.permission.RECORD_AUDIO');//麦克风权限
  14. permission.requestAndroidPermission('android.permission.ACCESS_FINE_LOCATION');//位置权限
  15. permission.requestAndroidPermission('android.permission.ACCESS_COARSE_LOCATION');//模糊位置权限(蓝牙\ble依赖)
  16. permission.requestAndroidPermission('android.permission.CAMERA');//摄像头权限
  17. permission.requestAndroidPermission('android.permission.READ_EXTERNAL_STORAGE');//外部存储(含相册)读取权限
  18. permission.requestAndroidPermission('android.permission.WRITE_EXTERNAL_STORAGE');//外部存储(含相册)写入权限
  19. permission.requestAndroidPermission('android.permission.READ_CONTACTS ');//通讯录读取权限
  20. permission.requestAndroidPermission('android.permission.WRITE_CONTACTS');//通讯录写入权限
  21. permission.requestAndroidPermission('android.permission.READ_CALENDAR');//日历读取权限
  22. permission.requestAndroidPermission('android.permission.WRITE_CALENDAR');//日历写入权限
  23. permission.requestAndroidPermission('android.permission.READ_SMS');//短信读取权限
  24. permission.requestAndroidPermission('android.permission.SEND_SMS');//短信发送权限
  25. permission.requestAndroidPermission('android.permission.RECEIVE_SMS');//接收新短信权限
  26. permission.requestAndroidPermission('android.permission.READ_PHONE_STATE');//获取手机识别码等信息的权限
  27. permission.requestAndroidPermission('android.permission.CALL_PHONE');//拨打电话权限
  28. permission.requestAndroidPermission('android.permission.READ_CALL_LOG ');//获取通话记录权限
  29. //跳转app应用权限页面
  30. permision.gotoAppPermissionSetting();

#示例

  1. async requestAndroidPermission(permisionID) {
  2. var result = await permision.requestAndroidPermission(permisionID)
  3. var strStatus
  4. if (result == 1) {
  5. strStatus = "已获得授权"
  6. } else if (result == 0) {
  7. strStatus = "未获得授权"
  8. } else {
  9. strStatus = "被永久拒绝权限"
  10. }
  11. uni.showModal({
  12. content: permisionID + strStatus,
  13. showCancel: false
  14. });
  15. }
  1. /* android通知权限查询 */
  2. const main = plus.android.runtimeMainActivity();
  3. const NotificationManagerCompat = plus.android.importClass("android.support.v4.app.NotificationManagerCompat");
  4. const areNotificationsEnabled = NotificationManagerCompat.from(main).areNotificationsEnabled();

#自定义添加Android权限

打开项目的manifest.json文件,点击App模块权限配置,勾选即可

5A817C3B-D301-41C3-8DA4-5300C6B54383.png

如果没有列出需要的权限,也可以自定义添加,打开manifest.json,点击源码视图

  1. "app-plus": {
  2. "distribute": {
  3. "android": {
  4. "permissions": [ //这里添加需要的Android权限
  5. "<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>"
  6. ]
  7. },
  8. },

#模块及第三方SDK默认添加权限列表

Bluetooth(低功耗蓝牙)

  1. "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />",
  2. "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />",
  3. "<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" />",
  4. "<uses-permission android:name=\"android.permission.BLUETOOTH\" />"

Contact(通讯录)

  1. "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
  2. "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
  3. "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>"

Fingerprint(指纹识别)

  1. "<uses-permission android:name=\"android.permission.USE_FINGERPRINT\"/>"

iBeacon

  1. "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />",
  2. "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />",
  3. "<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" />",
  4. "<uses-permission android:name=\"android.permission.BLUETOOTH\" />"

Maps(高德地图)

  1. "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />",
  2. "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />",
  3. "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
  4. "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
  5. "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\" />",
  6. "<uses-permission android:name=\"android.permission.INTERNET\" />",
  7. "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
  8. "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />",
  9. "<uses-permission android:name=\"android.permission.ACCESS_LOCATION_EXTRA_COMMANDS\" />",
  10. "<uses-permission android:name=\"android.permission.BLUETOOTH\" />",
  11. "<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" />"

Maps(百度地图)

  1. "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />",
  2. "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />",
  3. "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
  4. "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
  5. "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\" />",
  6. "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
  7. "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />",
  8. "<uses-permission android:name=\"android.permission.INTERNET\"/>",
  9. "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\" />",
  10. "<uses-permission android:name=\"android.permission.READ_LOGS\" />",
  11. "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"

Messaging(短彩邮件消息)

  1. "<uses-permission android:name=\"android.permission.RECEIVE_SMS\"/>",
  2. "<uses-permission android:name=\"android.permission.SEND_SMS\"/>",
  3. "<uses-permission android:name=\"android.permission.WRITE_SMS\"/>",
  4. "<uses-permission android:name=\"android.permission.READ_SMS\"/>"

Messaging(短彩邮件消息)

  1. "<uses-permission android:name=\"android.permission.RECEIVE_SMS\"/>",
  2. "<uses-permission android:name=\"android.permission.SEND_SMS\"/>",
  3. "<uses-permission android:name=\"android.permission.WRITE_SMS\"/>",
  4. "<uses-permission android:name=\"android.permission.READ_SMS\"/>"

微信登录

  1. "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>"

QQ登录

  1. "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>"

微信支付

  1. "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>"

Push(消息推送)

  1. "<uses-permission android:name=\"android.permission.INTERNET\" />",
  2. "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
  3. "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
  4. "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\" />",
  5. "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
  6. "<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\" />",
  7. "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />",
  8. "<uses-permission android:name=\"android.permission.VIBRATE\" />",
  9. "<uses-permission android:name=\"android.permission.GET_TASKS\" />",
  10. "<uses-permission android:name=\"android.permission.BLUETOOTH\" />",
  11. "<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" />",
  12. "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />",
  13. "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />",
  14. "<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\" />"

微信分享

  1. "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>"

QQ分享

  1. "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>"

新浪微博分享

  1. "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\" />",
  2. "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
  3. "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
  4. "<uses-permission android:name=\"android.permission.INTERNET\" />",
  5. "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />"

百度语音识别

  1. "<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />",
  2. "<uses-permission android:name=\"android.permission.INTERNET\" />",
  3. "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
  4. "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
  5. "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\" />",
  6. "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
  7. "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />"

讯飞语音识别

  1. "<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />",
  2. "<uses-permission android:name=\"android.permission.INTERNET\" />",
  3. "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
  4. "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />",
  5. "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\" />",
  6. "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />",
  7. "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />"

友盟统计

  1. "<uses-permission android:name=\"android.permission.READ_LOGS\" />",
  2. "<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\" />",
  3. "<uses-permission android:name=\"android.permission.RECEIVE_USER_PRESENT\" />"

#参考

https://ext.dcloud.net.cn/plugin?id=594