关于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;
}
}
以上就是我对权限的一个简单封装,若有疑问和建议还希望留言指正,谢谢!