Android6.0及更高版本动态获取权限

Android 6.0及其更高版本中,即API>=23之后的版本中某些受保护的权限无法直接通过Manifest来直接默认获取,只能通过动态获取,这样做的好处是显而易见的,可以让权限用在该用的地方。

动态获取权限要做的是这几件事情:

  • 判断当前的系统版本,API版本的多少来确定使用哪种获取权限的方法,如果API小于23那么就不需要发起权限获取操作。
  • 如果API大于或等于23那么就发起权限获取,ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},1); this 为当前的操作主体Activity,string数组内为所请求的权限,可见可以同时获取多个权限,最后一位是请求码requestcode。
  • 最后一步是确定回调函数onRequestPermissionsResult(int requestCode,String[] Permissions,int[] grantResult) 其中grantResult数组的第一位若等于PackageManager.PERMISSION_GRANTED那么说明权限被授予否则权限授予失败。

接下来show you the code:

1
2
3
4
5
6
7
8
9
10
11
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try{
//权限申请函数
requestCameraPermission();
}catch (Exception e){
Log.d("CameraDemo Start",e.toString());
}
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void requestCameraPermission(){
//判断SDK版本是否大于23
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
int checkCameraPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
if(checkCameraPermission != PackageManager.PERMISSION_GRANTED){
//进入这个部分表示程序没有该权限
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},1);
return;
}else{
Toast.makeText(MainActivity.this,"相机权限已获取成功",Toast.LENGTH_LONG).show();
onCallCamera();
}
}else{
Toast.makeText(MainActivity.this,"API小于23无需获取权限,只需要声明即可",Toast.LENGTH_LONG).show();
onCallCamera();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public void onRequestPermissionsResult(int requestCode,String[] Permissions,int[] grantResult){
switch (requestCode){
case 1:
if(grantResult[0] == PackageManager.PERMISSION_GRANTED){
//TODO 相机调用函数
onCallCamera();
}else{
Toast.makeText(MainActivity.this,"权限被拒绝",Toast.LENGTH_LONG).show();
}
break;
default:
super.onRequestPermissionsResult(requestCode,Permissions,grantResult);
}
}

private void onCallCamera() {
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i, 1);
Toast.makeText(MainActivity.this, "函数调用成功", Toast.LENGTH_LONG).show();
}
protected void onActivityResult(int requestcode, int resultCode, Intent data){
//接收camera拍摄下来的照片回传到activity中
try{
if(requestcode !=1){
return;
}
super.onActivityResult(requestcode,resultCode,data);
Bundle extras = data.getExtras();
Bitmap bitmap = (Bitmap)extras.get("data");
imageView.setImageBitmap(bitmap);
}catch (Exception e){
Log.d("Camera",e.toString());
}

}

下面是另外一个动态获取权限的思路:

1
2
3
4
5
6
7
8
9
Intent i =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},1);
}else {
startActivityForResult(i,1);
Toast.makeText(MainActivity.this,"test_1",Toast.LENGTH_LONG).show();
}
startActivityForResult(i,1);
Toast.makeText(MainActivity.this,"test_2",Toast.LENGTH_LONG).show();

核心部分是:

1
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){   ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},1); } 

其中的本质就是判断权限是否存在,然后若是不存在该权限那么就直接申请。但有一个坏处是这里申请的权限是写死的,最好的解决办法是写一个函数便于调用。

作者

TankNee

发布于

07/28/2019

更新于

06/17/2022

许可协议

评论