我无法在android 10中创建目录。直到android Oreo,它都可以在设备上使用。
我尝试了两种创建文件夹的方法。
使用 File.mkdir():
File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pastebin");
if (!f.isFile()) {
if (!(f.isDirectory())) {
success = f.mkdir();
}
Run Code Online (Sandbox Code Playgroud)
在此,变量success 始终为false,这表示未创建目录。
使用 Files.createDirectory():
File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pastebin");
if (!f.isFile()) {
if (!(f.isDirectory())) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
try {
Files.createDirectory(Paths.get(f.getAbsolutePath()));
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), R.string.unable_to_download, Toast.LENGTH_LONG).show();
}
} else {
f.mkdir();
}
}
Run Code Online (Sandbox Code Playgroud)
导致此异常:
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)
Run Code Online (Sandbox Code Playgroud)
我已经实现了运行时权限,
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)
都准备好了
小智 18
对于 Android 10,您可以添加
android:requestLegacyExternalStorage="true"
到清单中的元素。这将使您选择使用旧存储模型,并且您现有的外部存储代码将起作用。不过,此修复不适用于 Android R 及更高版本,因此这只是一个短期修复。
Wow*_* Ot 12
Android 的限制比较多API 30
你只能写在你的app-specific files
File dir_ = new File(context.getFilesDir(), "YOUR_DIR");
dir_.mkdirs();
Run Code Online (Sandbox Code Playgroud)
或在您的应用程序的外部存储中Android/data
File dir_ = new File(myContext.getExternalFilesDir("FolderName"),"YOUR_DIR");
Run Code Online (Sandbox Code Playgroud)
更新
这个答案提供了另一个解决方案/sf/answers/4602116221/
更新
另一种方法是授予此权限manifest
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)
正如2019年3月首次披露的那样,默认情况下,您不再有权访问外部存储或Android 10+上的可移动存储中的任意位置。这包括Environment.getExternalStorageDirectory()和的其他方法Environment(例如,getExternalStoragePublicDirectory()。
对于Android 10,您可以将其添加android:requestLegacyExternalStorage="true"到<application>清单中的元素。这使您可以选择旧式存储模型,并且现有的外部存储代码将起作用。不过,这不适用于Android R及更高版本,因此这只是短期修复。
您的选择是:
在上使用方法Context(例如getExternalFilesDir(),)访问应用可以写入的外部存储上的目录。您无需任何权限即可在Android 4.4+上使用这些目录。但是,卸载应用程序后,存储在其中的数据将被删除。
使用存储访问框架,例如ACTION_OPEN_DOCUMENT和ACTION_CREATE_DOCUMENT。
如果您的内容是媒体,则可以MediaStore用来将媒体放置在标准媒体位置。
这对我有用,我认为它可以在 Android 10 上运行>
ContentResolver resolver = getContentResolver();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/Folder Example");
String path = String.valueOf(resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues));
File folder = new File(path);
boolean isCreada = folder.exists();
if(!isCreada) {
folder.mkdirs();
}
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用公共目录在 Android 11 中保存文件,如下所示:
dir = new File(Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS).getPath()
+ "/foldername");
if (!dir.exists()) {
dir.mkdir();
Toast.makeText(getApplicationContext(), "not exist", Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
268 次 |
| 最近记录: |