Android 权限机制

权限机制

Android的权限分为两类:

  • 普通权限:不会威胁到安全和隐私的权限,系统会自动授权,普通权限需要在AndroidManifest.xml中声明即可
  • 危险权限:触及用户隐私或设备安全性的权限,这部分权限必须用户手动点击授权,危险权限一般涉及地理位置,联系人信息,日程,短信,存储等。危险权限在使用时需要运行时权限处理
运行时申请权限

步骤如下:

一、判断用户是否已经给予权限
  • ContextCompat.checkSelfPermission() 两个参数:
    • 参数一:Context
    • 参数二:权限名,比如拨打电话的权限名 Manifest.permission.CALL_PHONE
  • 将返回值和 PackageManger.PERMISSION_GRANTED 比较,相等则授权成功
二、若授权成功,则继续执行逻辑,若授权失败,需要申请授权
  • ActivityCompat.requestPermissions() 三个参数:
    • 参数一:Activity实例
    • 参数二:String数组,把要申请的权限名写入数组
    • 参数三:请求码,是个唯一值即可,与后面的onRequestPermissionsResult()回调方法一致
三、申请授权后会回调到onRequestPermissionsResult()方法,授权的结果封装在grantResults参数里。
Demo code:

下面实现一个demo,申请打电话的权限 CALL_PHONE,点击拨打电话按钮,弹出申请权限。

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

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button button_makecall = findViewById(R.id.make_call);
button_makecall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//进行判断,若没有权限则先申请 否则直接拨打电话
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
}else {
call();
}
}
});
}

//回调方法
@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(this, "申请权限被拒绝", Toast.LENGTH_SHORT).show();
}
}
}

private void call() {
try{
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}catch (SecurityException e){
e.printStackTrace();
}
}
}

0%