如何在 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_DOCUMENT
、MediaStore
)。
如何在 Android 10 中创建公开的文件夹和文件?
在Context
上使用getExternalFilesDir()
和相关方法。或者,使用ACTION_CREATE_DOCUMENT
或ACTION_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 中创建公共文件夹/文件的主要内容,如果未能解决你的问题,请参考以下文章
在 Amazon S3 中将在 aws3 存储桶中创建的文件夹设为公共或私有文件夹