我尝试将位于外部存储目录中的文件复制到SD卡中的目录中。但是,当我检查文件是否已成功复制时,甚至不会在SD卡中创建该文件。
我错过了什么吗?这是我的代码:
String sourcePath = Environment.getExternalStorageDirectory().getPath() + newFileName;
File source = new File(Environment.getExternalStorageDirectory().getPath(), newFileName);
String destinationPath = "/storage/external_SD";
File destination = new File(destinationPath, newFileName);
try {
if(!destination.exists()){
destination.mkdir();
}
FileUtils.copyFile(source, destination);
} catch (IOException e) {
e.printStackTrace();
}
copyFile
方法来自Apache库。以下是它的链接:https://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html
答案 0 :(得分:2)
但是,当我检查文件是否已成功复制时,甚至不会在SD卡中创建该文件。
您在Android 4.4 +上没有removable storage的任意文件系统级访问权限。
有解决方法吗?
这取决于你的目标是什么。
如果您坚持必须能够在任意用户设备上写入该特定路径...那么,不,没有支持的解决方法。毕竟,绝大多数Android设备都没有/storage/external_SD
。设备制造商选择安装可移动媒体的位置和方式取决于他们,并且是一个不同的实施细节。
如果你放宽了这个限制,但坚持你必须能够在任意用户设备上将文件写入可移动存储的根目录......那么,不,今天没有支持的解决方法。 N Developer Preview有一个“Scoped Directory Access”功能,应该允许这样做,但是你可以假设任意用户设备将运行那个版本的Android或更高版本。此外,您无法获得实际的文件系统访问权限,而是Uri
(请参阅下面的存储访问框架选项)。
现在,如果您对精确位置更加灵活,您还有其他选择:
您可以getExternalFilesDirs()
上的所有方法使用getExternalCacheDirs()
,getExternalMediaDirs()
和Context
。请注意复数形式。如果这些条目返回2+条目,则第二个和后续条目是可移动存储上可以读取和写入的位置,无需权限。但是,您无法选择确切的路径。如果设备有2个以上的可移动存储卷,我不太确定如何帮助用户区分它们。
您可以使用存储访问框架,让用户选择放置文件的位置。欢迎用户选择可移动存储......或不。您会收到Uri
后退,可以使用ContentResolver
和openOutputStream()
来撰写您的内容。您还可以获取可持久的Uri
权限,以便将来可以再次使用该文件,前提是用户不会在后面移动或删除它。
答案 1 :(得分:1)
您提到的destinationPath
可能无法访问,因为它可能属于私人系统文件夹或其他一些应用程序文件夹。但是,您可以使用图片,音乐,视频,下载等公共文件夹。或在其中创建子文件夹 -
String sourcePath = Environment.getExternalStorageDirectory().getPath() + newFileName;
File source = new File(Environment.getExternalStorageDirectory().getPath(), newFileName);
File destinationPath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS, "/external_SD");
try {
if(!destinationPath.exists()){
destinationPath.mkdir();
}
File destination = new File(destinationPath, newFileName);
FileUtils.copyFile(source, destination);
} catch (IOException e) {
e.printStackTrace();
}
答案 2 :(得分:1)
如果要复制到外部存储,则需要
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />