1、在Android 6.0之后,APP获取手机的权限不再仅仅只是在清单文件中声明就行了,它将手机的权限分为了两类:正常权限和危险权限:
- 正常权限:不会直接给用户隐私权带来风险。在清单文件中声明就能获取的权限。
- 危险权限:会授予应用访问用户机密数据的权限。在清单文件中声明危险权限,还需要在在代码中动态申请权限,让用户自己选择是否允许APP拥有该权限。
2、动态申请权限涉及到的方法:
- ContextCompat.checkSelfPermission方法:
检查应用是否具有某个危险权限。如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具有此权限,方法将返回 PackageManager.PERMISSION_DENIED,且应用必须明确向用户要求权限。 - ActivityCompat.shouldShowRequestPermissionRationale方法:
在上一个方法判断用户没有权限后,调用此方法。如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don't ask again 选项,此方法将返回 false。如果设备规范禁止应用具有该权限,此方法也会返回 false。 - ActivityCompat.requestPermissions方法:
这个方法动态申请权限,调用后会弹出一个对话框提示用户授权所申请的权限。 - onRequestPermissionsResult
当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法,向其传递用户响应,处理对应的场景。
3、例子:申请获取用户位置信息(危险权限)
第一步:在清单文件中申请权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
第二步:在代码中动态申请权限
// java写法:
private void requestPermission() {
if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED) {
Log.i(TAG,"用户没用此权限");
if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_FINE_LOCATION)) {
Log.i(TAG,"用户申请过权限,但是被拒绝了(不是彻底决绝)");
// 申请权限
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},1);
} else {
Log.i(TAG,"申请过权限,但是被用户彻底决绝了或是手机不允许有此权限(依然可以在此再申请权限)");
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},1);
}
}
}
// kotlin写法:
private fun requestPermission() {
if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Log.i("yk", "没有权限,去申请")
if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_FINE_LOCATION)) {
// 申请权限
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),1)
} else {
// 申请过权限,但是用户彻底决绝了或是手机不允许拥有此权限,执行相应的操作:
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),1)
}
}
}
// 第三步:根据用户的选项做出相应
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.i(TAG,"用户授予了权限");
// 执行相应的操作:
} else {
Log.i(TAG,"用户没有给予权限");
showWaringDialog();
}
return;
}
}
}
private void showWaringDialog() {
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("警告!")
.setMessage("请前往设置->应用->PermissionDemo->权限中打开相关权限,否则功能无法正常运行!")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 一般情况下如果用户不授权的话,功能是无法运行的,做退出处理
finish();
}
}).show();
}
4、权限清单:
网友评论