[英]Android File not being copied to SD card
我正在尝试将外部存储目录中的文件复制到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
但是,当我检查文件是否已成功复制时,该文件甚至没有在sd卡中创建。
您无法在Android 4.4+上对可移动存储进行任意文件系统级别的访问。
有没有解决的办法?
这取决于您的目标是什么。
如果您坚持必须在任意用户设备上写入该特定路径,那么,不,没有支持的解决方法。 毕竟,绝大多数Android设备上都没有/storage/external_SD
。 设备制造商选择在何处以及如何选择安装可移动介质,这取决于它们,并且实施细节将有所不同。
如果您放宽了该限制,但坚持要求您必须能够将文件写入任意用户设备上的可移动存储的根目录中,那么,不,今天没有受支持的解决方法。 N Developer Preview具有“作用域目录访问”功能,该功能应允许此功能,但是要假定任意用户设备将运行该版本的Android或更高版本还需要几年的时间。 另外,您没有获得实际的文件系统访问权限,而是获得了Uri
(请参阅下面的“存储访问框架”选项)。
现在,如果您对精确的位置更加灵活,则可以使用其他选择:
您可以使用Context
上的所有方法getExternalFilesDirs()
, getExternalCacheDirs()
和getExternalMediaDirs()
。 注意复数形式。 如果这些返回2+条目,则第二个及后续条目是可移动存储上的可读取和写入的位置,无需权限。 但是,您无法选择确切的路径。 而且,如果该设备具有2个以上的可移动存储卷,则我不确定您如何帮助用户区分它们。
您可以使用Storage Access Framework并让用户选择将文件放置在何处。 欢迎用户选择可移动存储...。 您将获得一个Uri
,可以将其与ContentResolver
和openOutputStream()
来编写内容。 您还可以获取持久的Uri
权限,以便将来假定用户不会将其移动或删除时再使用该文件。
您提到的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();
}
如果要复制到外部存储,则需要
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.