Android 文件未复制到 SD 卡

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 库。这是它的 link:https://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html

您提到的 destinationPath 可能无法访问,因为它可能属于私有系统文件夹或其他一些应用程序文件夹。但是,您可以使用 public 文件夹,例如图片、音乐、视频、下载等。或在其中创建子文件夹 -

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();
    }

However, when I check to see if the file has successfully been copied, the file is not even created in the sd Card.

在 Android 4.4+ 上,您没有对 removable storage 的任意文件系统级访问权限。

Is there a work around for this?

这取决于你的 objective 是什么。

如果您坚持必须能够在任意用户设备上写入该特定路径...那么,不,没有受支持的解决方法。毕竟,绝大多数 Android 设备上都没有 /storage/external_SD。设备制造商选择在何处以及如何安装可移动媒体取决于他们,并且实施细节会有所不同。

如果您放宽该限制,但坚持您必须能够将文件写入任意用户设备上的可移动存储的根目录...那么,不,目前没有受支持的解决方法。 N Developer Preview 有一个 "Scoped Directory Access" 功能,应该允许这样做,但是在你可以假设任意用户设备将是 运行 那个版本的 Android 或更高版本之前,还需要几年的时间。此外,您不会获得实际的文件系统访问权限,而是 Uri(请参阅下面的存储访问框架选项)。

现在,如果您对精确位置更灵活,您还有其他选择:

  • 您可以使用 getExternalFilesDirs()getExternalCacheDirs()getExternalMediaDirs()Context 上的所有方法。注意复数形式。如果那些 return 2+ 条目,第二个和后续条目是可移动存储上的位置,您可以读取和写入,不需要权限。但是,您无法选择确切的路径。如果设备有 2 个以上的可移动存储卷,我不太确定您将如何帮助用户区分它们。

  • 您可以使用存储访问框架,让用户选择文件的存放位置。欢迎用户选择可移动存储……或不选择。您会得到一个 Uri 返回,您可以将其与 ContentResolveropenOutputStream() 一起使用来编写您的内容。您还可以获取持久性 Uri 权限,这样您以后就可以再次使用该文件,前提是用户不会在您背后移动或删除它。

如果你想复制到外部存储,那么你需要

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />