Android 9 无法在 Android 外部公共路径(“storage/emulated/0/MyImages”)中创建目录

问题描述 投票:0回答:2

我想在 Android 外部公共路径中创建一个目录(

"storage/emulated/0/MyImages"
)。

代码在Android 9上运行。授予所有写入外部存储的运行时权限。

试过这样的代码。

File dir = new File(Environment.getExternalStorageDirectory() + File.separator + "MyImages");
if (!dir.exists) {
  dir.mkdirs();
}

dir
变量的路径为 -
"/storage/emulated/0/MyImages"

dir.mkdirs()
总是返回
false
。有来自 LogCat 的简短日志:

W/System.err: java.io.IOException: No such file or directory
W/System.err: at java.io.UnixFileSystem.createFileExclusively0(Native Method)
W/System.err: at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:281)
W/System.err: at java.io.File.createNewFile(File.java:1008)
java android android-9.0-pie
2个回答
2
投票

首先,检查权限如果是然后调用你的函数调用 showPhoneStatePermission

在清单中添加权限

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

private void showPhoneStatePermission() {
    int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            showExplanation("Permission Needed", "Rationale", Manifest.permission.WRITE_EXTERNAL_STORAGE, REQUEST_PERMISSION_WRITE_EXTERNAL_STORAGE);
        } else {
            requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, REQUEST_PERMISSION_WRITE_EXTERNAL_STORAGE);
        }
    } else {
        Toast.makeText(MainActivity.this, "Permission (already) Granted!", Toast.LENGTH_SHORT).show();
    }
}

0
投票

不能在外部存储目录(/sdcard)中创建名称中包含大写字符的目录!?? (如果你解决了其他问题,比如你正在使用的任何版本的 Android 的权限......)似乎你不能有大写字符(至少在 android-32 中)。

'dir.mkdir()' in .../Android/Sdk/sources/android-32/java.io.File.java 最终调用'fs.createDirecty(this)',其中FileSystem fs = DefaultFileSystem.getFileSystem() ;其中 fs 是类 UnixFileSystem fs.createDirectory 调用的实例 'createDirectory0,这是一个本机方法。那里的东西似乎不喜欢用大写字符创建目录。

它可以在 /storage/emulated/0/ 中的目录中创建带有大写字母的目录,但在 /storage/emulated/0 本身中。我不明白他们为什么要那样做——除非它知道 /storage/emulated/0 中的东西是:1) 必须是小写的 java“包”名称的开头或 2:强制第一级Windows(忽略大小写)和 Linux(尊重大小写)之间“兼容”的目录。

请注意,在 shell 中或从 adb 运行的“mkdir”命令可以在 /sdcard (/storage/emulated/0) 中创建包含大写字符的目录

© www.soinside.com 2019 - 2024. All rights reserved.