【问题标题】:Android: Cannot create file to external public directoryAndroid:无法将文件创建到外部公共目录
【发布时间】:2016-11-23 11:59:24
【问题描述】:

问题是相当基本的,但它仍然让我发疯:我怎样才能创建一个简单的文本文件到一个公开可见的目录,比如下载文件夹?我正在使用的 android 使用 android 版本 6.0.1,并且应用程序本身具有最低 sdk 级别 20。

我没有 sdcard,但据我所知,内部和外部这两个术语指的是目录的可见性和访问权限:如果只有应用程序可以看到文件,它就是内部的。如果用户看到该文件,它是外部的。

首先,我在 AnrdoidManifext.xml 中有所需的 uses-permission 标签,尽管在这个问题的上下文中我不需要读取权限。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mylittleapp">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <application>
        <!-- Not relevant... right? -->
    </application>
</manifest>

然后是代码本身。您可以从调试日志中看出我对此感到有些沮丧。

public class LogFileWriter {


    File mFile;
    FileOutputStream mStream;


    LogFileWriter(String filename) {
        // Check if storage is available
        String state = Environment.getExternalStorageState();
        if (!Environment.MEDIA_MOUNTED.equals(state)) {
            Log.d("LogFileWriter", "I'm not your state buddy!");
            return;
        }
        File target = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

        if (!target.exists() && !target.mkdir()) {
            Log.d("LogFileWriter", "I'm not your folder guy!");
            return
        }
        mFile = new File(target, filename);
        try {
            if (!mFile.exists())
                Log.d("LogFileWriter", "I'm not your file friend!");
            else {
                mStream = new FileOutputStream(mFile);
            }
        } catch (FileNotFoundException e) {
            Log.d("LogFileWriter", "Exceptional!");
        }
    }

这里,程序在!mFile.exist() 检查失败并打印I'm not your file friend! 如果我要在那里添加mFile.createNewFile(),那将导致 IOException...

java.io.IOException: open failed: EACCES (Permission denied)

尽管程序应该有权访问公共目录!

我也尝试将文件写入Context.getExternalFilesDir() directry,但结果相同:我仍然没有写入权限。

我还检查了Environment.getExternalStoragePublicDirectory 指向的位置。它的路径是/storage/0/emulated/Download。

如何获得对外部存储的写权限?有什么想法吗?

【问题讨论】:

  • 你试用的是哪个版本的Android,Android 6.0+以上必须在运行时提供权限
  • 6.0.1,所以这可能是问题所在。我得去看看。
  • 你必须设置运行时权限@TukeV
  • if (!mFile.exists()) Log.d("LogFileWriter", "I'm not your file friend!"); else { mStream = new FileOutputStream(mFile);。 ???您应该始终打开 FileOutputStream,尤其是当文件不存在时。

标签: java android file storage


【解决方案1】:

正如@SaravInfern 和其他人指出的那样,问题在于在最新版本的 android 中,我还必须在运行时请求写入权限。谢谢各位!

https://developer.android.com/training/permissions/requesting.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多