运行时权限

来源:互联网 发布:南昌软件测试培训 编辑:程序博客网 时间:2024/06/14 03:15

为了进一步保护用户的安全和隐私,安卓从6.0版本推出了将权限一分为二,分为普通权限和危险权限。6.0以下依然是在安装时列出所有权限,用户同意后就开始安装,所有权限即为同意。而6.0以后危险权限默认用户没有授权,所以我们在使用这些危险权限前需要得到用户的授权,用户同意后才能继续提供服务。

1.先看看哪些是危险权限。共9组24个

CALENDAR

  • READ_CALENDAR
  • WRITE_CALENDAR
CAMERA
  • CAMERA
CONTACTS
  • READ_CONTACTS
  • WRITE_CONTACTS
  • GET_ACCOUNTS
LOCATION
  • ACCESS_FINE_LOCATION
  • ACCESS_COARSE_LOCATION
MICROPHONE
  • RECORD_AUDIO
PHONE
  • READ_PHONE_STATE
  • CALL_PHONE
  • READ_CALL_LOG
  • WRITE_CALL_LOG
  • ADD_VOICEMAIL
  • USE_SIP
  • PROCESS_OUTGOING_CALLS
SENSORS
  • BODY_SENSORS
SMS
  • SEND_SMS
  • RECEIVE_SMS
  • READ_SMS
  • RECEIVE_WAP_PUSH
  • RECEIVE_MMS
STORAGE
  • READ_EXTERNAL_STORAGE
  • WRITE_EXTERNAL_STORAGE

2.判断是否已授权:
if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION)                == PackageManager.PERMISSION_GRANTED)
checkSelfPermission返回一个int数,可以与后面这个值比较,相等说明已经授权。这行代码判断ACCESS_FINE_LOCATION授权与否。

3.发出权限请求并得到用户选择:
发出权限请求:
ActivityCompat.requestPermissions(MainActivity.this,array,1);

这个请求的一个参数是一个字符串数组,是权限数组,也就是每次可以发出多个权限的请求。
返回的结果在下面的方法中:
@Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        switch (requestCode){            case 1:                if (grantResults.length>0){                    for (int permit:grantResults){                        if (permit!=PackageManager.PERMISSION_GRANTED){                            Toast.makeText(MainActivity.this,"请同意所有权限",Toast.LENGTH_SHORT).show();                            return;                        }                    }                    locate();                }                break;        }    }
第一个参数结果码,为1说明正常,第二个是权限数组,第三个是结果数组,Int类型,我对这个数组进行遍历,如上所说与PackageManager.PERMISSION_GRANTED这个值进行比较确定用户是否对相应权限进行了授权。

4.多个要求权限的处理技巧:用一个list,判断每一个权限把没有授权的加入list,然后转成数组进行请求:
List<String> permissions=new ArrayList<>();        if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION)                != PackageManager.PERMISSION_GRANTED){            permissions.add(android.Manifest.permission.ACCESS_FINE_LOCATION);        }        if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.READ_PHONE_STATE)                !=PackageManager.PERMISSION_GRANTED){            permissions.add(android.Manifest.permission.READ_PHONE_STATE);        }        if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)                !=PackageManager.PERMISSION_GRANTED){            permissions.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);        }        if (!permissions.isEmpty()){            String[] array=permissions.toArray(new String[permissions.size()]);            ActivityCompat.requestPermissions(MainActivity.this,array,1);        } else {            locate();//已经同意所有权限        }





0 0