在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标志?
答案 0 :(得分:4)
实施DocumentsProvider
时,您只能扩展对您已有权访问的磁盘上的文件的访问权限。添加DocumentsProvider
并不会为您提供任何新访问权限,因此您可能不需要实现一个。
您可以使用您提到的ACTION_OPEN_DOCUMENT
或ACTION_CREATE_DOCUMENT
意图获取SD卡上任何位置的写访问权限。系统中内置了一个ExternalStorageProvider
,可以访问所有SD卡,一旦用户通过这些意图确认,它就会乐意将写访问权委托给您。
用户可能需要启用“设置>显示高级设备”才能显示ExternalStorageProvider
提供的SD卡。此外,如果要限制用户与本地存储进行交互,可以设置EXTRA_LOCAL_ONLY
。
对于(2),您可以使用ACTION_CREATE_DOCUMENT
在特定于程序包的目录之外创建新文件,并且可以选择具有任何意图的现有文件。用户选择的文件可以使用DocumentsContract.deleteDocument()
删除。
对于(3),平台内置的MediaDocumentsProvider
目前不会对照片,视频和音乐进行FLAG_SUPPORTS_WRITE
扩展。
希望这会有所帮助。 :)