背景 在Android 4.4 (KitKat)上,Google已经对SD卡进行了相当的限制。 从Android Lollipop(5.0)开始,开发人员可以使用一个新的API,要求用户确认是否允许访问特定的文件夹,就像写在这个Google-Groups文章中一样 。 问题 这篇文章指导你访问两个网站: https://android.googlesource.com/platform/development/+/android-5.0.0_r2/samples/Vault/src/com/example/android/vault/VaultProvider.java#258 这看起来像是一个内部的例子(可能稍后会在API演示中显示),但是很难理解正在发生的事情。 http://developer.android.com/reference/android/support/v4/provider/DocumentFile.html 这是新的API的官方文档,但它没有告诉足够的细节如何使用它。 以下是它告诉你的: 如果您确实需要完全访问文档的整个子树,请启动ACTION_OPEN_DOCUMENT_TREE以让用户select一个目录。 然后将得到的getData()传入fromTreeUri(Context,Uri)开始使用用户select的树。 在浏览DocumentFile实例的树时,可以始终使用getUri()来获取表示该对象的基础文档的Uri,以用于openInputStream(Uri)等。 为了简化运行KITKAT或更早版本的设备上的代码,可以使用fromFile(File)来模拟DocumentsProvider的行为。 问题 我有一些关于新API的问题: 你怎么用它? 根据这篇文章,操作系统会记住应用程序被授予访问文件/文件夹的权限。 你如何检查你是否可以访问文件/文件夹? 有没有一个函数返回我可以访问的文件/文件夹的列表? 你如何处理Kitkat上的这个问题? 它是支持库的一部分吗? 操作系统上是否有设置屏幕,显示哪些应用程序可以访问哪些文件/文件夹? 如果在同一台设备上为多个用户安装应用程序会发生什么情况? 有没有关于这个新API的其他文档/教程? 权限可以被撤销吗? 如果是这样,是否有意向被发送到应用程序? 会要求权限工作recursion在选定的文件夹? 使用权限还允许给用户一个由用户select多重select的机会吗? 还是应用程序需要明确告诉意图哪些文件/文件夹允许? 有没有在模拟器上尝试新API的方法? 我的意思是,它有SD卡分区,但它作为主要的外部存储,所以所有的访问权限已经给(使用一个简单的权限)。 当用户用另一个replaceSD卡时会发生什么?