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

时间:2014-03-21 02:20:56

标签: 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或我的集成文件资源管理器这样的Intent来选择一个目录。用户当然可以自由选择SD卡上的任何路径,但由于KitKat的新限制,如果目录是我的应用程序没有写访问权限,实际的存储操作将失败。

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

我尝试使用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文件资源管理器可以将任何文件写入SD卡上的任何目录,因为我可以通过我自己的测试在带有sdcard的无根S4上进行确认。

3 个答案:

答案 0 :(得分:1)

您是否尝试过MIME_TYPE_DIR

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

修改 Document Provider

答案 1 :(得分:1)

要查看DocumentsUI中的外部存储(例如文件选择器对话框),您必须启用"显示高级设备"在DocumentsUI设置中。

这是一个用户设置,因此只能由用户手动更改。

答案 2 :(得分:0)

正如this in depth article中所述,如果您要求android.permission.WRITE_EXTERNAL_STORAGE,那么

  

主外部存储空间的权限未发生变化;它们在4.4中的表现与以前一样。

只有辅助外部存储受KitKat更改的影响 - 您在辅助外部存储上访问的唯一目录是专用于您的应用的目录。他们还提到在三星设备上SD卡被认为是辅助外部存储。