Android权限(普通权限+危险权限)

注意:本篇文章是本人阅读相关文章所写下的总结,方便以后查阅,所有内容非原创,侵权删。

本篇文章内容来自于
1.Android第一行代码 郭霖

目录

1.权限分类(普通权限+危险权限)
2.申请单个权限 第一行代码248
3.申请多个权限 第一行代码388

1.权限分类

1⃣️低于6.0系统的设备 安装时给权限申请提醒,而且可以在设置中进行管理。如果不同意某项则这个软件不能使用。
2⃣️6.0系统加入运行时权限 用户不需要在安装时一次性申请所有权限,可以在软件使用过程中对某一项申请进行授权 拒绝后只是不能用这个功能,其他功能依旧可以使用

但并不是所有权限都需要运行时申请,对于用户来说,不停授权也很麻烦。
Android将所有权限分为:
普通权限 系统自动授权(只需要在清单文件中 )
危险权限 必须用户手动授权 威胁安全(需要动态申请)

Android中有上百种权限,如何区分哪些是普通哪些是危险。危险权限一共有9组24个,其他的都是普通权限。
所有权限列表查看Android权限列表(转)

Android危险权限:

编号 权限组 权限
0 CALENDAR READ_CALENDAR WRITE_CALENDAR
1 CAMERA CAMERA
2 CONTACTS READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS
3 LOCATION ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION
4 MICROPHONE RECORD_AUDIO
5 PHONE READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS
6 SENSORS BODY_SENSORS
7 SMS SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS
8 STORAGE READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE

注意:表格中的每个危险权限都属于一个权限组,我们在进行运行时权限处理时使用的是权限名,但是用户一旦同意授权了,那么该权限所对应的权限组中的其他权限也会同时被授权。

2.申请单个权限

例子:点击按钮进行拨号,需要危险权限中的CALL_PHONE权限
第一步:在清单文件中声明权限



    
    ...

第二步:在代码中进行动态申请权限

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn_call = findViewById(R.id.btn_call);
        btn_call.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //==第一步:判断用户是否已经授权
                //ContextCompat.checkSelfPermission() 参数一:context 参数二:具体的权限名
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    //没有授权,则申请授权
                    //ActivityCompat.requestPermissions() 参数一:context 参数二:申请的权限名数组 参数三:请求码,要求唯一值
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
                } else {
                    call();
                }
            }
        });
    }

    @SuppressLint("MissingPermission")
    private void call() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:10086"));
        startActivity(intent);
    }

    //==第二步:调用requestPermissions申请权限,不管是否同意都会回调onRequestPermissionsResult
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    call();
                } else {
                    Toast.makeText(MainActivity.this, "you denied", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
}

3.申请多个权限

第一步:在清单文件中声明权限




    
    
    

第二步:在代码中进行动态申请权限

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn_call = findViewById(R.id.btn_call);
        btn_call.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //第一步:看权限是否已经被申请,没有则申请权限
                List permissionList = new ArrayList<>();
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    permissionList.add(Manifest.permission.CALL_PHONE);
                }
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                    permissionList.add(Manifest.permission.READ_PHONE_STATE);
                }
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                }
                if (!permissionList.isEmpty()) {
                    String[] permissions = permissionList.toArray(new String[permissionList.size()]);
                    ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
                } else {
                    call();
                }
            }
        });
    }

    @SuppressLint("MissingPermission")
    private void call() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:10086"));
        startActivity(intent);
    }

    //第二步:调用requestPermissions申请权限,不管是否同意都会回调onRequestPermissionsResult
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0) {
                    for (int result : grantResults) {
                        if (result != PackageManager.PERMISSION_GRANTED) {
                            Toast.makeText(MainActivity.this, "you denied some", Toast.LENGTH_SHORT).show();
                            finish();
                            return;
                        }
                    }
                    call();
                }else{
                    Toast.makeText(MainActivity.this, "发生未知错误", Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
        }
    }
}

你可能感兴趣的:(Android权限(普通权限+危险权限))