Java Can';在android10中创建目录
我无法在android 10中创建目录。在android Oreo之前,它一直在设备上工作 我尝试了两种创建文件夹的方法 使用Java Can';在android10中创建目录,java,android,Java,Android,我无法在android 10中创建目录。在android Oreo之前,它一直在设备上工作 我尝试了两种创建文件夹的方法 使用File.mkdir(): 在这里,变量success总是false,这意味着没有创建目录 使用文件。createDirectory(): 导致此异常的原因: pzy64.pastebinpro W/System.err: java.nio.file.AccessDeniedException: /storage/emulated/0/Pastebin pzy64.pas
File.mkdir()
:
在这里,变量success
总是false,这意味着没有创建目录
使用文件。createDirectory():
导致此异常的原因:
pzy64.pastebinpro W/System.err: java.nio.file.AccessDeniedException: /storage/emulated/0/Pastebin
pzy64.pastebinpro W/System.err: at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:391)
pzy64.pastebinpro W/System.err: at java.nio.file.Files.createDirectory(Files.java:674)
我已经实现了运行时权限和
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
都设置好了。正如2019年3月首次披露的那样,默认情况下,您不再能够访问Android 10+上的任意位置。这包括
Environment.getExternalStorageDirectory()
和Environment
上的其他方法(例如getExternalStoragePublicDirectory()
)
对于Android 10和11,您可以将Android:requestLegacyExternalStorage=“true”
添加到清单中的
元素中。这将使您进入传统存储模型,并且您现有的外部存储代码将正常工作
否则,您的选择是:
- 使用
上的方法,例如Context
,获取应用程序可以写入的外部存储上的目录。在Android 4.4+上使用这些目录不需要任何权限。但是,卸载应用程序时,存储在那里的数据将被删除getExternalFilesDir()
- 使用存储访问框架,例如
和ACTION\u OPEN\u DOCUMENT
ACTION\u CREATE\u DOCUMENT
- 如果您的内容是媒体,您可以使用
将媒体放置在标准媒体位置MediaStore
- 对于Android 10,您可以添加
android:requestLegacyExternalStorage=“true”
添加到清单中的元素。这将使您进入传统存储模型,并且您现有的外部存储代码将起作用。但此修复程序在Android R及更高版本上不起作用,因此这只是一个短期修复程序。自Q beta 4以来,可以通过以下方式选择退出该功能: 目标api 28(或更低) 使用requestLegacyExternalStorage清单属性:
<manifest ... >
<!-- This attribute is "false" by default on apps targeting Android Q. -->
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>
...
这对我很有用,我认为它在安卓10上很有用>
ContentResolver resolver=getContentResolver();
ContentValues ContentValues=新ContentValues();
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH,Environment.DIRECTORY_PICTURES+“/文件夹示例”);
String path=String.valueOf(resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues));
文件夹=新文件(路径);
布尔值isCreada=folder.exists();
如果(!isCreada){
folder.mkdirs();
}
仅限使用
android:requestLegacyExternalStorage="true"
在清单中,Android
API 30有更多的限制
您只能在应用程序特定的文件中写入
File dir_ = new File(context.getFilesDir(), "YOUR_DIR");
dir_.mkdirs();
或者在应用程序的外部存储中Android/data
File dir_ = new File(myContext.getExternalFilesDir("FolderName"),"YOUR_DIR");
更新
这个答案提供了另一个解决办法
更新
另一种方法是在manifest
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
就像这个答案一样你是说在Android Q上没有办法创建我自己的目录吗?@Xihuny:欢迎你创建getExternalFilesDir()的子目录
和上下文提供的类似位置。
不能使用文件系统API直接从外部或可移动存储的根创建子目录。我不想这样做,因为当用户卸载应用程序时,文件将被删除。@Xihuny:然后使用存储访问框架,允许用户选择打开的位置用户的设备您可以放置用户的内容。@Xihuny:您可以使用操作\u打开\u文档\u树
来允许用户选择文档树。从那里,使用文档文件.fromTreeUri()
来获取该文档树的文档文件
。然后您可以创建子文档(文档和树)在该树中,使用您想要的任何名称。它是否为“目录”取决于用户选择的基本文档树——不要求他们在文件系统上选择某个内容。您正在查询文件,因此必须添加android:requestLegacyExternalStorage=“true”
当目标是Android 10>时。在这种情况下,您最好继续使用getExternalStoragePublicDirectory(Environment.DIRECTORY\u PICTURES)
.getExternalStoragePublicDirectory在API级别29Yes中不推荐使用,并且?正如文档中所述,当应用程序以Build.VERSION\u CODES.Q为目标时,此方法返回的路径不再可直接访问
,因此如果您有android:requestLegacyExternalStorage=“true”
在您的清单中,您仍然可以使用它。首先,不是我投了反对票。要回答您的问题,您正在查询一个文件,这在Android 10>上是不允许的,除非您请求旧版存储。要正确执行此操作,您应该获取Uri
,如下所示Uri mUri=resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues)
然后直接使用该Uri
而不是将其传递给文件
对象。您不必创建文件夹。当您写入Uri
时,文件夹将自动创建。这仅适用于android版本上,文件
路径访问再次被允许。因此,安卓:requestLegacyExternalStorage=“true”
是为了确保它在安卓10上工作。除非你的targetSDK>=30,否则它在安卓11及以后仍能工作。它对我有效,谢谢安卓11的长期修复方案是什么?这很好,谢谢
File dir_ = new File(myContext.getExternalFilesDir("FolderName"),"YOUR_DIR");
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />