写入SD卡Android

时间:2017-05-05 16:00:03

标签: android file ioexception android-external-storage

我想让我的应用程序的用户选择保存到内部手机内存或SD卡。如果我从用户的选择中创建File,则URI(没有文件名)类似于:

内部:内容:/com.android.externalstorage.documents/tree/primary%3A

SD:content:/com.android.externalstorage.documents/tree/760E-F734%3A

但是,如果我尝试使用以下代码将文件写入这些目录,则会收到错误java.io.IOException: No such file or directory

File writePath = new File("content:/com.android.externalstorage.documents/tree/primary%3A")

File file = new File(writePath, fileName);

try {
    file.createNewFile();
} catch (IOException e) {
    Log.e("saveSurvey", "Failed to create file!" + e.getMessage());
    return false;
}

所以文件会写在这样的地方:

内容:/com.android.externalstorage.documents/tree/primary%3A/ [我的文件名]

我已在清单中声明了WRITE_EXTERNAL_STORAGE权限,因此我猜这不是权限问题,而是更多的无效路径问题。

如果这些不是有效的文件路径,我将如何写入SD卡?使用Environment.getExternalStorageDirectory()始终写入设备的内部存储('/ storage / emulated / 0')。

3 个答案:

答案 0 :(得分:0)

请检查您的文件路径。 调用getAbsolutePath()函数并检查writePath

File writePath = new File("content:/com.android.externalstorage.documents/tree/primary%3A")
if(writePath.exists() && writePath.isDirectory()) {
    //File extensions can be declared 
       File file = new File(writePath.getAbsolutePath(), fileName+ extensions);
}

答案 1 :(得分:0)

您收到此错误是因为不同设备的路径不同。

尝试将Environment.getExternalStorageDirectory()用作writePath

请记住,在Android 6及更高版本中,您必须在运行时请求权限

答案 2 :(得分:0)

File仅适用于文件系统路径或file:// URI,并且您在此处拥有content:// URI。 (此外,要通过URI创建文件,您可以将其作为Uri而不是字符串进行传递。)

DocumentFile可能对您有用,这取决于您要对文件进行的处理。它旨在提供类似于File的接口,但围绕Storage Access Framework构建。您可以获取以这种方式创建的文件的输入和输出流,并执行一些基本的文件操作。

一件令人痛苦的事情是涉及标准Java库的任何事物都需要一个File参数,因为没有从content:// URI到实际File的正式方法。实例-除了可能在下一次更新后停止工作的骇客,或在未考虑的一台设备上。