ReactNativePermissionsModule.java 4.1KB

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