Android:如何“正确”创建公共可读文件?

时间:2014-01-25 20:37:09

标签: android file io permissions

我的应用必须创建可以从连接的PC轻松读取/写入/复制的文件。我已经阅读了我能找到的所有内容,并尝试了在线评论和Android文档推荐的所有内容,但我无法让它发挥作用。

我正在成功创建和写入文件。使用ADB的shell我可以看到文件在那里,但是从(例如)Windows我可以看到目录中的每个文件,除了我正在创建的文件。从(比如)Windows复制到Android设备的文件是公开可见的。但我的应用程序创建的文件 - 即使在完全相同的目录中 - 也不是。由于我知道文件存在但可见性是有选择性的,我认为这是一个权限问题。

挖掘更多,我发现Context.MODE_WORLD_READABLE和_WRITABLE但是“这个常量在API级别17中已被弃用”,所以这种方法显然不是可行的方法。我还在现有文件上尝试了File.setReadable和File.setWritable,但都失败并返回false。

是的,该应用具有“android.permission.WRITE_EXTERNAL_STORAGE”(或者它不会写入外部存储)。它可以创建文件,它们只是不公开可见。

我无法找到任何文件创建方法,除了File和Context之外,还有明确创建公共可访问文件的任何规定,如上所述。看起来多年来有多种方法可以做到这一点,但它们已被弃用,不起作用,或者我没有正确使用它们。

那么......在Android的外部存储中创建可公开访问的文件的正确和受支持的方式是什么?谢谢!

编辑:添加了代码。没什么好看的,只是目前概念证明的东西。同样,这可以在指定的目录中成功地在Android上创建文件......但是当通过USB连接时,这些文件对于外部设备是不可见的,“作为相机”或“作为媒体设备”。所有其他目录和文件对外部设备可见,而不是我的应用程序创建的那些。

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    filename = (Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/test.txt");

    try {
        writer = new FileWriter(filename); // use a FileWriter since we're using a String
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        writer.write(filename);
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        writer.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2 个答案:

答案 0 :(得分:0)

结帐getExternalFilesDir。使用它的一个例子:

File file = new File(getExternalFilesDir(null), "DemoFile.jpg");
OutputStream os = new FileOutputStream(file);
os.write(data);
...

答案 1 :(得分:0)

首先,Windows中未显示的文件可能是由MTP连接引起的。我反复体验过,当设备连接到PC时,我创建的文件只有在断开连接并重新连接设备后才能在Windows上看到。

其次,您可以使用File和OutputStream的组合轻松地在外部存储上创建文件:

File file = new File(Environment.getExternalStorageDirectory(), "test.txt");
FileOutputStream stream = new FileOutputStream(file);
//write data
stream.close