2

我看到很多其他人问同样的问题,但发布的解决方案都没有帮助我。

我正在尝试从我的 Android 应用程序将(二进制)文件写入外部存储。我把<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />我的清单,但我仍然无法创建任何文件。我用来创建文件的代码是

File folder = new File(Environment.getExternalStorageDirectory(), SAVE_DIRECTORY);
File toWrite = new File(folder, "save.bin");
if(!toWrite.exists()){
    try {
        if(!folder.mkdirs())
            Log.e("Save", "Failed to create directories for save file!");
        toWrite.createNewFile();
     } catch (IOException e) {
         Log.e("Save", "Failed to create save file! " + e.getMessage());
     }
 }

调用mkdirs()失败,并createNewFile()抛出IOException(ENOENT,因为目录不存在)

有谁知道怎么回事?我什至尝试重新启动我的设备。如果有任何区别,我在 Nexus 7 上的 API 级别为 8。

4

3 回答 3

5

首先你应该检查 ExternalStorageState

public static boolean isSDCARDAvailable(){
   return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}

如果此方法isSDCARDAvailable返回true,则使用您的代码

添加权限:

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

于 2012-08-15T03:22:32.657 回答
2

文档说,从 API 级别 19 开始,WRITE_EXTERNAL_STORAGE 不需要读取/写入 getExternalFilesDir(String) 和 getExternalCacheDir() 返回的应用程序特定目录中的文件。但是,如果您不想在那里写入文件而是想将文件写入 getExternalStorageDirectory(),则在 API 23 或更高版本下,您必须在运行时使用 requestPermissions() 请求权限。一旦我这样做了,我就能够在 getExternalStorageDirectory() 中创建一个目录。

于 2017-01-01T18:13:50.007 回答
1

我也遇到了这个问题,并且我的应用程序中的所有内容都已正确配置,即我拥有外部存储的读写权限。

我的问题在于我创建存储文件的路径的方式:

private val LOG_BASE_PATH = Environment.getExternalStorageDirectory().path + "myFolder"

请注意,必须包含“/”,如下所示:

private val LOG_BASE_PATH = Environment.getExternalStorageDirectory().path + "/myFolder/"

没有这个,您将无法创建文件夹。Android 不会失败,因此您可能会认为您的手机配置或应用权限存在问题。

理想情况下,这可以帮助某人节省一些宝贵的时间。

于 2018-03-05T15:45:16.017 回答