10

在 Android 4.4 中,来自 Play Store 的应用程序只能写入它的应用程序特定目录(例如:/storage/extSdCar/Android/data/com.example.myapp/),并且不允许在 micro 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 的系统 UI 浏览 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 错误“无法保存文档”。但是当我导航到我的提供商的应用程序特定目录(/storage/extSdCar/Android/data/com.example.myprovider/)时系统用户界面,我可以保存文档。也没有诸如 Intent.CATEGORY_WRITABLE 之类的意图,因此我只能获取可以编辑的文档。请在以下几点上帮助我:

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

2.有什么方法可以创建、删除或修改 micro SD 卡中我的应用程序特定目录之外的现有文件?

3.谁决定普通用户文件(如照片、视频、音乐、文档等)的 FLAG_SUPPORTS_WRITE 标志?

4

1 回答 1

4

在实现 aDocumentsProvider时,您只能扩展对磁盘上您已经有权访问的文件的访问。添加 aDocumentsProvider不会给您任何新的访问权限,因此您可能不需要实现一个。

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

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

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

对于 (3),MediaDocumentsProvider平台中的内置功能目前不FLAG_SUPPORTS_WRITE支持照片、视频和音乐。

希望这可以帮助。:)

于 2014-04-02T16:20:40.693 回答