繁体   English   中英

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

[英]Cannot create new file on Android 10 SD card

我的问题是,在某些设备上,在 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 的变化。谢谢

好吧,看起来documentFile.createFile确实有效,但它返回 null。 所以只用目标路径创建一个全新的 DocumentFile 似乎工作得很好。

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

背景:正如许多华为用户所注意到的,从 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);
}

如果那时file仍然为null ,那么我认为这是另一个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM