普通權(quán)限餐蔬,直接獲得;
- 危險(xiǎn)權(quán)限有哪些佑附?短信樊诺、電話、通訊錄音同、地理位置词爬、攝像頭、讀存照片等瘟斜;
- 能否獲得權(quán)限的狀態(tài)缸夹?android6.0以上可以;
- 能否知道螺句,用戶點(diǎn)擊的“允許”還是“禁止”虽惭?23以上才能知道,低版本的不行蛇尚;
- 運(yùn)行時(shí)獲取權(quán)限芽唇,要求targetSdk>=23;
四個(gè)比較重要的API:
checkSelfPermission(); //檢查是否在已經(jīng)獲取權(quán)限
shouldShowRequestPermissionRationale(); //是否彈系統(tǒng)獲取權(quán)限的提示框
requestPermissions(); //獲取權(quán)限
onRequestPermissionsResult(); //回調(diào)
為了兼容低版本取劫,不用區(qū)分sdkVersion是否大于23匆笤,建議第1個(gè)使用ContextCompat.checkSelfPermission();中間2個(gè)谱邪,使用ActivityCompat炮捧;
6.0以上,拒絕時(shí)如果不選擇不再提醒惦银,每次都會彈出提示框咆课;6.0以下末誓,拒絕時(shí)不選擇不再提醒,只有重新打開app书蚪,才會再次彈出提示框喇澡;
sdk>=23 | sdk<23 | |
---|---|---|
checkSelfPermission() | 返回其該有的值 | 總是true |
shouldShowRequestPermissionRationale() | 第一次false,選擇不再提醒并拒絕后殊校,下次返回false | 不起作用 |
requestPermissions() | 可以是一組權(quán)限 | 不起作用 |
onRequestPermissionsResult(); | 不會執(zhí)行 |
示例代碼:
@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以下不會執(zhí)行
@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);
}
推薦文章http://jijiaxin89.com/2015/08/30/Android-s-Runtime-Permission/