android 6.0以后增加一个重要的适配,动态运行权限,之前我都是采用一些第三方库:PermissionsDispatcher;没啥大问题就是觉得膈应,闲了还是自己动手封装一下:
总体实现过程:
1,BaseActivity中加入权限判断以及申请。
2,需要权限的activity重写BaseActivity中onCall()方法来获得权限成功后要做的事情。
下面开始具体的实现的过程:
比如说我们先要获得相机这个权限:
1,清单文件中先申明。
image2,调用BaseActivity中的setPermission(String permission),方法,
3,重写BaseActivity的onCall(String permission)的方法。
image那么BaseActivity 中是如何封装的呢?
image申请权限的回调
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 0 || requestCode == 1){//requestCode = 0 表示申请单个重要权限 = 1 为同时申请多个权限 一般来说不太重要
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == -1){
if (shouldShowRequestPermissionRationale(permissions[i])) {
/**
* 用户拒绝后的操作,这里我们继续提醒用户申请权限(除非是特别特别重要的权限,否则不要这样做!)
*/
if (requestCode == 0){
ActivityCompat.requestPermissions(this,new String[]{permissions[i]},0);
}else{
Toast.makeText(BaseActivity.this, "权限被拒绝: "+permissions[i], Toast.LENGTH_SHORT).show();
}
}else{
if (requestCode == 0){
/**
* 用户多次拒绝权限并设置了不再提醒,那么只能提醒用户去设置页面打开我们的权限了(除非是特别特别重要的权限,否则不要这样做!)
*/
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("说明");
builder.setMessage("没有权限将无法使用APP,打开设置页面放开权限");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
/**
* 这里使用了第三方库,用于打开应用的权限设置页面(有各种手机厂商的适配)
* author : Senh Linsh
* github : https://github.com/SenhLinsh
*/
Utils.init(BaseActivity.this);
IntentUtils.gotoPermissionSetting();
// Intent intent = new Intent();
// intent.setAction(Settings.ACTION_SETTINGS);
// startActivity(intent);
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(BaseActivity.this, "无法使用APP", Toast.LENGTH_SHORT).show();
}
});
builder.show();
}else{
Toast.makeText(BaseActivity.this, "权限被拒绝: "+permissions[i], Toast.LENGTH_SHORT).show();
}
}
}else if(requestCode == 0){
onCall(permissions[i]);
}
}
if (requestCode == 1){
onCall("");
}
}
else{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
这样就算是简单的封装完成啦~当然这里还有多权限申请的方法:
/**
* 检查多个申请权限
* @param permissionsArray
*/
public void setPermissionGroup(String[] permissionsArray){
permissionsList = new ArrayList<String>();
if (Build.VERSION.SDK_INT>23){
for (String permission : permissionsArray) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permission);
}
}
if (permissionsList.size() == 0){
onCall("");
}else{
ActivityCompat.requestPermissions(this, permissionsList.toArray(new String[permissionsList.size()]), 1);
}
}else{
onCall("");
}
}
网友评论