1. 背景
Android开发过程中,需要在SDcard目录内创建文件夹并创建文件保存内内容,首先在AndroidManifest.xml中加入相关权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
在创建文件夹的地方主需要调用mkdir或mkdirs即可创建对应文件夹
File file = new File(dirPath);
if(!file.exists()) {
file.mkdirs();//多级目录
}
但是此方法在部分Android7.0手机上无效,运行程序后既无法创建对应的文件夹,程序也不会抛出异常。
2. 解决方式
直接设置方法
在手机设置->应用管理内找到对应app,在应用权限列表内,为应用开启“读取、写入或删除存储空间”权限。不同手机可能此权限设置位置不一样,但都是可设置的。
代码中检查
检查对应权限,若权限未开启则弹窗请求权限(例子中为检查和请求SDcard写权限和相机权限)
final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
public void checkPermission() {
if(Build.VERSION.SDK_INT >= 23) {
List<String> permissionStrs = new ArrayList<>();
int hasWriteSdcardPermission =
ContextCompat.checkSelfPermission(
WTMainActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(hasWriteSdcardPermission !=
PackageManager.PERMISSION_GRANTED) {
permissionStrs.add(
Manifest.permission.WRITE_EXTERNAL_STORAGE
);
}
int hasCameraPermission = ContextCompat.checkSelfPermission(
WTMainActivity.this,
Manifest.permission.CAMERA);
if(hasCameraPermission != PackageManager.PERMISSION_GRANTED) {
permissionStrs.add(Manifest.permission.CAMERA);
}
String[] stringArray = permissionStrs.toArray(new String[0]);
if (permissionStrs.size() > 0) {
requestPermissions(stringArray,
REQUEST_CODE_ASK_PERMISSIONS);
return;
}
}
}
//权限设置后的回调函数,判断相应设置,requestPermissions传入的参数为几个权限,则permissions和grantResults为对应权限和设置结果
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions, @NonNull int[] grantResults) {
switch(requestCode) {
case REQUEST_CODE_ASK_PERMISSIONS :
//可以遍历每个权限设置情况
if(grantResults[0]== PackageManager.PERMISSION_GRANTED) {
//这里写你需要相关权限的操作
}else{
Toast.makeText(MainActivity.this,
"权限没有开启",Toast.LENGTH_SHORT).show();
}
}
super.onRequestPermissionsResult(requestCode, permissions,
grantResults);
}