我的问题是,在某些设备上,在这种特殊情况下,在Android 10(存有华为p30 EMUI 10)上,我无法创建新的SD卡文件。 documentFile.createFile(...)
返回null,DocumentsContract.createDocument(...)
引发一个奇怪的异常,我在任何地方都找不到。如所附图片所示,它显示为“ java.lang.IllegalArgumentException: Requested path ... doesn't appear under ...
”。
两个函数都有适当的参数,例如mimetype和path。我自己没有设备,我正在和一个人通过电子邮件对其进行调试。在列出他的存储时,在任何地方都没有提及“ / mnt / media_rw”,SD卡分区似乎称为“ / storage / 0123-4567”。所有其他SD卡文件操作均有效,要求并正确处理了这些额外的SAF权限。该代码本身在绝大多数设备上都能正常工作,在我的Android 10上也是如此。我有目标,将SDK设置为28,构建工具为28.0.3。
有人遇到过这样的问题吗?任何想法如何解决?恐怕随着Android 10的发展以及制造商继续以不同的方式做事,这种情况会经常发生。更不用说SDK 29带来的更改了。谢谢
答案 0 :(得分:0)
好吧,因此看起来documentFile.createFile
实际上可以工作,但是它返回null。因此,仅创建具有目标路径的全新DocumentFile似乎可以正常工作。
答案 1 :(得分:0)
如果有人遇到同样的问题,请提供一些额外的信息:
背景:与许多华为用户have noticed一样,从 EMUI 9 到 EMUI 10 的更新已经破坏了许多依赖对 SD 卡进行写访问的应用程序。问题出在reported华为身上,华为将责任推给了谷歌,而且似乎没有采取任何进一步行动。受问题影响的应用 Total Commander 的开发者,found out 表示
<块引用>在搭载 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);
}
如果那时 file
仍然是 null
,那么我认为这是另一个问题。