android6.0手机权限问题

今天测试提了一个头像上传失败的bug,让我郁闷很久!我的手机明明就可以成功,为什么他的失败。然後拿测试的手机过来调试 , 发现他用到时6.0系统 . 断点调试 , 抛了个异常,读取文件失败 . 那我清单文件中明明添加权限了 . 然后重点在6.0系统上着手,经过搜索资料发现6.0的手机权限需要代码读取清单文件中添加的权限.

谷歌官方将权限分为了两类,一个是正常权限(Normal Permissions),这类权限不涉及用户隐私,是不需要用户进行授权的,比如访问网络,手机震动等。还有一类是危险权限(Dangerous Permissions),一般是涉及到用户隐私的,需要用户进行授权,比如操作SD卡的写入,调用相机,录音等。这里只以文件读写为例!
  • 在读取图片的类中声明权限常量

//声明常量权限
private static final int REQUEST_EXTERNAL_STORAGE = 1;

  • 在读取文件的地方先判断是否打开权限

// 是否添加权限
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
//如果没有权限,申请权限
if (permission != PackageManager.PERMISSION_GRANTED) {
   
   ActivityCompat.requestPermissions(
       activity,PERMISSIONS_STORAGE,11
     );
 }

申请权限结果回调

	@Override
	public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions, @NonNull int[] grantResults) {
		if (requestCode == 11) {

	LogUtils.out("---请求权限成功==");
	
			} else {
		LogUtils.out("---请求权限失败==");
			}
		}
		super.onRequestPermissionsResult(requestCode, permissions, grantResults);
	}

最后当然也要在清单文件中添加读写文件的权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

另外同时申请多个权限也是经常遇到的情况,同样的申请权限流程不变,只需要申明一个数组,进行遍历申请就好
第一步声明要申请的权限组

 //动态请求的权限数组
    String[] permissions = new String[]{
            Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
  //没通过的权限
    List<String> mPermissionList = new ArrayList<>();

第二步,申请权限前先进行判断是否已有这些权限

  //检查权限
    private void checkPermission() {
        //逐个判断你要的权限是否已经通过
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                mPermissionList.add(permission);//添加还未授予的权限
            }
        }
        //申请权限
        if (mPermissionList.size() > 0) {//有权限没有通过,需要申请
            ActivityCompat.requestPermissions(this, permissions, 11);
        } else {
            //已授权,操作功能
       
        }
    }

第三步申请权限的回调结果

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 11) {
            boolean hasPermissionDismiss = false;//有权限没有通过
            for (int grantResult : grantResults) {
                if (grantResult == -1) {
                    hasPermissionDismiss = true;
                }
            }
            //如果有权限没有被允许
            if (hasPermissionDismiss) {
                ToastUtils.showToast(UIUtils.getString(R.string.permission_open));
            } else {
                //全部权限通过,可以进行下一步操作。。。
              
            }
        }
    }

PS: Fragment中要接收请求权限的回调,不能用ActivityCompat去请求权限,直接requestPermissions请求就可以了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值