【问题标题】:Android File not being copied to SD cardAndroid 文件未复制到 SD 卡
【发布时间】:2016-03-14 19:08:08
【问题描述】:

我正在尝试将位于外部存储目录中的文件复制到我的 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

【问题讨论】:

  • 可以分享copyFile的代码吗?并执行 mkdirs() 这也将创建中间目录。
  • 您在 Android 4.4+ 上没有对removable storage 的任意文件系统级访问权限。
  • @dex,我编辑添加了一个链接。另外,我确实做了一个 mkdir。看看我的代码。
  • @CommonsWare - 我们又见面了。有解决办法吗?谢谢

标签: java android android-sdcard android-file android-external-storage


【解决方案1】:

但是,当我检查文件是否已成功复制时,该文件甚至没有在 sd 卡中创建。

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

有解决办法吗?

这取决于你的目标是什么。

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

如果您放宽该限制,但坚持您必须能够将文件写入任意用户设备上的可移动存储的根目录……那么,不,今天没有支持的解决方法。 N 开发者预览版具有“范围目录访问”功能,应该允许这样做,但是您还需要几年时间才能假设任意用户设备将运行该版本的 Android 或更高版本。此外,您不会获得实际的文件系统访问权限,而是获得Uri(请参阅下面的存储访问框架选项)。

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

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

  • 您可以使用存储访问框架并让用户选择放置文件的位置。欢迎用户选择可移动存储...或不选择。你会得到一个Uri 回复,你可以将它与ContentResolver 和openOutputStream() 一起使用来编写你的内容。您还可以获取持久的Uri 权限,以便将来再次使用该文件,前提是用户没有在您背后移动或删除它。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您提到的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();
          }
      

      【讨论】:

      • 是否甚至在外部 SD 中创建了“external_SD”文件夹?
      • 不,它没有被创建
      • 编辑了我的答案。请看一看。希望对您有所帮助。
      • Environment. DIRECTORY_DOWNLOADS有错误
      • 这是一个语法错误,我修复了它,但它仍然没有工作
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多