android - 使用 Intent.ACTION_CREATE_DOCUMENT(存储访问框架)选择一个目录/文件

标签 android android-intent

如这里所解释的:

http://www.doubleencore.com/2014/03/android-external-storage/

或在这里:

http://www.androidpolice.com/2014/02/17/external-blues-google-has-brought-big-changes-to-sd-cards-in-kitkat-and-even-samsung-may-be-implementing-them/

KitKat 限制写入辅助外部存储 到特定于包的目录(尽管一些开发人员已经找到了解决方法...)。随着三星使用 SD 卡作为辅助外部存储并推出其 4.4.2 更新,这已成为许多应用程序的主要问题。

我的应用程序有一个另存为功能,允许用户选择一个任意目录来保存文件。 我正在使用 org.openintents.action.PICK_DIRECTORY、com.estrongs.action.PICK_DIRECTORY 或我的集成文件资源管理器等 Intents 来选择目录。用户当然也可以自由选择 SD 卡上的任何路径,但由于 KitKat 的新限制,如果目录是我的应用程序没有写入权限的目录,则实际存储操作将失败。

我需要一种替代方法来选择 KitKat 上的目录,以便用户在尝试保存到 sdcard 时不会收到错误消息。这可以通过让他们只选择应用程序具有写入权限的目录来实现。

我尝试像这样使用 Intent.ACTION_CREATE_DOCUMENT:

Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT)
                    .addCategory(Intent.CATEGORY_OPENABLE)
                    .setType(attachment.getContentType())
                    .putExtra(Intent.EXTRA_TITLE, attachment.getName());

startActivityForResult(intent, RequestCodes.MSG_CHOOSE_DIRECTORY);

这工作正常,我可以写入用户选择的文件,但我只能选择某些目录。例如。对于 pdf 文件,它将返回下载目录(匹配 Environment.DIRECTORY_DOWNLOADS),对于 jpg,它将允许我选择下载目录和 Google 驱动器。但是,它没有给我选择主要外部存储上的其他文件夹的选项,也没有给我选择 sdcard 上的包特定目录的选项(我尝试了不同的内容类型,如“*/*”或 DocumentsContract.Document.MIME_TYPE_DIR 但无济于事)。

所以我正在寻找的是一种让用户在主要外部文件系统上选择一个目录的方法(如 Environment.getExternalStorageDirectory() 返回的,实际上是内部存储)加上框架将要的所有目录让我访问辅助外部存储,以便在该目录中保存文件。无论用户选择目录还是文件都没有关系,应用程序将使用自己的文件名或用户选择的文件名。

或者了解某些应用程序如何找到绕过新写入限制的方法当然也是一个可行的选择;-)。 ES 文件资源管理器,例如可以将任何文件写入 sdcard 上的任何目录,我可以从我自己在带有 sdcard 的无根 S4 上的测试中确认。

最佳答案

你试过了吗MIME_TYPE_DIR

intent.setType(DocumentsContract.Document.MIME_TYPE_DIR);//For API 19+

编辑: Document Provider

关于android - 使用 Intent.ACTION_CREATE_DOCUMENT(存储访问框架)选择一个目录/文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22548994/

相关文章:

java - 从 assets 文件夹中读取 pdf 文件

android - 密封类在 Android 环境中的性能影响是什么?

java - 如何在不使用 Java 8 Stream 的情况下查找 Java 中两个 ArrayList<Integer> 之间的差异?

android - Intent 过滤器上的 ActivityMonitor ACTION_SENDTO 未命中

android - 重新启动应用程序以释放堆内存

android - 调用 startActivity 方法时的 returnActivity 事件

android - 使用 Button Click 将 TextField String 放入另一个类的 String 变量中

Android 主题/兼容性问题 : "No resource found that matches the given name"

java - Bitmap.createScaledBitmap 的更多内存优化版本?

android - 从url下载pdf,在flutter中保存到android中的手机本地存储