当前位置: 代码迷 >> 综合 >> Android6.0 运行时权限
  详细解决方案

Android6.0 运行时权限

热度:71   发布时间:2023-12-15 01:56:02.0

在Android的上百多种权限里,普通权限不用记,只需要记住危险权限;危险权限一共9组24个:
在这里插入图片描述
注意 : 判断用户是否选中不再询问::
ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA) 为false时用户选中了不再询问

if(!ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA)){
    Toast.makeText(this, "勾选了不再询问", Toast.LENGTH_SHORT).show();这里可以提示用户如何手动打开权限,也可以跳转到相关权限页面}

这里做一个打电话的demo:
1:点击按钮判断用户是否授权:

btn.setOnClickListener(new View.OnClickListener() {
    @Overridepublic 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();}}});

检查权限 是用的ContextCompat.checkSelfPermission()方法,它接收两个参数,一参:context,二参:具体的权限名,得到的返回值与PackageManager.PERMISSION_GRANTED作比较,如果想等就说明已经授权;

反之不相等,需要通过ActivityCompat.requestPermissions()方法来申请权限,它接收三个参数,一参:context; 二参:string数组 把我们需要申请的权限名放里边,可以放多个;三参:传入唯一的请求码(与onRequestPermissionsResult的第一个参数相对应);

ActivityCompat.requestPermissions()方法会弹出一个对话框,无论用户选择确定和拒绝都会回调下面的onRequestPermissionsResult()方法:

 @Overridepublic 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, "You denied the permission!", Toast.LENGTH_SHORT).show();}}}

onRequestPermissionsResult()方法
一参:是与ActivityCompat.requestPermissions()方法的第三个参数相对应的唯一请求码;
二参:权限名数组
三参:封装 授权的结果

下面是Call()方法的具体代码:

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

这样就完成了!在6.0及以上的android手机上运行此程序,点击按钮会触发权限,同意便会拨打电话,拒绝也不会影响程序运行。