Android运行时权限
简介:Android 6.0 以后,对于一些用户隐私权限总会在第一次提示用户是否授予权限。
优点:
- 更好的保护了用户的隐私。
- 给了程序向用户说明权限的作用。
- 可以防止一些恶意程序盗取用户后者手机信息,增强了Android系统的安全性。
Android 6.0 将权限分为两类:
- 普通权限:不需要单独申请,直接在Manifest里注册即可。
- 危险权限&危险权限组:危险权限都是分组出现的,用户只要授权组内的一个权限,组内的其他权限就会立即授权。
危险权限列表:
申请方式一: 原生API
新增API:
- ContextCompat.checkSelfPermission:检查危险权限&危险权限组是否授权。
- ActivityCompat.requestPermissions:申请权限。
- onRequestPermissionsResult:申请权限的回调(用户授权或拒绝授权)。
- ActivityCompat.shouldShowRequestPermissionRationale:给用户解释,申请权限用户干什么。用户拒绝过权限后出现。
使用步骤:
- 在Manifest中添加需要的权限(不可省,因为要适配android 6.0 以下机型);
- 检查危险权限;
- 申请授权;
- 处理申请授权回调。
1.1 简单使用
示例:需要申请一个权限的功能(摄像头),需要申请多个(示例为2个:摄像头和手机状态)权限的功能。
public class PermissionActivity extends AppCompatActivity {
private Context mContext = this;
private final int PERMISSION_CAMERA = 100;//摄像头权限
private final int PERMISSION_PHONE = 101;//摄像头和手机状态权限
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_permission);
ButterKnife.bind(this);
}
@OnClick({R.id.per_btn_cc_cp, R.id.per_btn_cc_camera})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.per_btn_cc_camera:
openCCCamera();//原生运行时权限--摄像头
break;
case R.id.per_btn_cc_cp:
openCCCP();//原生运行时权限--摄像头和手机状态
break;
}
}
/** 原生申请权限--摄像头 */
private void openCCCamera() {
//2.检查权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
//进入到这里代表没有权限
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
//如果用户拒绝过该权限
new AlertDialog.Builder(this).setTitle("权限提示")
.setMessage("之前拒绝授权,使用摄像头需要该权限")
.setPositiveButton("知道了", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.CAMERA}, PERMISSION_CAMERA);
}
}).show();
} else {
//3. 申请权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, PERMISSION_CAMERA);
}
} else {
Toast.makeText(this, "之前已经授权,现在可以使用摄像头了", Toast.LENGTH_SHORT).show();
}
}
/** 原生申请权限--摄像头 和 手机状态 */
private void openCCCP() {
//2.检查权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
!= PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
//3. 申请权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE}, PERMISSION_PHONE);
} else {
Toast.makeText(this, "之前已经授权,现在可以使用摄像头、读取手机状态了"