Android 6.0权限的封装(一篇就够)

关于android 6.0权限封装的例子网上一堆,考虑到实际运用和用户体验,我还是亲自对权限进行了封装,个人认为更符合APP的操作习惯和体验性。

1、首先直接来看看权限的请求操作吧,例如,请求一个读取联系人权限Manifest.permission.READ_PHONE_STATE。

//实例化一个PermissionManager类对象
private PermissionManager permissionManager = new PermissionManager(this);

//请求权限的方法
private void checkPermission() {
    permissionManager.addPermission(new Permission() {
            @Override
            public String getPermission() {
                //返回需要申请得权限
                return Manifest.permission.READ_PHONE_STATE;
            }

            //权限申请的结果回调
            @Override
            public void onApplyResult(boolean succeed) {
                if (succeed) {
                    //请求成功操作
                } else {
                    //请求失败操作
                }
            }
        }).apply(this);//传入Activity或者Fragment实例对象
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //在权限回调里面调用permissionManager的onPermissionsResult()方法。
        permissionManager.onPermissionsResult(requestCode, permissions, grantResults);
    }

一看,是不是很简单,很实用,及时申请权限,及时处理。那有人说,申请多个权限怎么办?别急,申请多个权限直接代用permissionManager.addPermission(new Permission());迭代添加就行。例如:

permissionManager
        .addPermission(new Permission() {
            @Override
            public String getPermission() {
                return Manifest.permission.READ_EXTERNAL_STORAGE;
            }

            @Override
            public void onApplyResult(boolean succeed) {
                //根据succeed的返回值来判断权限有无来进行操作
                }
            }
        })
        .addPermission(new Permission() {
            @Override
            public String getPermission() {
                return Manifest.permission.READ_PHONE_STATE;
            }

            @Override
            public void onApplyResult(boolean succeed) {
                //根据succeed的返回值来判断权限有无来进行操作
                }
            }
        }).apply(this);

是不是还是很简单,看着很舒服。其实封装的操作很简单,只需简单的几步就可以完成。

2、首先创建一个“权限”接口,代表一个权限。

public interface Permission {
    /**
     * 请求的权限
     *
     * @return 请求的权限
     */
    String getPermission();

    /**
     * 请不权限返回的结果
     *
     * @param succeed 允许开启权限则返回true
     */
    void onApplyResult(boolean succeed);
}

3、创建一个权限管理类,对权限进行管理和申请操作。

public class PermissionManager {
    private static final int CODE = 601;
    private List<Permission> mPermissionList;
    private List<Permission> mNeedPermissionList;
    private Activity mActivity;
    private Fragment mFragment;

    /**
     * 在Activity里面申请权限
     *
     * @param activity 该Activity的实例对象
     */
    public PermissionManager(Activity activity) {
        this.mActivity = activity;
        mPermissionList = new ArrayList<>();
        mNeedPermissionList = new ArrayList<>();
    }

    /**
     * 在Fragment里面申请权限
     *
     * @param fragment 该Fragment的实例对象
     */
    public PermissionManager(Fragment fragment) {
        this.mFragment = fragment;
        mPermissionList = new ArrayList<>();
        mNeedPermissionList = new ArrayList<>();
    }

    public PermissionManager addPermission(Permission permission) {
        mPermissionList.add(permission);
        return this;
    }

    public void apply(@NonNull Context context) {

        for (int i = 0; i < mPermissionList.size(); i++) {
            Permission permission = mPermissionList.get(i);
            if (ContextCompat.checkSelfPermission(context, permission.getPermission()) != PackageManager.PERMISSION_GRANTED) {
                mNeedPermissionList.add(permission);
            } else {
                permission.onApplyResult(true);
            }
        }

        if (mNeedPermissionList.size() == 0) {
            return;
        }

        String[] permission = new String[mNeedPermissionList.size()];
        for (int j = 0; j < mNeedPermissionList.size(); j++) {
            permission[j] = mNeedPermissionList.get(j).getPermission();
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (mActivity != null) {
                mActivity.requestPermissions(permission, CODE);
            } else {
                mFragment.requestPermissions(permission, CODE);
            }
        }

        if (null != mPermissionList) {
            mPermissionList.clear();
        }
    }

    /**
     * 该方法必须在Activity或者Fragment的onRequestPermissionsResult() 调用,否则没有回调事件
     *
     * @param requestCode  请求码
     * @param permissions  请求的权限
     * @param grantResults 是否成功的标记
     */
    public void onPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == CODE) {
            for (int i = 0; i < mNeedPermissionList.size(); i++) {
                if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                    mNeedPermissionList.get(i).onApplyResult(true);
                } else {
                    mNeedPermissionList.get(i).onApplyResult(false);
                }
            }
        }
    }

    public static boolean checkPermission(Context context, String permission) {
        return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;
    }

}

以上就是我对权限的一个简单封装,若有疑问和建议还希望留言指正,谢谢!

发布了27 篇原创文章 · 获赞 32 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/luoyingxing/article/details/72844417