ReactNativePermissionsModule.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package com.joshblour.reactnativepermissions;
  2. import android.Manifest;
  3. import android.content.Intent;
  4. import android.net.Uri;
  5. import android.provider.Settings;
  6. import android.support.v4.app.ActivityCompat;
  7. import android.support.v4.content.ContextCompat;
  8. import android.support.v4.content.PermissionChecker;
  9. import com.facebook.react.bridge.Callback;
  10. import com.facebook.react.bridge.Promise;
  11. import com.facebook.react.bridge.PromiseImpl;
  12. import com.facebook.react.bridge.ReactApplicationContext;
  13. import com.facebook.react.bridge.ReactContextBaseJavaModule;
  14. import com.facebook.react.bridge.ReactMethod;
  15. import com.facebook.react.bridge.ReadableMap;
  16. import com.facebook.react.bridge.ReadableArray;
  17. import com.facebook.react.modules.permissions.PermissionsModule;
  18. import java.util.Locale;
  19. public class ReactNativePermissionsModule extends ReactContextBaseJavaModule {
  20. private final ReactApplicationContext reactContext;
  21. private final PermissionsModule mPermissionsModule;
  22. public enum RNType {
  23. LOCATION,
  24. CAMERA,
  25. MICROPHONE,
  26. CONTACTS,
  27. EVENT,
  28. STORAGE,
  29. PHOTO;
  30. }
  31. public ReactNativePermissionsModule(ReactApplicationContext reactContext) {
  32. super(reactContext);
  33. this.reactContext = reactContext;
  34. mPermissionsModule = new PermissionsModule(this.reactContext);
  35. }
  36. @Override
  37. public String getName() {
  38. return "ReactNativePermissions";
  39. }
  40. @ReactMethod
  41. public void getPermissionStatus(String permissionString, String nullForiOSCompat, Promise promise) {
  42. String permission = permissionForString(permissionString);
  43. // check if permission is valid
  44. if (permission == null) {
  45. promise.reject("unknown-permission", "ReactNativePermissions: unknown permission type - " + permissionString);
  46. return;
  47. }
  48. int result = PermissionChecker.checkSelfPermission(this.reactContext, permission);
  49. switch (result) {
  50. case PermissionChecker.PERMISSION_DENIED:
  51. // PermissionDenied could also mean that we've never asked for permission yet.
  52. // Use shouldShowRequestPermissionRationale to determined which on it is.
  53. if (getCurrentActivity() != null) {
  54. boolean deniedOnce = ActivityCompat.shouldShowRequestPermissionRationale(getCurrentActivity(), permission);
  55. promise.resolve(deniedOnce ? "denied" : "undetermined");
  56. } else {
  57. promise.resolve("denied");
  58. }
  59. break;
  60. case PermissionChecker.PERMISSION_DENIED_APP_OP:
  61. promise.resolve("denied");
  62. break;
  63. case PermissionChecker.PERMISSION_GRANTED:
  64. promise.resolve("authorized");
  65. break;
  66. default:
  67. promise.resolve("undetermined");
  68. break;
  69. }
  70. }
  71. @ReactMethod
  72. public void requestPermission(final String permissionString, String nullForiOSCompat, final Promise promise) {
  73. String permission = permissionForString(permissionString);
  74. Callback resolve = new Callback() {
  75. @Override
  76. public void invoke(Object... args) {
  77. getPermissionStatus(permissionString, "", promise);
  78. }
  79. };
  80. Callback reject = new Callback() {
  81. @Override
  82. public void invoke(Object... args) {
  83. // NOOP
  84. }
  85. };
  86. mPermissionsModule.requestPermission(permission, new PromiseImpl(resolve, reject));
  87. }
  88. @ReactMethod
  89. public void canOpenSettings(Promise promise) {
  90. promise.resolve(true);
  91. }
  92. @ReactMethod
  93. public void openSettings() {
  94. final Intent i = new Intent();
  95. i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  96. i.addCategory(Intent.CATEGORY_DEFAULT);
  97. i.setData(Uri.parse("package:" + this.reactContext.getPackageName()));
  98. i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  99. i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
  100. i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
  101. this.reactContext.startActivity(i);
  102. }
  103. private String permissionForString(String permission) {
  104. switch (RNType.valueOf(permission.toUpperCase(Locale.ENGLISH))) {
  105. case LOCATION:
  106. return Manifest.permission.ACCESS_FINE_LOCATION;
  107. case CAMERA:
  108. return Manifest.permission.CAMERA;
  109. case MICROPHONE:
  110. return Manifest.permission.RECORD_AUDIO;
  111. case CONTACTS:
  112. return Manifest.permission.READ_CONTACTS;
  113. case EVENT:
  114. return Manifest.permission.READ_CALENDAR;
  115. case STORAGE:
  116. case PHOTO:
  117. return Manifest.permission.READ_EXTERNAL_STORAGE;
  118. default:
  119. return null;
  120. }
  121. }
  122. }