permission.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  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.split(","),
  150. // [permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装
  151. function(resultObj) {
  152. var result = 0;
  153. for (var i = 0; i < resultObj.granted.length; i++) {
  154. var grantedPermission = resultObj.granted[i];
  155. console.log('已获取的权限:' + grantedPermission);
  156. result = 1
  157. }
  158. for (var i = 0; i < resultObj.deniedPresent.length; i++) {
  159. var deniedPresentPermission = resultObj.deniedPresent[i];
  160. console.log('拒绝本次申请的权限:' + deniedPresentPermission);
  161. result = 0
  162. }
  163. for (var i = 0; i < resultObj.deniedAlways.length; i++) {
  164. var deniedAlwaysPermission = resultObj.deniedAlways[i];
  165. console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
  166. result = -1
  167. }
  168. resolve(result);
  169. // 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
  170. // if (result != 1) {
  171. // gotoAppPermissionSetting()
  172. // }
  173. },
  174. function(error) {
  175. console.log('申请权限错误:' + error.code + " = " + error.message);
  176. resolve({
  177. code: error.code,
  178. message: error.message
  179. });
  180. }
  181. );
  182. });
  183. }
  184. // 使用一个方法,根据参数判断权限
  185. function judgeIosPermission(permissionID) {
  186. if (permissionID == "location") {
  187. return judgeIosPermissionLocation()
  188. } else if (permissionID == "camera") {
  189. return judgeIosPermissionCamera()
  190. } else if (permissionID == "photoLibrary") {
  191. return judgeIosPermissionPhotoLibrary()
  192. } else if (permissionID == "record") {
  193. return judgeIosPermissionRecord()
  194. } else if (permissionID == "push") {
  195. return judgeIosPermissionPush()
  196. } else if (permissionID == "contact") {
  197. return judgeIosPermissionContact()
  198. } else if (permissionID == "calendar") {
  199. return judgeIosPermissionCalendar()
  200. } else if (permissionID == "memo") {
  201. return judgeIosPermissionMemo()
  202. }
  203. return false;
  204. }
  205. // 跳转到**应用**的权限页面
  206. function gotoAppPermissionSetting(type) {
  207. if (isIos) {
  208. var UIApplication = plus.ios.import("UIApplication");
  209. var application2 = UIApplication.sharedApplication();
  210. var NSURL2 = plus.ios.import("NSURL");
  211. // var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");
  212. var setting2 = NSURL2.URLWithString("app-settings:");
  213. application2.openURL(setting2);
  214. plus.ios.deleteObject(setting2);
  215. plus.ios.deleteObject(NSURL2);
  216. plus.ios.deleteObject(application2);
  217. } else {
  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. var settings=Settings.ACTION_APPLICATION_DETAILS_SETTINGS;
  224. if(type=="push"){
  225. settings=Settings.ACTION_APP_NOTIFICATION_SETTINGS;//推送通知
  226. }else{
  227. var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
  228. intent.setData(uri);
  229. }
  230. intent.setAction(settings);
  231. mainActivity.startActivity(intent);
  232. }
  233. }
  234. // 检查系统的设备服务是否开启
  235. // var checkSystemEnableLocation = async function () {
  236. function checkSystemEnableLocation() {
  237. if (isIos) {
  238. var result = false;
  239. var cllocationManger = plus.ios.import("CLLocationManager");
  240. var result = cllocationManger.locationServicesEnabled();
  241. console.log("系统定位开启:" + result);
  242. plus.ios.deleteObject(cllocationManger);
  243. return result;
  244. } else {
  245. var context = plus.android.importClass("android.content.Context");
  246. var locationManager = plus.android.importClass("android.location.LocationManager");
  247. var main = plus.android.runtimeMainActivity();
  248. var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
  249. var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
  250. console.log("系统定位开启:" + result);
  251. return result
  252. }
  253. }
  254. let permissionMap = {
  255. "android": {
  256. "CAMERA_EXTERNAL_STORAGE": {
  257. "name": "android.permission.READ_EXTERNAL_STORAGE,android.permission.WRITE_EXTERNAL_STORAGE,android.permission.CAMERA",
  258. "title": "相机/相册权限说明",
  259. "content": "便于您使用该功能上传您的照片/图片/视频及用于更换头像、发布产品/需求、下载、问诊等场景中读取和写入相册和文件内容"
  260. },
  261. "CAMERA": {
  262. "name": "android.permission.CAMERA",
  263. "title": "相机权限说明",
  264. "content": "便于您使用该功能上传图片,用于问诊等场景中发送拍摄图片"
  265. },
  266. "EXTERNAL_STORAGE": {
  267. "name": "android.permission.READ_EXTERNAL_STORAGE,android.permission.WRITE_EXTERNAL_STORAGE",
  268. "title": "相册权限说明",
  269. "content": "便于您使用该功能上传您的照片/图片/视频及用于更换头像、发布产品/需求、下载、问诊等场景中读取和写入相册和文件内容"
  270. },
  271. "PUSH": {
  272. "name": "android.permission.INTERNET",
  273. "title": "推送权限说明",
  274. "content": "便于您使用该功能接收问诊、用药、订单等各种系统消息"
  275. },
  276. "CALL_PHONE": {
  277. "name": "android.permission.CALL_PHONE",
  278. "title": "拨打电话权限说明",
  279. "content": "便于您使用该功能拨打电话"
  280. },
  281. },
  282. "ios": {}
  283. }
  284. let view = null;
  285. function showViewDesc(permission) {
  286. let plat = isIos ? "ios" : "android";
  287. view = new plus.nativeObj.View('per-modal', {
  288. top: '0px',
  289. left: '0px',
  290. width: '100%',
  291. backgroundColor: 'rgba(0,0,0,0.2)',
  292. //opacity: '.9'
  293. })
  294. view.drawRect({
  295. color: '#fff',
  296. radius: '5px'
  297. }, {
  298. top: '30px',
  299. left: '5%',
  300. width: '90%',
  301. height: "100px",
  302. })
  303. view.drawText(permissionMap[plat][permission]["title"], {
  304. top: '40px',
  305. left: "8%",
  306. height: "30px"
  307. }, {
  308. align: "left",
  309. color: "#000",
  310. }, {
  311. onClick: function(e) {
  312. console.log(e);
  313. }
  314. })
  315. view.drawText(permissionMap[plat][permission]["content"], {
  316. top: '65px',
  317. height: "60px",
  318. left: "8%",
  319. width: "84%"
  320. }, {
  321. whiteSpace: 'normal',
  322. size: "14px",
  323. align: "left",
  324. color: "#656563"
  325. })
  326. view.show();
  327. }
  328. export function premissionCheck(permission) {
  329. return new Promise((resolve, reject) => {
  330. let plat = isIos ? "ios" : "android";
  331. if (isIos) { // ios
  332. // const camera = permission.judgeIosPermission("camera");//判断ios是否给予摄像头权限
  333. // //ios相册没权限,系统会自动弹出授权框
  334. // //let photoLibrary = permission.judgeIosPermission("photoLibrary");//判断ios是否给予相册权限
  335. // if(camera){
  336. // resolve();
  337. // }else{
  338. // reject('需要开启相机使用权限');
  339. // }
  340. resolve(1)
  341. } else { // android
  342. let permission_arr = permissionMap[plat][permission]["name"].split(",");
  343. let flag = true;
  344. for(let i = 0;i<permission_arr.length;i++) {
  345. let status = plus.navigator.checkPermission(permission_arr[i]);
  346. if(status == "undetermined") {
  347. flag = false;
  348. }
  349. }
  350. console.log("qxj flag", flag)
  351. if (flag == false) { // 未完全授权
  352. showViewDesc(permission);
  353. requestAndroidPermission(permissionMap[plat][permission]["name"]).then((res) => {
  354. view.close();
  355. if (res == -1) {
  356. uni.showModal({
  357. title: '提示',
  358. content: '操作权限已被拒绝,请手动前往设置',
  359. confirmText: "立即设置",
  360. success: (res) => {
  361. if (res.confirm) {
  362. gotoAppPermissionSetting(permission)
  363. }
  364. }
  365. })
  366. }
  367. resolve(res)
  368. })
  369. } else {
  370. resolve(1)
  371. }
  372. }
  373. })
  374. }
  375. // module.exports = {
  376. // judgeIosPermission: judgeIosPermission,
  377. // requestAndroidPermission: requestAndroidPermission,
  378. // checkSystemEnableLocation: checkSystemEnableLocation,
  379. // gotoAppPermissionSetting: gotoAppPermissionSetting
  380. // }