ReactNativePermissionsModule.java 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. PHOTO;
  29. }
  30. public ReactNativePermissionsModule(ReactApplicationContext reactContext) {
  31. super(reactContext);
  32. this.reactContext = reactContext;
  33. mPermissionsModule = new PermissionsModule(this.reactContext);
  34. }
  35. @Override
  36. public String getName() {
  37. return "ReactNativePermissions";
  38. }
  39. @ReactMethod
  40. public void getPermissionStatus(String permissionString, Promise promise) {
  41. String permission = permissionForString(permissionString);
  42. // check if permission is valid
  43. if (permission == null) {
  44. promise.reject("unknown-permission", "ReactNativePermissions: unknown permission type - " + permissionString);
  45. return;
  46. }
  47. int result = PermissionChecker.checkSelfPermission(this.reactContext, permission);
  48. switch (result) {
  49. case PermissionChecker.PERMISSION_DENIED:
  50. // PermissionDenied could also mean that we've never asked for permission yet.
  51. // Use shouldShowRequestPermissionRationale to determined which on it is.
  52. if (getCurrentActivity() != null) {
  53. boolean deniedOnce = ActivityCompat.shouldShowRequestPermissionRationale(getCurrentActivity(), permission);
  54. promise.resolve(deniedOnce ? "denied" : "undetermined");
  55. } else {
  56. promise.resolve("denied");
  57. }
  58. break;
  59. case PermissionChecker.PERMISSION_DENIED_APP_OP:
  60. promise.resolve("denied");
  61. break;
  62. case PermissionChecker.PERMISSION_GRANTED:
  63. promise.resolve("authorized");
  64. break;
  65. default:
  66. promise.resolve("undetermined");
  67. break;
  68. }
  69. }
  70. @ReactMethod
  71. public void requestPermission(final String permissionString, String nullForiOSCompat, final Promise promise) {
  72. String permission = permissionForString(permissionString);
  73. Callback resolve = new Callback() {
  74. @Override
  75. public void invoke(Object... args) {
  76. getPermissionStatus(permissionString, promise);
  77. }
  78. };
  79. Callback reject = new Callback() {
  80. @Override
  81. public void invoke(Object... args) {
  82. // NOOP
  83. }
  84. };
  85. mPermissionsModule.requestPermission(permission, new PromiseImpl(resolve, reject));
  86. }
  87. @ReactMethod
  88. public void canOpenSettings(Promise promise) {
  89. promise.resolve(true);
  90. }
  91. @ReactMethod
  92. public void openSettings() {
  93. final Intent i = new Intent();
  94. i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  95. i.addCategory(Intent.CATEGORY_DEFAULT);
  96. i.setData(Uri.parse("package:" + this.reactContext.getPackageName()));
  97. i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  98. i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
  99. i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
  100. this.reactContext.startActivity(i);
  101. }
  102. private String permissionForString(String permission) {
  103. switch (RNType.valueOf(permission.toUpperCase(Locale.ENGLISH))) {
  104. case LOCATION:
  105. return Manifest.permission.ACCESS_FINE_LOCATION;
  106. case CAMERA:
  107. return Manifest.permission.CAMERA;
  108. case MICROPHONE:
  109. return Manifest.permission.RECORD_AUDIO;
  110. case CONTACTS:
  111. return Manifest.permission.READ_CONTACTS;
  112. case EVENT:
  113. return Manifest.permission.READ_CALENDAR;
  114. case PHOTO:
  115. return Manifest.permission.READ_EXTERNAL_STORAGE;
  116. default:
  117. return null;
  118. }
  119. }
  120. }