今天测试提了一个头像上传失败的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请求就可以了