如何在 Android 10 中创建公共文件夹/文件

Posted

技术标签:

【中文标题】如何在 Android 10 中创建公共文件夹/文件【英文标题】:How to create a public folder/file in Android 10 【发布时间】:2020-02-09 06:16:22 【问题描述】:

android Api 29 在文件和文件夹方面有很大的变化。 到目前为止,我还没有找到一种方法来在内部存储中创建一个公开可见的文件夹。 我创建的每个文件夹只能由我的应用查看。

我编写了一个应用程序来创建数据文件,这些数据文件应被其他应用程序拾取,例如 Total Commander 将它们复制到目的地。 在我激活 Api 29 之前一切正常。我的一些客户确实使用像素手机,他们使用的是 Android 10。

如何在 Android 10 中创建公开的文件夹和文件?

这已被弃用:

Environment.getExternalStorageDirectory();
Environment.getExternalStoragePublicDirectory(type);

当我使用

File root = context.getExternalFilesDir(null);

创建的文件只能由我的应用程序看到。 如何实现在 Android 10 之前有效的行为?

提前致谢。

【问题讨论】:

使用 ACTION_OPEN_DOCUMENT_TREE 或 ACTION_OPEN_DOCUMENT。有了它们,您可以访问所有外部存储,包括内部和 microSD 卡。生活是美好的。 @blackapps 通过这两个操作,用户会看到一个打开的对话框?有没有办法在没有打开对话框 API 29 / 30 的情况下访问(读/写) 不,没有。使用这些操作调用用户。 【参考方案1】:

当我使用File root = context.getExternalFilesDir(null);时,创建的文件只能被我的应用看到

如果用户选择您放置在该目录中的文档,则任何使用存储访问框架(例如,ACTION_OPEN_DOCUMENT)的应用都可以看到它们。

我编写了一个应用程序,该应用程序创建了应由其他应用程序获取的数据文件

其他应用无法访问 Android 10 上的外部或可移动存储,除非在有限的目录中,如 getExternalFilesDir() 或通过非文件系统方式(ACTION_OPEN_DOCUMENTMediaStore)。

如何在 Android 10 中创建公开的文件夹和文件?

Context上使用getExternalFilesDir()和相关方法。或者,使用ACTION_CREATE_DOCUMENTACTION_OPEN_DOCUMENT_TREE 并使用存储访问框架。在任何一种情况下,生成的文档都可以被同样使用存储访问框架的其他应用程序使用。

【讨论】:

谢谢。我现在使用具有这些操作的系统 UI 创建了它。 @CommonsWare ,telgram / whatsapp 等应用程序如何在外部存储中创建文件夹? @Ashishsingh:他们可能正在使用android:requestLegacyExternalStorage = "true" @CommonsWare : 检查 Telegram 源代码,他们有 TargetSDKVersion = 28 而不是 android:requestLegacyExternalStorage = "true" @MindRoasterMir:嗯,ACTION_CREATE_DOCUMENT 显示了一个“对话”。如果您问是否可以避免 second 对话框,那么是的,应该可以。在ContentResolver 上使用takePersistableUriPermissions() 和从ACTION_CREATE_DOCUMENT 获得的Uri。 “第一次使用就下载pdf”——嗯,自己下载到getFilesDir(),剩下的问题你就不用担心了。【参考方案2】:

从Android 10开始,你应该使用SAF,并让用户使用ACTION_OPEN_DOCUMENT_TREE选择目录。

如果你需要一个简单的例子。你可以找到它here

或者,当您的应用不是新发布时,您可以在清单中使用 requestLegacyExternalStorage = true。但是,这不应该用于未来的版本,因为这是 Google 提供的短期解决方案。

注意:在未来的 Android 版本中,用户将无法选择整个外部文件目录和下载目录,因此很遗憾,请记住,我们也无法访问这些目录!更多信息可以点击here

【讨论】:

但如果我在 android 10 中使用 ACTION_OPEN_DOCUMENT_TREE,它会说“没有应用程序可以执行此操作”:/ 试试我提供的例子。那你应该明白了 我试过 API 29 和 30 。 requestLegacyExternalStorage = true 对我不起作用。使用 action_open_document_tree 你也可以使用 getContentResolver().takePersistableUriPermission(),谢谢 @MindRoasterMir 你能不能给一些代码,没有得到你的声明。谢谢

以上是关于如何在 Android 10 中创建公共文件夹/文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在公共方法中创建私有变量

如何在android中创建视频预览?

在 Amazon S3 中将在 aws3 存储桶中创建的文件夹设为公共或私有文件夹

如何在 Windows 窗体中创建 GDI 泄漏!

如何在 android 的 eclipse 中创建 plist 文件?

如何在 Android 中创建文件?