一线天的gravatar头像
一线天 2016-11-25 19:49:49

android6.0高版本如何动态获取权限?

安卓6.0版本权限获取

所有回答列表(2)
lbj215的gravatar头像
lbj215  LV5 2016年11月27日

非常实用

NYQFJGK的gravatar头像
NYQFJGK  LV1 2021年12月29日

订阅专栏
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:
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        try{
          //权限申请函数
            requestCameraPermission();
        }catch (Exception e){
            Log.d("CameraDemo Start",e.toString());
        }
    }
});
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();
    }
}
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
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
下面是另外一个动态获取权限的思路:
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
2
3
4
5
6
7
8
9
核心部分是:
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){   ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},1); }
1
其中的本质就是判断权限是否存在,然后若是不存在该权限那么就直接申请。但有一个坏处是这里申请的权限是写死的,最好的解决办法是写一个函数便于调用。
 

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友