Android 使用';创建文件:';以名义

Android 使用';创建文件:';以名义,android,storage-access-framework,Android,Storage Access Framework,这将导致创建一个文件some_file.txt,因此本质上:被替换为。 我正在尝试创建一个名为some:file.txt的文件,可以通过手机上的文件应用程序手动创建: 很明显,:字符没有限制,而且,我以前的java.io.File API从来没有遇到过这个问题 我也试过了 public void onActivityResult(int requestCode, int resultCode, Intent resultData) { if (resultCode != Activit

这将导致创建一个文件
some_file.txt
,因此本质上
被替换为

我正在尝试创建一个名为
some:file.txt
的文件,可以通过手机上的文件应用程序手动创建:

很明显,
字符没有限制,而且,我以前的java.io.File API从来没有遇到过这个问题

我也试过了

public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
    if (resultCode != Activity.RESULT_OK)
        return;

    if (requestCode == CREATE_FILE && resultData != null) {
        Uri uri = resultData.getData();
        if (uri != null) {
            DocumentFile file = DocumentFile.fromTreeUri(getContext(), uri);
            try {
                DocumentFile newFile = file.createFile("text/plain", "some:file");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
并选择手动创建的
some:file.txt
,记录名称和uri,并使用“:`

Intent intent = new Intent(Intent.ACTION_GET_CONTENT)
        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        .addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
        .addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
        .addCategory(Intent.CATEGORY_OPENABLE)
        .setType("text/plain");
startActivityForResult(intent, OPEN_FILE);
编辑: 我能想到的一个解决方法是将所有文档保存到.zip存档中

我怎样才能避免呢


你不能。
createFile()
的第二个参数是“显示名称”,而不是文件名。文档提供程序对文件名的使用取决于文档提供程序。在您的情况下,它将用下划线替换一些特殊字符。

您在Windows和Linux上尝试过吗?正如我所说,可以通过文件应用程序以及旧的文件API手动创建此类文件。一定有办法so@Guiorgy:操作系统制造商和设备制造商可能可以。你和我都不能。随着即将到来的Android R,我正试图转移到SAF,但以这种速度,应用程序将为所有用户中断
Intent intent = new Intent(Intent.ACTION_GET_CONTENT)
        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        .addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
        .addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
        .addCategory(Intent.CATEGORY_OPENABLE)
        .setType("text/plain");
startActivityForResult(intent, OPEN_FILE);
Uri: content://com.android.externalstorage.documents/document/primary%3ATEST%3AS%2Fsome%3Afile.txt
File: some:file.txt