我想让我的应用程序的用户选择保存到内部手机内存或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')。
答案 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
的正式方法。实例-除了可能在下一次更新后停止工作的骇客,或在未考虑的一台设备上。