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

Posted

技术标签:

【中文标题】尝试在 Android 中将文件写入 sdcard 时出现 FileNotFoundException(权限被拒绝)【英文标题】:FileNotFoundException (permission denied) when trying to write file to sdcard in Android 【发布时间】:2016-05-19 00:58:04 【问题描述】:

从标题中可以看出,我在 android 中将文件写入 sdcard 时遇到问题。我检查了this question,但对我没有帮助。我想在 sdcard 上写入公共空间中的文件,以便任何其他应用程序都可以读取它。

首先,我检查 sdcard 是否挂载:

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 不再允许写入 sdcard 中的公共空间?

【问题讨论】:

你在Log.d("NEWFILE", file.getAbsolutePath());得到的价值是多少? ***.com/questions/23527767/… @Drag0 您还需要在运行时请求WRITE_EXTERNAL_STORAGE 权限,因为您正在测试它“Nexus5 API 23”。 我猜是因为android m中的权限处理。如deepanker的链接所述,您必须添加权限请求,才能访问android m中的存储。 @Drag0 检查this 和this 了解更多详情。 【参考方案1】:
    将文件写入 sdcard 上的私人文件夹一切正常

从 Android 4.4 开始,如果您是 仅读取或写入您的应用程序私有的文件。欲了解更多信息,请参阅saving files that are app-private.

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

当您尝试在具有 API 23(Marshmallow) 的模拟器中写入文件时,您还需要在运行时请求 WRITE_EXTERNAL_STORAGE 权限。查看this 和this 了解更多详情。

【讨论】:

这可行,但只是我第二次启动我的应用程序。如果我在用户时尝试在 onRequestPermissionsResult() 回调中打开文件,那么我会收到与以前相同的错误。难道权限还没有传播到系统?这看起来很奇怪。 @Drag0 权限被授予您的应用程序,同时用户允许该权限。 @Drag0 看看Can't write to external storage unless app is restarted after granting permission 和Android 6.0 needs restart after granting user permission at runtime SO 帖子。他们报告了和你一样的问题。 谢谢,Android 目前似乎有问题,这里报告了这个错误:code.google.com/p/android-developer-preview/issues/…

以上是关于尝试在 Android 中将文件写入 sdcard 时出现 FileNotFoundException(权限被拒绝)的主要内容,如果未能解决你的问题,请参考以下文章

java.io.FileNotFoundException (Permission denied) 尝试写入 Android sdcard 时

ANDROID - 在 sdcard 中创建文件夹和文本文件并将其写入

权限被拒绝,同时在 Android SDcard 中写入图像文件

在Android中将文件写入外部存储失败

在 Android 的外部存储中写入文件

android: 在sdcard上创建的文件在 windows电脑上不显示的问题