今天测试提了一个头像上传失败的bug,让我郁闷很久!我的手机明明就可以成功,为什么他的失败。然後拿测试的手机过来调试 , 发现他用到时6.0系统 . 断点调试 , 抛了个异常,读取文件失败 . 那我清单文件中明明添加权限了 . 然后重点在6.0系统上着手,经过搜索资料发现6.0的手机权限需要代码读取清单文件中添加的权限.
谷歌官方将权限分为了两类,一个是正常权限(Normal Permissions),这类权限不涉及用户隐私,是不需要用户进行授权的,比如访问网络,手机震动等。还有一类是危险权限(Dangerous Permissions),一般是涉及到用户隐私的,需要用户进行授权,比如操作SD卡的写入,调用相机,录音等。这里只以文件读写为例!
- 在读取图片的类中声明权限常量
//声明常量权限
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
- 在读取文件的地方先判断是否打开权限
// 是否添加权限
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"/>
PS: Fragment中要接收请求权限的回调,不能用ActivityCompat去请求权限,直接requestPermissions请求就可以了