java - Android:无法创建文件到外部公共(public)目录

标签 java android file storage

问题相当基本,但仍然让我抓狂:如何创建一个简单的文本文件到公共(public)可见的目录(例如下载文件夹)?我使用的 Android 使用 Android 版本 6.0.1,应用程序本身的最低 sdk 级别为 20。

我没有 SD 卡,但据我所知,术语“内部”和“外部”指的是目录的可见性和访问权限:如果只有应用程序看到该文件,则它是内部的。如果用户看到该文件,则该文件是外部文件。

首先,我在 AnrdoidManifext.xml 中拥有所需的使用权限标签,尽管我在此问题的上下文中不需要读取权限。

<?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 filefriend! 如果我在那里添加 mFile.createNewFile(),这会导致 IOException...

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

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

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

我还检查了 Environment.getExternalStoragePublicDirectory 通向的位置。其路径为/storage/0/emulated/Download

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

最佳答案

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

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

关于java - Android:无法创建文件到外部公共(public)目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40763964/

相关文章:

php - 使用 php 读取 .php 文件

java - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure

java - 禁用日历事件移动 - Vaadin

Java-未找到通用类型?

android - 以编程方式获取 PNG 或 BMP 格式的 Android 包图标

c - 从 C 中的二进制文件读取数组返回不正确的值

java - onListviewclick 不起作用

Android SQLite 应用程序崩溃

android - Kivy Android Scikit 学习

java - 从最后一行读取文件