我的问题是,在某些设备上,在安卓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中的更改。谢谢
发布于 2020-04-14 20:15:21
好的,看起来documentFile.createFile
确实有效,但是它返回null。因此,只要创建一个具有目标路径的全新DocumentFile,似乎就能正常工作。
发布于 2021-02-23 15:39:48
如果某人遇到同样的问题,还会提供一些额外的信息:
上下文:和华为一样多的用户注意到,从EMUI 9升级到EMUI 10已经打破了许多应用程序依赖于SD卡的写访问权限。问题在于华为的已报告,华为把责任推到了谷歌身上,而且似乎没有采取任何进一步行动。受问题影响的应用程序总指挥官的开发人员找出表示:
在使用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
,那么我认为这是另一个问题。
https://stackoverflow.com/questions/59376609
复制相似问题