工具类实现

public class EasyPermission {    public static final int SETTINGS_REQ_CODE = 16061;    public interface PermissionCallback extends ActivityCompat.OnRequestPermissionsResultCallback {        void onPermissionGranted(int requestCode, List perms);        void onPermissionDenied(int requestCode, List perms);    }    private Object object;    private String[] mPermissions;    private String mRationale;    private int mRequestCode;    @StringRes private int mPositiveButtonText = android.R.string.ok;    @StringRes private int mNegativeButtonText = android.R.string.cancel;    private EasyPermission(Object object) {        this.object = object;    }    public static EasyPermission with(Activity activity) {        return new EasyPermission(activity);    }    public static EasyPermission with(Fragment fragment) {        return new EasyPermission(fragment);    }    public EasyPermission permissions(String... permissions) {        this.mPermissions = permissions;        return this;    }    public EasyPermission rationale(String rationale) {        this.mRationale = rationale;        return this;    }    public EasyPermission addRequestCode(int requestCode) {        this.mRequestCode = requestCode;        return this;    }    public EasyPermission positveButtonText(@StringRes int positiveButtonText) {        this.mPositiveButtonText = positiveButtonText;        return this;    }    public EasyPermission nagativeButtonText(@StringRes int negativeButtonText) {        this.mNegativeButtonText = negativeButtonText;        return this;    }    public void request() {        requestPermissions(object, mRationale, mPositiveButtonText, mNegativeButtonText, mRequestCode,                mPermissions);    }    /**     * Check if the calling context has a set of permissions.     */    public static boolean hasPermissions(Context context, String... perms) {        // Always return true for SDK < M, let the system deal with the permissions        if (!UIUtils.isOverMarshmallow()) {            return true;        }        for (String perm : perms) {            boolean hasPerm =                    (ContextCompat.checkSelfPermission(context, perm) == PackageManager.PERMISSION_GRANTED);            if (!hasPerm) {                return false;            }        }        return true;    }    /**     * Request a set of permissions, showing rationale if the system requests it.     */    public static void requestPermissions(final Object object, String rationale, final int requestCode,                                          final String... perms) {        requestPermissions(object, rationale, android.R.string.ok, android.R.string.cancel, requestCode,                perms);    }    /**     * Request a set of permissions, showing rationale if the system requests it.     */    public static void requestPermissions(final Object object, String rationale,                                          @StringRes int positiveButton, @StringRes int negativeButton, final int requestCode,                                          final String... permissions) {        checkCallingObjectSuitability(object);        PermissionCallback mCallBack = (PermissionCallback) object;        if (!UIUtils.isOverMarshmallow()) {            mCallBack.onPermissionGranted(requestCode, Arrays.asList(permissions));            return;        }        final List deniedPermissions =                UIUtils.findDeniedPermissions(UIUtils.getActivity(object), permissions);        boolean shouldShowRationale = false;        for (String perm : deniedPermissions) {            shouldShowRationale =                    shouldShowRationale || UIUtils.shouldShowRequestPermissionRationale(object, perm);        }        if (UIUtils.isEmpty(deniedPermissions)) {            mCallBack.onPermissionGranted(requestCode, Arrays.asList(permissions));        } else {            final String[] deniedPermissionArray =                    deniedPermissions.toArray(new String[deniedPermissions.size()]);            if (shouldShowRationale) {                Activity activity = UIUtils.getActivity(object);                if (null == activity) {                    return;                }                new AlertDialog.Builder(activity).setMessage(rationale)                        .setPositiveButton(positiveButton, new DialogInterface.OnClickListener() {                            @Override public void onClick(DialogInterface dialog, int which) {                                executePermissionsRequest(object, deniedPermissionArray, requestCode);                            }                        })                        .setNegativeButton(negativeButton, new DialogInterface.OnClickListener() {                            @Override public void onClick(DialogInterface dialog, int which) {                                // act as if the permissions were denied                                ((PermissionCallback) object).onPermissionDenied(requestCode,                                        deniedPermissions);                            }                        })                        .create()                        .show();            } else {                executePermissionsRequest(object, deniedPermissionArray, requestCode);            }        }    }    @TargetApi(23)    private static void executePermissionsRequest(Object object, String[] perms, int requestCode) {        checkCallingObjectSuitability(object);        if (object instanceof Activity) {            ActivityCompat.requestPermissions((Activity) object, perms, requestCode);        } else if (object instanceof Fragment) {            ((Fragment) object).requestPermissions(perms, requestCode);        } else if (object instanceof android.app.Fragment) {            ((android.app.Fragment) object).requestPermissions(perms, requestCode);        }    }    /**     * Handle the result of a permission request.     */    public static void onRequestPermissionsResult(Object object, int requestCode, String[] permissions,                                                  int[] grantResults) {        checkCallingObjectSuitability(object);        PermissionCallback mCallBack = (PermissionCallback) object;        List deniedPermissions = new ArrayList<>();        for (int i = 0; i < grantResults.length; i++) {            if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {                deniedPermissions.add(permissions[i]);            }        }        if (UIUtils.isEmpty(deniedPermissions)) {            mCallBack.onPermissionGranted(requestCode, Arrays.asList(permissions));        } else {            mCallBack.onPermissionDenied(requestCode, deniedPermissions);        }    }    /**     * with a {@code null} argument for the negative buttonOnClickListener.     */    public static boolean checkDeniedPermissionsNeverAskAgain(final Object object, String rationale,                                                              @StringRes int positiveButton, @StringRes int negativeButton, List deniedPerms) {        return checkDeniedPermissionsNeverAskAgain(object, rationale, positiveButton, negativeButton, null,                deniedPerms);    }    /**     * 在OnActivityResult中接收判断是否已经授权     * 使用{@link EasyPermission#hasPermissions(Context, String...)}进行判断     *     * If user denied permissions with the flag NEVER ASK AGAIN, open a dialog explaining the     * permissions rationale again and directing the user to the app settings. After the user     * returned to the app, {@link Activity#onActivityResult(int, int, Intent)} or     * {@link Fragment#onActivityResult(int, int, Intent)} or     * {@link android.app.Fragment#onActivityResult(int, int, Intent)} will be called with     * {@value #SETTINGS_REQ_CODE} as requestCode     * 

* * NOTE: use of this method is optional, should be called from * {@link PermissionCallback#onPermissionDenied(int, List)} * * @return {@code true} if user denied at least one permission with the flag NEVER ASK AGAIN. */ public static boolean checkDeniedPermissionsNeverAskAgain(final Object object, String rationale, @StringRes int positiveButton, @StringRes int negativeButton, @Nullable DialogInterface.OnClickListener negativeButtonOnClickListener, List deniedPerms) { boolean shouldShowRationale; for (String perm : deniedPerms) { shouldShowRationale = UIUtils.shouldShowRequestPermissionRationale(object, perm); if (!shouldShowRationale) { final Activity activity = UIUtils.getActivity(object); if (null == activity) { return true; } new AlertDialog.Builder(activity).setMessage(rationale) .setPositiveButton(positiveButton, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", activity.getPackageName(), null); intent.setData(uri); startAppSettingsScreen(object, intent); } }) .setNegativeButton(negativeButton, negativeButtonOnClickListener) .create() .show(); return true; } } return false; } @TargetApi(11) private static void startAppSettingsScreen(Object object, Intent intent) { if (object instanceof Activity) { ((Activity) object).startActivityForResult(intent, SETTINGS_REQ_CODE); } else if (object instanceof Fragment) { ((Fragment) object).startActivityForResult(intent, SETTINGS_REQ_CODE); } else if (object instanceof android.app.Fragment) { ((android.app.Fragment) object).startActivityForResult(intent, SETTINGS_REQ_CODE); } } private static void checkCallingObjectSuitability(Object object) { if (!((object instanceof Fragment) || (object instanceof Activity) || (object instanceof android.app.Fragment))) { throw new IllegalArgumentException("Caller must be an Activity or a Fragment."); } if (!(object instanceof PermissionCallback)) { throw new IllegalArgumentException("Caller must implement PermissionCallback."); } }}

简单使用例子

implements EasyPermission.PermissionCallback
然后在onRequestPermissionsResult里面调下面的方法
@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,                                           @NonNull int[] grantResults) {        EasyPermission.onRequestPermissionsResult(this, requestCode, permissions, grantResults);}
onPermissionGranted 用户授予所有权限
onPermissionDenied 用户拒绝至少一个权限

申请权限

EasyPermission.with(this)                .addRequestCode(RC_CAMERA_AND_AUDIO)                .permissions(new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA})                .rationale(getString(R.string.rationale_camera_audio))                .request();

更多相关文章

  1. Android下Affinities和Task!!!!!!!!!!!!
  2. 使用广播实现的Android关机及重启
  3. ubuntu10 集成android创建工程出错解决
  4. 完美PopupWindow(记住用户名模拟)
  5. Android开发1——查找所需要出示权限的内容
  6. Android开发者指南(16) ―― Activity and Task Design
  7. 让用户不再遭遇ANR
  8. Android(安卓)为【apk】文件签名,增加修改系统时间等权限
  9. Android腾讯微薄客户端开发六:给用户加VIP认证以及美化微博显示

随机推荐

  1. MySQL关于ERROR 1290 (HY000)报错解决方
  2. MySQL使用Replace操作时造成数据丢失的问
  3. MySQL 数据库铁律(小结)
  4. MySQL版本低了不支持两个时间戳类型的值
  5. MySQL如何生成唯一的server-id
  6. MySQL主从同步中的server-id示例详解
  7. 如何在Windows中运行多个MySQL实例详解
  8. mysql随机抽取一定数量的记录实例讲解
  9. 当Mysql行锁遇到复合主键与多列索引详解
  10. Centos7系统下Mysql主从同步配置方案