【问题标题】:Android, Java, Create directory on SD card programmatically using Storage Access Framework (SAF)Android、Java、使用存储访问框架 (SAF) 以编程方式在 SD 卡上创建目录
【发布时间】:2020-11-25 12:14:28
【问题描述】:

我的问题是我无法在插入 Android 便携式设备的 SD 卡上创建目录。 下面是我要开始工作的 Java 代码:我正在尝试在 /storage/BF4F-1107/ 下创建目录 sable

public class AnActivity extends AppCompatActivity
{
private static final int N_CREATE_DIRECTORY = 1;

    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        // SD card
        String s_sdCardStorage = "/storage/BF4F-1107/";

        Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("file/*");
        intent.putExtra(Intent.EXTRA_TITLE, s_destFilePath);
        startActivityForResult(intent, N_CREATE_DIRECTORY);
        // HERE
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        if(requestCode == N_CREATE_DIRECTORY)
        {
            if(data != null)
            {
                Uri uri = data.getData();
                DocumentFile docFileSDCardStorage = DocumentFile.fromSingleUri(this, uri);

                try
                {
                    DocumentFile docFileDir = docFileSDCardStorage.createDirectory("sable");
                }
                catch(UnsupportedOperationException exn)
                {
                    System.out.println(exn.getMessage());
                }
            }
        }
    }
}

会发生什么:

  • onCreate() 中的代码被执行。
  • 然后程序块在// HERE
  • 在便携式设备上,出现一个显示/storage/BF4F-1107/ 的“对话框”和一个我“按下”的按钮Save
  • 一旦“按下”,onActivityResult() 中的代码就会被执行。

但是结果是/storage/BF4F-1107/下的目录sable没有创建。 并且执行路径通过 catch 子句,引发异常 UnsupportedOperationException 并在 System.out.println(exn.getMessage()); 处打印 null

编辑2:在/storage/BF4F-1107/下创建一个空文件_storage_BF4F-1107_

你能帮我完成这段代码吗?

此外,我希望以静默方式创建目录sable。 我不希望用户必须触摸“保存”。

我正在尝试使用 Storage Access Framework (https://developer.android.com/training/data-storage/shared/documents-files),因为当我尝试在 SD 上创建目录时,java.io.File 类的 mkdirs 方法不起作用(出现权限被拒绝异常)卡。

编辑:我的 Android 版本是 6.0.1

谢谢。

【问题讨论】:

  • 我编辑了我的帖子(编辑:和编辑 2:)。
  • N_CREATE_DIRECTORY 您的意图创建了一个带有 ACTION_CREATE_DOCUMENT 的文件。不是目录。您在代码中所做的是尝试在文件中创建目录。那是行不通的。
  • 请编辑您的帖子。删除旧的东西。只发一个问题。或者你让用户选择一个文件夹,或者你让用户创建一个文件。你的帖子现在很混乱。
  • 我所做的是将元文件保存在我想使用 SAF ACTION_CREATE_DOCUMENT 创建的目录中。这将创建目录(带有一个空文件,如 582020.txt)
  • @Angel_Koh 你的意思是在“/storage/BF4F-1107/sable/”中创建了一个文件“582020.txt”(例如),目录“sable”不存在在此操作之前,是否创建了目录“sable”和文件“582020.txt”?你能发布一点代码吗?您的目录是静默创建的吗?谢谢。

标签: java android directory filesystems


【解决方案1】:

使用 ACTION_OPEN_DOCUMENT_TREE 让用户选择 de SD 卡。

之后,您可以在所选目录中创建尽可能多的文件和目录。

如果您只想使用 SAF 创建一个文件,请使用 ACTION_CREATE_DOCUMENT,用户可以在其中选择位置和文件名。

【讨论】:

  • 嗨。谢谢你。我编辑了我的帖子。也许 SAF 不是用于在 SD 卡下创建目录的正确框架...
  • 这是要走的路,但你把它搞混了。所以请重新启动。
  • 我需要静默创建目录。可能吗?该目录是我的应用程序的“工作目录”。如果卸载应用程序,该目录将不会被删除。我的用户不会因疏忽而丢失数据。谢谢。
  • 你必须让用户选择一次。这就是它的意图。
  • > 该目录是我的应用程序的“工作目录”。这建议您应该使用Context#getExternalFilesDirsContext#getFilesDir。 > 如果卸载应用程序,该目录不会被删除。这真的取决于用户。看android:hasFragileUserData
猜你喜欢
  • 2016-08-20
  • 1970-01-01
  • 2014-05-07
  • 2015-09-28
  • 2016-10-12
  • 2016-08-01
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
相关资源
最近更新 更多