如何将文件写入外部SD卡而不是设备存储?

3
我尝试过这个方法:

  public String getFilename() {
    File file = new File(Environment.getExternalStorageDirectory(), "Test2");
    if (!file.exists()) {
        file.mkdirs();
    }
    String uriSting = (file.getAbsolutePath() + "/" + "IMG_" + System.currentTimeMillis() + ".png");
    return uriSting;
}

我将第二行改为了以下内容: ```` 我尝试将第二行改成: ````
File file = new File("sdcard/Test2");

但是目录仍然被创建在设备存储器上,而不是外部SD卡上。


你提供了这个权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 吗? - Shlomi Haver
@ShlomiHaver 是的,我做到了,否则我就无法在设备存储中编写。我记得在某个地方读到过,即使设备存储也是外部存储,它是外部于操作系统的。 - Bugs Buggy
1个回答

3

您无法随意访问可移动存储

在Android 4.4+上,您有两个主要选项:

  1. 使用Context的方法getExternalFilesDirs(), getExternalCacheDirs(),或者getExternalMediaDirs()(注意是复数形式)。如果它们返回2个以上的位置,则第二个及其后续位置是可移动存储器上用户应用程序可以读取和写入的位置,无需任何权限。

  2. 使用ACTION_OPEN_DOCUMENTACTION_CREATE_DOCUMENT,允许用户选择将某些内容放置在何处,其中用户可以选择可移动存储器(或Google Drive、DropBox、外部存储器或其他任何位置)。您最终会获得一个Uri,而不是文件系统路径,使用ContentResolver来处理该Uri以获取读取和写入的数据流。


我不能允许用户这样做,我需要创建一个特定的目录并获取它的URL。这不可能吗? - Bugs Buggy
@AseedUsmani:除非该目录位于上述选项#1中概述的根目录之一下,否则您无法创建特定目录。 - CommonsWare
最后一句话的意思是,我尝试的是不可能的吗?即使特定目录已经存在(比如用户自己创建了它或者第一次选择了它),我们的应用程序每次都不能使用它来保存文件? - Bugs Buggy
@AseedUsmani:“说用户自己创建了它,或者第一次选择了它”-这就是选项#2的用途(尽管由于您需要一个目录,所以应该是ACTION_OPEN_DOCUMENT_TREE,而且只有在Android 5.0+上才有)。但是,如果您让用户选择位置,“用户可以选择位置”,而且该选择不必涉及可移动存储。您之前表示“不能允许用户这样做”,但Android是一个消费者操作系统,旨在允许用户做他们想做的事情。 - CommonsWare
2
API 24 设备还支持“作用域目录访问”功能,允许您请求对 SD 卡的读写访问权限。请参阅 https://developer.android.com/preview/features/scoped-folder-access.html。 - ianhanniballake
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接