无法在Android 10 SD卡上创建新文件

无法在Android 10 SD卡上创建新文件,android,frameworks,storage,huawei-mobile-services,Android,Frameworks,Storage,Huawei Mobile Services,我的问题是,在一些设备上,尤其是Android 10上,我无法创建新的SD卡文件documentFile.createFile(…)返回null,DocumentsContract.createDocument(…)抛出一个我在任何地方都找不到的奇怪异常。它显示“java.lang.IllegalArgumentException:请求的路径…未显示在…”下,如所附图像所示 上述两个函数都有适当的参数,如mimetype和path。我自己没有这个设备,我正在通过电子邮件和一个人调试。在列出他的

我的问题是,在一些设备上,尤其是Android 10上,我无法创建新的SD卡文件
documentFile.createFile(…)
返回null,
DocumentsContract.createDocument(…)
抛出一个我在任何地方都找不到的奇怪异常。它显示“
java.lang.IllegalArgumentException:请求的路径…未显示在…
”下,如所附图像所示

上述两个函数都有适当的参数,如mimetype和path。我自己没有这个设备,我正在通过电子邮件和一个人调试。在列出他的存储时,没有提到“/mnt/media\u rw”,SD卡分区似乎被称为“/storage/0123-4567”。所有其他SD卡文件操作都有效,这些额外的SAF权限被请求并正确处理。代码本身在绝大多数设备上运行良好,在我的Android 10上也是如此。我将目标、编译SDK设置为28,构建工具设置为28.0.3


有没有人遇到过这样的问题?有什么办法可以解决吗?我担心,随着安卓10的发展和制造商继续采取不同的做法,这种情况会越来越频繁。不要谈论来自SDK 29的更改。谢谢

好的,它看起来像是
documentFile.createFile
实际上可以工作,但它返回null。因此,只需使用目标路径创建一个全新的DocumentFile就可以了。

好的,看起来像是
DocumentFile.createFile实际上可以工作,但它返回null。因此,只需使用目标路径创建一个全新的文档文件似乎就可以了。

如果有人遇到同样的问题,请提供一些附加信息:

上下文:与许多华为用户一样,从EMUI 9到EMUI 10的更新打破了许多依赖SD卡写访问的应用程序。问题出在华为身上,华为将责任推到了谷歌身上,似乎没有采取任何进一步行动。受此问题影响的应用程序Total Commander的开发人员表示

在配备Android 10的华为设备上,DocumentsContract.createDocument成功创建了该文件,但随后导致异常

并怀疑

显然,华为硬编码了一些应该允许用户创建文件的路径,但犯了一个错误

解决方案:问题的作者已经发现,即使调用
createFile()
返回
null
,文件也已正确创建。您可以使用
findFile()
获取它,例如:

// treeUri comes from the file picker
DocumentFile directory = DocumentFile.fromTreeUri(context, treeUri);
DocumentFile file = docFile.createFile(mimeType, filename);

if (file == null) {
    file = docFile.findFile(filename + "." + mimeTypeExtension);
}

如果此时
文件
仍然是
空的
,那么我认为这是另一个问题。

如果有人遇到同样的问题,请提供一些附加信息:

上下文:与许多华为用户一样,从EMUI 9到EMUI 10的更新打破了许多依赖SD卡写访问的应用程序。问题出在华为身上,华为将责任推到了谷歌身上,似乎没有采取任何进一步行动。受此问题影响的应用程序Total Commander的开发人员表示

在配备Android 10的华为设备上,DocumentsContract.createDocument成功创建了该文件,但随后导致异常

并怀疑

显然,华为硬编码了一些应该允许用户创建文件的路径,但犯了一个错误

解决方案:问题的作者已经发现,即使调用
createFile()
返回
null
,文件也已正确创建。您可以使用
findFile()
获取它,例如:

// treeUri comes from the file picker
DocumentFile directory = DocumentFile.fromTreeUri(context, treeUri);
DocumentFile file = docFile.createFile(mimeType, filename);

if (file == null) {
    file = docFile.findFile(filename + "." + mimeTypeExtension);
}

如果此时
文件
仍然是
空的
,那么我认为这是另一个问题。

你能分享你正在使用的代码吗?你也试过使用规范路径吗?很有趣。请显示完整的可复制代码,否则我们必须猜测您在做什么。
在列出他的存储时….
您可以开始告诉您如何列出它们。
SD卡分区似乎被称为“/storage/0123-4567”
Hmmmm。。。。这确实是可移动媒体上经典文件路径的一个例子。但是在安卓Q下没用。那么你到底在做什么?你能分享你正在使用的代码吗?你也试过使用规范路径吗?很有趣。请显示完整的可复制代码,否则我们必须猜测您在做什么。
在列出他的存储时….
您可以开始告诉您如何列出它们。
SD卡分区似乎被称为“/storage/0123-4567”
Hmmmm。。。。这确实是可移动媒体上经典文件路径的一个例子。但是在安卓Q下没用。那么你到底在做什么?