SAF(存储访问框架)是否解决了Android 4.4(KitKat)中的SD卡WRITE问题?

时间:2014-03-28 07:16:48

标签: java android android-sdcard android-4.4-kitkat storage-access-framework

在Android 4.4中,来自Play商店的应用只能写入其应用特定目录(例如:/storage/extSdCar/Android/data/com.example.myapp/),并且不允许应用在此目录之外写入微型SD卡。所以我正在探索新的SAF API来检查我是否可以使用SAF写入除应用程序特定目录之外的micro SD卡。

我已经通过创建示例提供程序和客户端应用程序来实现SAF。在我的提供商中,我试图通过在queryRoots中实现以下代码来显示SD卡的全部内容:

    row.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(new File("/storage/extSdCard")));
    row.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_RECENTS | Root.FLAG_SUPPORTS_SEARCH);

我在我的客户端创建了以下意图,我可以通过我的提供商从SAF的系统用户界面浏览SD卡的全部内容。

    Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("*/*");
    intent.putExtra(Intent.EXTRA_TITLE, "test.txt");
    startActivityForResult(intent, WRITE_REQUEST_CODE);

当我点击保存按钮时,我收到Toast错误“无法保存文档”。但是当我导航到App特定目录(/storage/extSdCar/Android/data/com.example.myprovider/)时我在System UI中的提供者,我能够保存文档。 也没有意图,如Intent.CATEGORY_WRITABLE,所以我只能获得可以编辑的文档。 请帮我解决以下几点:

1.似乎即使我们使用SAF,仍然对micro SD卡的WRITE限制保持不变。这是对的吗?

2.有什么方法可以创建或删除或修改micro SD卡中我的App特定目录之外的已有文件?

3.Who为照片,视频,音乐,文档等普通用户文件决定FLAG_SUPPORTS_WRITE标志?

1 个答案:

答案 0 :(得分:4)

实施DocumentsProvider时,您只能扩展对您已有权访问的磁盘上的文件的访问权限。添加DocumentsProvider并不会为您提供任何新访问权限,因此您可能不需要实现一个。

您可以使用您提到的ACTION_OPEN_DOCUMENTACTION_CREATE_DOCUMENT意图获取SD卡上任何位置的写访问权限。系统中内置了一个ExternalStorageProvider,可以访问所有SD卡,一旦用户通过这些意图确认,它就会乐意将写访问权委托给您。

用户可能需要启用“设置>显示高级设备”才能显示ExternalStorageProvider提供的SD卡。此外,如果要限制用户与本地存储进行交互,可以设置EXTRA_LOCAL_ONLY

对于(2),您可以使用ACTION_CREATE_DOCUMENT在特定于程序包的目录之外创建新文件,并且可以选择具有任何意图的现有文件。用户选择的文件可以使用DocumentsContract.deleteDocument()删除。

对于(3),平台内置的MediaDocumentsProvider目前不会对照片,视频和音乐进行FLAG_SUPPORTS_WRITE扩展。

希望这会有所帮助。 :)