Android 读写文件已授权但是无法在系统储存目录下执行文件操作处理
问题描述
在进行Android原生开发时遇到一个问题:在AndroidMainfest.xml里已经声明了文件读写操作权限并且也在代码内部动态申请获取文件读写操作权限,但是依然无法在系统储存目录下进行文件创建、读写操作。
- 无法进行文件创建操作:
fileStorageDir.exists() ===> 得到false // 文件不存在, 创建文件失败
fileStorageDir.mkdirs() ===> 得到false // 创建文件夹失败 - 无法进行文件读写
在已有的文件夹下,进行文件创建、读写操作报错: java.io.IOException: Permission denied
文件操作代码
public static boolean checkFilePath(Context ctx) {
// 已授权
// 权限是否已经 授权 GRANTED---授权 DINIED---拒绝
if (ContextCompat.checkSelfPermission(ctx, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
// 文件路径不存在
File fileStorageDir = new File(getStoragepath(ctx));
if (filePath.equals("")) {
// boolean canDo = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); // 外部存储是否可用
if (!fileStorageDir.exists()) {
// 文件不存在
if (fileStorageDir.mkdirs()) {
// 创建文件夹
filePath = fileStorageDir.getPath() + File.separator + "fileName.txt";
Log.d("DataFileUtil", "文件地址:" + filePath);
return true;
} else {
Log.d("DataFileUtil", "checkFilePath: 创建文件夹失败");
filePath = "";
return false;
}
} else {
filePath = fileStorageDir.getPath() + File.separator + "fileName.txt";
return true;
}
} else {
filePath = fileStorageDir.getPath() + File.separator + "fileName.txt";
Log.d("DataFileUtil", "文件地址:" + filePath);
return true;
}
} else {
// 未授权
Log.d("DataFileUtil", "checkFilePath: 文件操作未授权");
filePath = "";
return false;
}
}
文件操作基本配置:
<!-- 允许程序向外部存储设备读数据 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 允许程序向外部存储设备写数据 -->
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_LOGS" />
<!-- 文件系统权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
动态获取文件操作权限
public void checkPermissions() {
String[] permissions = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS};
if (Build.VERSION.SDK_INT >= 23) {
for (int i = 0; i < permissions.length; i++) {
int check = ContextCompat.checkSelfPermission(this, permissions[i]);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
问题分析
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
外部储存可用- 在已有的文件夹下,进行文件创建、读写操作报错:没有权限 ==>
在系统储存目录下执行文件操作
权限不足 - 将
在系统储存目录下执行文件操作
换成在APP文件目录下执行文件操作
⇒ 可以操作 ==> 权限不足
综上:操作系统储存目录需要除普通的文件读写操作权限外,还需要配置
系统目录下文件操作配置
在AndroidMainfest.xml
的application 下新增配置
android:requestLegacyExternalStorage="true"
解决问题