📜  android 11 mkdir 不工作 (1)

📅  最后修改于: 2023-12-03 15:13:19.975000             🧑  作者: Mango

Android 11中mkdir()方法不工作

在 Android 11 中,应用程序在 /sdcard//storage/ 目录下无法创建文件夹,这是由于 Android 11 引入了新的存储权限模型以提高用户数据的安全性。

什么是新的存储权限模型?

在 Android 11 中,存储权限分为两个级别:

  • 外部存储空间权限
  • 其他存储媒体的权限如照片、音频和视频

外部存储空间权限是应用程序在访问公共存储空间中的文件时必须拥有的权限。应用程序可以通过添加以下权限请求到 AndroidManifest.xml 文件中来请求该权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

然而,即使应用程序有权访问外部存储空间,它也无法直接在 /sdcard//storage/ 目录下创建文件夹。

如何解决这个问题?

应用程序需要适应新的存储权限模型,因此必须要使用 MediaStore API 或 Storage Access Framework (SAF) 来创建、读取和写入公共存储空间中的文件。

使用 MediaStore API

使用 MediaStore API,可以通过以下代码在公共存储空间中创建一个文件夹:

ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_MUSIC + "/MyFolder");
Uri uri = getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values);

其中,Environment.DIRECTORY_MUSIC 是子目录路径。更多的子目录路径可以在 Environment 中找到。

使用 Storage Access Framework (SAF)

使用 Storage Access Framework,可以通过以下代码创建一个文件夹:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE_CREATE_DOCUMENT);

在相应的 onActivityResult() 方法中,可以执行以下代码以创建文件夹:

if (requestCode == REQUEST_CODE_CREATE_DOCUMENT && resultCode == RESULT_OK) {
    Uri treeUri = data.getData();
    DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
    // 创造文件夹
    DocumentFile newDir = pickedDir.createDirectory("MyFolder");
}
结论

在 Android 11 中,应用程序不能在 /sdcard//storage/ 目录下创建文件夹。相反,应该使用 MediaStore API 或 Storage Access Framework 来创建、读取和写入公共存储空间中的文件。