Permissions.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package com.wdkl.permission;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.app.Fragment;
  5. import android.app.FragmentManager;
  6. import android.content.Context;
  7. import android.content.pm.PackageManager;
  8. import android.os.Build;
  9. import android.os.Bundle;
  10. import android.os.Process;
  11. import androidx.annotation.NonNull;
  12. import androidx.annotation.Nullable;
  13. import androidx.annotation.RequiresApi;
  14. import androidx.core.content.ContextCompat;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. import static android.content.pm.PackageManager.PERMISSION_GRANTED;
  18. import static android.os.Build.VERSION_CODES.M;
  19. /**
  20. * Permission-related helpers
  21. */
  22. public class Permissions {
  23. /**
  24. * @param callback will be called if request is not canceled, with either
  25. * {@link PackageManager#PERMISSION_GRANTED} or {@link PackageManager#PERMISSION_DENIED}
  26. */
  27. public static void request(Activity activity, String permission, Consumer<Integer> callback) {
  28. if (Build.VERSION.SDK_INT >= M) {
  29. request2(activity, permission, callback);
  30. } else {
  31. if (has(activity, permission)) {
  32. callback.accept(0);
  33. } else {
  34. callback.accept(-1);
  35. }
  36. }
  37. }
  38. /**
  39. * @param callback will be called if request is not canceled, with either
  40. * {@link PackageManager#PERMISSION_GRANTED} or {@link PackageManager#PERMISSION_DENIED}
  41. */
  42. public static void request(Activity activity, String[] permissions, Consumer<Integer> callback) {
  43. if (Build.VERSION.SDK_INT >= M) {
  44. request2(activity, permissions, callback);
  45. } else {
  46. if (has(activity, permissions)) {
  47. callback.accept(0);
  48. } else {
  49. callback.accept(-1);
  50. }
  51. }
  52. }
  53. @RequiresApi(M)
  54. public static void request2(Activity activity, String permission, Consumer<Integer> callback) {
  55. final FragmentManager fm = activity.getFragmentManager();
  56. if (!has(activity, permission)) {
  57. fm.beginTransaction().add(new PermissionRequestFragment(new String[]{permission}, callback), null).commitAllowingStateLoss();
  58. } else {
  59. callback.accept(PERMISSION_GRANTED);
  60. }
  61. }
  62. @RequiresApi(M)
  63. public static void request2(Activity activity, String[] permissions, Consumer<Integer> callback) {
  64. final FragmentManager fm = activity.getFragmentManager();
  65. if (!has(activity, permissions)) {
  66. fm.beginTransaction().add(new PermissionRequestFragment(permissions, callback), null).commitAllowingStateLoss();
  67. } else {
  68. callback.accept(PERMISSION_GRANTED);
  69. }
  70. }
  71. public static boolean has(Context activity, String... permissions) {
  72. List<String> mPermissionListDenied = new ArrayList<>();
  73. for (String permission : permissions) {
  74. int result = checkPermission(activity, permission);
  75. if (result != PERMISSION_GRANTED) {
  76. mPermissionListDenied.add(permission);
  77. }
  78. }
  79. return mPermissionListDenied.size() == 0;
  80. }
  81. private static boolean has(Context context, String permission) {
  82. return context.checkPermission(permission, Process.myPid(), Process.myUid()) == PERMISSION_GRANTED;
  83. }
  84. private static int checkPermission(Context activity, String permission) {
  85. return ContextCompat.checkSelfPermission(activity, permission);
  86. }
  87. @RequiresApi(M)
  88. public static class PermissionRequestFragment extends Fragment {
  89. @SuppressLint("ValidFragment")
  90. public PermissionRequestFragment(@NonNull final String[] permissions, @NonNull final Consumer<Integer> callback) {
  91. mPermissions = permissions;
  92. mCallback = callback;
  93. }
  94. @Override
  95. public void onCreate(@Nullable final Bundle savedInstanceState) {
  96. super.onCreate(savedInstanceState);
  97. if (mPermissions != null) requestPermissions(mPermissions, 0);
  98. }
  99. @Override
  100. public void onRequestPermissionsResult(final int request, @NonNull final String[] permissions, @NonNull final int[] results) {
  101. getFragmentManager().beginTransaction().remove(this).commit();
  102. if (mCallback == null || results.length == 0/* canceled */) return;
  103. boolean isGrant = true;
  104. for (int result : results) {
  105. if (result != PackageManager.PERMISSION_GRANTED) {
  106. isGrant = false;
  107. break;
  108. }
  109. }
  110. mCallback.accept(isGrant ? PackageManager.PERMISSION_GRANTED : PackageManager.PERMISSION_DENIED);
  111. }
  112. public PermissionRequestFragment() {
  113. mPermissions = null;
  114. mCallback = null;
  115. }
  116. private final @Nullable
  117. String[] mPermissions;
  118. private final @Nullable
  119. Consumer<Integer> mCallback;
  120. }
  121. }