在运行时请求权限
从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限。它还让用户可以对应用的功能进行更多控制;例如,用户可以选择为相机应用提供相机访问权限,而不提供设备位置的访问权限。用户可以随时进入应用的“Settings”屏幕调用权限。
系统权限分为两类:正常权限和危险权限:
- 正常权限不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。
- 危险权限会授予应用访问用户机密数据的权限。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限。
1.检查应用是否获取权限
调用 ContextCompat.checkSelfPermission()
方法检查权限
如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED
,并且应用可以继续操作。
如果应用不具有此权限,方法将返回 PERMISSION_DENIED
,且应用必须明确向用户要求权限。
如果您的应用需要危险权限,则每次执行需要这一权限的操作时您都必须检查自己是否具有该权限。用户始终可以自由调用此权限,因此,即使应用昨天使用了相机,它不能假设自己今天仍具有该权限
获取相机拍照权限的示例:
if (ContextCompat.checkSelfPermission(MyInfoActivity.this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){
//获取拍照权限
ActivityCompat.requestPermissions(MyInfoActivity.this,new String[]{Manifest.permission.CAMERA},CAMERA_PERMISSION_CODE);
}else {
//权限已有,可以拍照了!
selectCamera();
}
2.获取权限的方法
调用一个 requestPermissions()
例如:
ActivityCompat.requestPermissions(MyInfoActivity.this,new String[]{Manifest.permission.CAMERA},CAMERA_PERMISSION_CODE);
第一个参数:上下文;第二个参数:权限组(可同时注册一组权限);第三个参数:请求码;
3.处理权限请求响应
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case CAMERA_PERMISSION_CODE:
ToastUtils.showImageToast(MyInfoActivity.this,"权限申请OK!");
break;
}
}