Android6.0+应用权限
安卓权限分为android6.0(包括)以上的权限和android6.0(不包括)以下的权限。
android6.0 也就是api lev 为23
-
android6.0+的权限叫做run-time permission
-
android6.0以下的权限叫做install-time permission
android6.0以下的权限
android6.0以下的权限为安装时权限,如果一个应用跑在android6.0以下的系统,那么应用所声明的权限,会在安装的时候提示用户是否允许。
还有一种case是升级,升级应用的时候,如果有新的权限,那么也会提示用户是否允许。
不过呢,基本上很少人使用android6.0以下的系统了。
所以,我们关注点还是在6.0以上的运行时权限获取。
安卓6.0以上的应用权限请求
在我们内容提供者的课程里,在多个案例里都用到了权限检查,所以的话就写下这篇文章,以留后世参考。
权限的声明
一般来说,你的应用是有可能跑在6.0以下的系统吧。所以还是要进行权限声明吧。在配置文件里,添加权限:
权限检查
我们一般在使用某个功能时,去检查某个权限。到底是什么权限,什么功能呢?
在android的文档里,指的是dangerous permission。翻译过来大概是危险权限。
检查权限:
int readPermission = checkSelfPermission(Manifest.permission.READ_CALENDAR);
int writePermission = checkSelfPermission(Manifest.permission.WRITE_CALENDAR);
if(readPermission != PackageManager.PERMISSION_GRANTED || writePermission != PackageManager.PERMISSION_GRANTED) {
//至少有一个没有权限
}
请求权限
int readPermission = checkSelfPermission(Manifest.permission.READ_CALENDAR);
int writePermission = checkSelfPermission(Manifest.permission.WRITE_CALENDAR);
if(readPermission != PackageManager.PERMISSION_GRANTED || writePermission != PackageManager.PERMISSION_GRANTED) {
//请求权限
requestPermissions(new String[]{Manifest.permission.READ_CALENDAR,Manifest.permission.WRITE_CALENDAR},PERMISSION_REQUEST_CODE);
}
权限请求的结果处理
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
if(requestCode == PERMISSION_REQUEST_CODE) {
//判断结果
if(grantResults.length == 2 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG,"has permissions..");
//有权限
} else {
Log.d(TAG,"no permissionS...");
//没权限
finish();
}
}
}
覆写方法:onRequestPermissionsResult()
以上是结果,但是我们没有做处理。这里面有一个特殊的case,就是用户在权限请求时,拒绝了,再次提示时,会有一个勾选框:不再询问。如果用户勾选了不再询问,那么你再次请求同一个权限时,安卓系统不再给出权限请求的提示,用户只可以到设置里开启权限。
如果,在onRequestPermissionsResult方法中,检查到的结果是无权限,那么,还要判断用户是不是勾选了不再询问,如果是的话,那么用户看不到任何提示。那么可以能通过以下这个方法进行检查:
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
if(requestCode == PERMISSION_REQUEST_CODE) {
//判断结果
if(grantResults.length == 2 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG,"has permissions..");
//有权限
} else {
Log.d(TAG,"no permissionS...");
//没权限
if(!ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_CALENDAR)&&!ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_CALENDAR)) {
//走到这里,说明用户之前用户禁止权限的同时,勾选了不再询问
//那么,你需要弹出一个dialog,提示用户需要权限,然后跳转到设置里头去打开。
Log.d(TAG,"用户之前勾选了不再询问...");
//TODO:弹出一个框框,然后提示用户说需要开启权限。
//TODO:用户点击确定的时候,跳转到设置里去
//Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
//Uri uri = Uri.fromParts("package", getPackageName(), null);
//intent.setData(uri);
////在activity结果范围的地方,再次检查是否有权限
//startActivityForResult(intent, PERMISSION_REQUEST_CODE);
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_CALENDAR,Manifest.permission.READ_CALENDAR}, PERMISSION_REQUEST_CODE);
//请求权限
Log.d(TAG,"请求权限...");
}
}
}
}