问题描述:
Android开发,在访问文件夹创建文件的时候,报错IOException: No such file or directory ,代码本身没有问题。
注册权限
找了一会儿,突然间想起来这是一个访问内存,需要权限,在AndroidManifest中进行注册:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-
因为读和写是同一大权限下的,申请其中一个,就可以将同一大权限下的所有都获取到
-
同时,官方规定了危险权限列表,如下图的危险权限,AndroidManifest中注册了也无法直接使用(API 23以后),需要动态申请。
动态申请权限
动态申请权限,可以在一开始进入程序的时候就全部申请,也可以在用到这个功能的时候再向用户申请,因为我用的很早,所以在一开始进入的时候就申请了,需要加入如下代码:
String[] permissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
List<String> mPermissionList = new ArrayList<>();
// private ImageView welcomeImg = null;
private static final int PERMISSION_REQUEST = 1;
// 检查权限
private void checkPermission() {
mPermissionList.clear();
//判断哪些权限未授予
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);
}
}
/**
* 判断是否为空
*/
if (mPermissionList.isEmpty()) {//未授予的权限为空,表示都授予了
} else {//请求权限方法
String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组
ActivityCompat.requestPermissions(MainActivity.this, permissions, PERMISSION_REQUEST);
}
}
/**
* 响应授权
* 这里不管用户是否拒绝,都进入首页,不再重复申请权限
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case PERMISSION_REQUEST:
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
break;
}
}
同时在onCreate中触发检查权限的方法;加入checkPermission()方法
总结:
- 是否在AndroidManifest中注册了权限
- 若是注册了权限且开发环境大于23,是否进行了动态申请权限。