index.android.js 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. 'use strict';
  2. const ReactNative = require('react-native')
  3. const RNPermissions = ReactNative.PermissionsAndroid;
  4. const AsyncStorage = ReactNative.AsyncStorage
  5. const RNPTypes = {
  6. location: RNPermissions.PERMISSIONS.ACCESS_FINE_LOCATION,
  7. camera: RNPermissions.PERMISSIONS.CAMERA,
  8. microphone: RNPermissions.PERMISSIONS.RECORD_AUDIO,
  9. contacts: RNPermissions.PERMISSIONS.READ_CONTACTS,
  10. event: RNPermissions.PERMISSIONS.READ_CALENDAR,
  11. storage: RNPermissions.PERMISSIONS.READ_EXTERNAL_STORAGE,
  12. photo: RNPermissions.PERMISSIONS.READ_EXTERNAL_STORAGE,
  13. readSms: RNPermissions.PERMISSIONS.READ_SMS,
  14. receiveSms: RNPermissions.PERMISSIONS.RECEIVE_SMS,
  15. }
  16. const RESULTS = {
  17. [ RNPermissions.RESULTS.GRANTED ]: 'authorized',
  18. [ RNPermissions.RESULTS.DENIED ]: 'denied',
  19. [ RNPermissions.RESULTS.NEVER_ASK_AGAIN ]: 'restricted',
  20. }
  21. const STORAGE_KEY = '@RNPermissions:didAskPermission:'
  22. const setDidAskOnce = p => AsyncStorage.setItem(STORAGE_KEY + p, 'true')
  23. const getDidAskOnce = p => AsyncStorage.getItem(STORAGE_KEY + p).then(res => !!res)
  24. class ReactNativePermissions {
  25. canOpenSettings() {
  26. return false
  27. }
  28. openSettings() {
  29. return Promise.reject('\'openSettings\' is Depricated on android')
  30. }
  31. getTypes() {
  32. return Object.keys(RNPTypes);
  33. }
  34. check(permission) {
  35. const androidPermission = RNPTypes[permission]
  36. if (!androidPermission) return Promise.reject(`ReactNativePermissions: ${permission} is not a valid permission type on Android`);
  37. const shouldShowRationale = ReactNative.NativeModules.PermissionsAndroid.shouldShowRequestPermissionRationale;
  38. return RNPermissions.check(androidPermission)
  39. .then(isAuthorized => {
  40. if (isAuthorized) return 'authorized'
  41. return getDidAskOnce(permission)
  42. .then(didAsk => {
  43. if (didAsk) {
  44. return shouldShowRationale(androidPermission)
  45. .then(shouldShow => shouldShow ? 'denied' : 'restricted')
  46. }
  47. return 'undetermined'
  48. })
  49. })
  50. }
  51. request(permission) {
  52. const androidPermission = RNPTypes[permission]
  53. if (!androidPermission) return Promise.reject(`ReactNativePermissions: ${permission} is not a valid permission type on Android`);
  54. return RNPermissions.request(androidPermission)
  55. .then(res => {
  56. return setDidAskOnce(permission)
  57. .then(() => RESULTS[res])
  58. });
  59. }
  60. checkMultiple(permissions) {
  61. return Promise.all(permissions.map(this.check.bind(this)))
  62. .then(res => res.reduce((pre, cur, i) => {
  63. var name = permissions[i]
  64. pre[name] = cur
  65. return pre
  66. }, {}))
  67. }
  68. }
  69. module.exports = new ReactNativePermissions()