在Android中尝试将文件写入SD卡时出现FileNotFoundException(权限被拒绝)

24

根据标题可以看出,我在Android设备上写入sd卡文件时遇到了问题。我查看了 这个问题 ,但它没有帮助我。我想要写入一个公共空间的文件,以便任何其他应用程序都能够读取。

首先,我检查sd卡是否已挂载:

Environment.getExternalStorageState();

然后,我运行了这段代码:

File baseDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    baseDir.mkdirs();
    File file = new File(baseDir, "file.txt");
    try {
        FileOutputStream out = new FileOutputStream(file);
        out.flush();
        out.close();
        Log.d("NEWFILE", file.getAbsolutePath());
    } catch (IOException e) {
        e.printStackTrace();
    }

我有:

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

<application>
...
</application>
</manifest>

在我的AndroidManifest.xml中。

确切的错误是这样的:

java.io.FileNotFoundException: /storage/1510-2908/Download/secondFile.txt: open failed: EACCES (Permission denied)

我正在模拟器上测试我的代码(模拟Nexus5 API 23)。我的最低SDK版本为19(4.4 Kitkat)。


此外,使用相同的代码将文件写入sdcard上的私有文件夹也可以正常工作,因此我认为前面的代码也应该可以:

File newFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "esrxdtcfvzguhbjnk.txt");
    newFile.getParentFile().mkdirs();
    try {
        FileOutputStream out = new FileOutputStream(newFile);
        out.flush();
        out.close();
        Log.d("NEWFILE", newFile.getAbsolutePath());
    } catch (IOException e) {
        e.printStackTrace();
    }

有人知道问题出在哪吗?是不是KitKat 4.4不再允许在sd卡中的公共空间写入了?


Log.d("NEWFILE", file.getAbsolutePath()); 中你得到了什么值? - M D
2
https://dev59.com/DmAg5IYBdhLWcg3wfrEn - Deepanker Chaudhary
1
@Drag0,你还需要在运行时请求“WRITE_EXTERNAL_STORAGE”权限,因为你正在测试“Nexus5 API 23”。 - Dhaval Patel
1
我猜这是由于Android M中的权限处理。正如Deepanker的链接所述,在访问Android M中的存储之前,您必须添加对权限的请求。 - Rich
1
@Drag0 请查看以下链接以获取更详细的信息:此链接此链接 - Dhaval Patel
1个回答

30
  1. 将文件写入sdcard上的私有文件夹时一切正常

从Android 4.4开始,如果您只读取或写入应用程序私有的文件,则不需要这些权限。有关更多信息,请参见保存app-private文件

  1. 在Android中尝试将文件写入sdcard时出现FileNotFoundException(权限被拒绝)

由于您正在尝试在具有API 23(Marshmallow)的模拟器中编写文件,因此您还需要在运行时请求WRITE_EXTERNAL_STORAGE权限。请查看此文档此文档以获取更多详细信息。


1
这个可以工作,但只有在我第二次启动应用程序时才有效。如果我尝试在onRequestPermissionsResult()回调中立即打开文件,那么我会收到与之前相同的错误。难道权限还没有传播到系统吗?这似乎很奇怪。 - Drag0
@Drag0 当用户允许权限时,您的应用程序将被授予权限。 - Dhaval Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接