普通权限,直接获得;
- 危险权限有哪些?短信、电话、通讯录、地理位置、摄像头、读存照片等;
- 能否获得权限的状态?android6.0以上可以;
- 能否知道,用户点击的“允许”还是“禁止”?23以上才能知道,低版本的不行;
- 运行时获取权限,要求targetSdk>=23;
四个比较重要的API:
checkSelfPermission(); //检查是否在已经获取权限
shouldShowRequestPermissionRationale(); //是否弹系统获取权限的提示框
requestPermissions(); //获取权限
onRequestPermissionsResult(); //回调
为了兼容低版本,不用区分sdkVersion是否大于23,建议第1个使用ContextCompat.checkSelfPermission();中间2个,使用ActivityCompat;
6.0以上,拒绝时如果不选择不再提醒,每次都会弹出提示框;6.0以下,拒绝时不选择不再提醒,只有重新打开app,才会再次弹出提示框;
sdk>=23 | sdk<23 | |
---|---|---|
checkSelfPermission() | 返回其该有的值 | 总是true |
shouldShowRequestPermissionRationale() | 第一次false,选择不再提醒并拒绝后,下次返回false | 不起作用 |
requestPermissions() | 可以是一组权限 | 不起作用 |
onRequestPermissionsResult(); | 不会执行 |
示例代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_camera);
ButterKnife.bind(this);
btn = (Button) findViewById(R.id.camera_btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int hasCameraPermission = ContextCompat.checkSelfPermission(activity, cameraStr);
if (hasCameraPermission != PackageManager.PERMISSION_GRANTED) {
if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, cameraStr)) {
new AlertDialog.Builder(activity).setMessage("reason for need camera").setPositiveButton("ok",null).show();
return;
}
ActivityCompat.requestPermissions(activity, new String[]{cameraStr}, 0);
return;
}
openCamera(); //android6.0以下的
}
});
}
//android6.0以下不会执行
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[]
grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (permissions[0].equals(cameraStr)) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
btn.setText("granted");
openCamera();
} else {
btn.setText("denied");
}
}
}
private void openCamera(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);
}