EasyPermission.java 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package com.yyrh.easypermission;
  2. import android.annotation.TargetApi;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.content.pm.PackageManager;
  6. import android.os.Build;
  7. import android.os.Process;
  8. import android.text.TextUtils;
  9. import android.util.Log;
  10. import java.util.ArrayList;
  11. import java.util.Arrays;
  12. import java.util.HashMap;
  13. import java.util.LinkedList;
  14. import java.util.List;
  15. /**
  16. * @className: EasyPermission
  17. * @classDescription:便捷易用的Android 6.0 动态权限适配库,使用方便,无其他引用依赖,copy 即用
  18. * @author: Pan_
  19. * @createTime: 2018/10/24
  20. */
  21. public class EasyPermission implements NextAction {
  22. public static final String TAG = "EasyPermission";
  23. private Activity mActivity;
  24. private LinkedList<String> mPermissionList = new LinkedList<>();
  25. private PermissionRequestListener mPermissionRequestListener;
  26. private String mCurPermission;
  27. private HashMap<String, RequestPermissionRationalListener> mRequestPermissionRationalListenerMap = new HashMap<>();
  28. private HashMap<String, GrantResult> mPermissionGrantMap = new HashMap<>();
  29. public EasyPermission(Activity activity) {
  30. mActivity = activity;
  31. }
  32. /**
  33. * 创建一个EasyPermission实例,一切从这里开始
  34. *
  35. * @param activity
  36. * @return
  37. */
  38. public static EasyPermission with(Activity activity) {
  39. return new EasyPermission(activity);
  40. }
  41. /**
  42. * 添加一个需要获取的权限
  43. *
  44. * @param permission
  45. * @return
  46. */
  47. public EasyPermission addPermission(String permission) {
  48. if (TextUtils.isEmpty(permission)) {
  49. return this;
  50. }
  51. mPermissionList.add(permission);
  52. return this;
  53. }
  54. /**
  55. * 添加一组需要获取的权限
  56. *
  57. * @param permission
  58. * @return
  59. */
  60. public EasyPermission addPermissions(String... permission) {
  61. if (permission == null || permission.length <= 0) {
  62. return this;
  63. }
  64. mPermissionList.addAll(Arrays.asList(permission));
  65. return this;
  66. }
  67. /**
  68. * 添加一组需要获取的权限
  69. *
  70. * @param permission
  71. * @return
  72. */
  73. public EasyPermission addPermissions(String[]... permission) {
  74. if (permission == null || permission.length <= 0) {
  75. return this;
  76. }
  77. for (String[] group : permission) {
  78. mPermissionList.addAll(Arrays.asList(group));
  79. }
  80. return this;
  81. }
  82. /**
  83. * 添加一组需要获取的权限
  84. *
  85. * @param permission
  86. * @return
  87. */
  88. public EasyPermission addPermissions(List<String> permission) {
  89. if (permission == null || permission.isEmpty()) {
  90. return this;
  91. }
  92. mPermissionList.addAll(permission);
  93. return this;
  94. }
  95. /**
  96. * 添加一个权限的Rational的处理
  97. *
  98. * @param permission
  99. * @param listener
  100. * @return
  101. */
  102. public EasyPermission addRequestPermissionRationaleHandler(String permission, RequestPermissionRationalListener listener) {
  103. if (TextUtils.isEmpty(permission) || listener == null) {
  104. return this;
  105. }
  106. mRequestPermissionRationalListenerMap.put(permission, listener);
  107. return this;
  108. }
  109. /**
  110. * 判断是否已经该权限
  111. *
  112. * @param context 上下文
  113. * @param permissions 权限数组
  114. * @return
  115. */
  116. public static boolean isPermissionGrant(Context context, String... permissions) {
  117. for (String permission : permissions) {
  118. if (context.checkPermission(permission, Process.myPid(), Process.myUid()) != PackageManager.PERMISSION_GRANTED) {
  119. return false;
  120. }
  121. }
  122. return true;
  123. }
  124. /**
  125. * 打开权限设置页面
  126. *
  127. * @param context 上下文
  128. */
  129. public static void openSettingPage(Context context) {
  130. PermissionSettingPage.start(context, false);
  131. }
  132. /**
  133. * 打开权限设置页面
  134. *
  135. * @param context 上下文
  136. * @param newTask 是否开启新的堆栈打开
  137. */
  138. public static void openSettingPage(Context context, boolean newTask) {
  139. PermissionSettingPage.start(context, newTask);
  140. }
  141. /**
  142. * 开始申请权限
  143. *
  144. * @param listener
  145. */
  146. public void request(PermissionRequestListener listener) {
  147. if (listener == null) {
  148. return;
  149. }
  150. if (mPermissionList.isEmpty()) {
  151. throw new RuntimeException("must add some permission to request!!");
  152. }
  153. if (Build.VERSION.SDK_INT < 23) {
  154. Log.i(TAG, "targetSdk < 23 ,no need to request permission dynamic");
  155. HashMap<String, GrantResult> grantMap = new HashMap<>();
  156. for (String permission : mPermissionList) {
  157. grantMap.put(permission, GrantResult.GRANT);
  158. }
  159. listener.onGrant(grantMap);
  160. return;
  161. }
  162. PermissionUtils.checkPermissions(mActivity, mPermissionList);
  163. mPermissionRequestListener = listener;
  164. pollPermission();
  165. }
  166. @TargetApi(23)
  167. private void pollPermission() {
  168. if (mPermissionList.isEmpty()) {
  169. Log.i(TAG, "permission检查完成,开始申请权限");
  170. PermissionRequestFragment.build(mPermissionGrantMap, mPermissionRequestListener).go(mActivity);
  171. return;
  172. }
  173. String permission = mPermissionList.pollFirst();
  174. if (Permission.REQUEST_INSTALL_PACKAGES.equals(permission)) {
  175. if(PermissionUtils.isHasInstallPermission(mActivity)){
  176. mPermissionGrantMap.put(permission, GrantResult.GRANT);
  177. pollPermission();
  178. }else{
  179. mPermissionGrantMap.put(permission, GrantResult.DENIED);
  180. pollPermission();
  181. }
  182. } else if (Permission.SYSTEM_ALERT_WINDOW.equals(permission)) {
  183. if(PermissionUtils.isHasOverlaysPermission(mActivity)){
  184. mPermissionGrantMap.put(permission, GrantResult.GRANT);
  185. pollPermission();
  186. }else{
  187. mPermissionGrantMap.put(permission, GrantResult.DENIED);
  188. pollPermission();
  189. }
  190. } else if (mActivity.checkPermission(permission, Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_GRANTED) {
  191. mPermissionGrantMap.put(permission, GrantResult.GRANT);
  192. pollPermission();
  193. } else {
  194. mPermissionGrantMap.put(permission, GrantResult.DENIED);
  195. if (mRequestPermissionRationalListenerMap.get(permission) != null) {
  196. mCurPermission = permission;
  197. mRequestPermissionRationalListenerMap.get(permission).onRequestPermissionRational(permission, mActivity.shouldShowRequestPermissionRationale(permission), this);
  198. } else {
  199. pollPermission();
  200. }
  201. }
  202. }
  203. @Override
  204. public void next(NextActionType next) {
  205. if (next == null) {
  206. mPermissionGrantMap.put(mCurPermission, GrantResult.IGNORE);
  207. pollPermission();
  208. return;
  209. }
  210. switch (next) {
  211. case NEXT:
  212. pollPermission();
  213. break;
  214. case IGNORE:
  215. mPermissionGrantMap.put(mCurPermission, GrantResult.IGNORE);
  216. pollPermission();
  217. break;
  218. case STOP:
  219. mPermissionRequestListener.onCancel(mCurPermission);
  220. break;
  221. }
  222. }
  223. }