【发布时间】:2016-07-20 20:57:35
【问题描述】:
我正在尝试使用存储访问框架在我的应用内提供 sd 卡访问。
这就是我所说的让用户选择 sd 卡目录的意图。
private void openDocumentTree() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION
| Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
| Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT_TREE);
}
这就是我管理意图结果以设置权限的方式:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CODE_OPEN_DOCUMENT_TREE:
if (resultCode == Activity.RESULT_OK) {
Uri treeUri = data.getData();
int takeFlags = data.getFlags();
takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
this.getContentResolver().takePersistableUriPermission(treeUri, takeFlags);
}
}
}
但仍然无法在 sd 卡上保存任何文件。
我设备上@987654323@ 的值是:
content://com.android.externalstorage.documents/tree/6921-B9FD%3A
我在这里错过了什么,系统仍然不能让用户访问 sd 卡(在 sd 卡上保存一个简单的文件)?
【问题讨论】:
-
“这就是我所说的让用户选择 sd 卡目录的意图”——你可以摆脱
addFlags()的调用。这些都不相关。这些是给内容的发布者的,告诉系统他们为内容的消费者提供了什么。你是消费者。 “但仍然无法在 sd 卡上保存任何文件”——在使用DocumentFile和createDirectory()或createFile()等方法后,您应该可以使用ContentResolver和openOutputStream()。显示您保存内容的代码,并说明您遇到了什么错误(或您的一般症状)。 -
请记住,用户不必为
ACTION_OPEN_DOCUMENT_TREE选择可移动存储。用户可以选择 Google Drive、Dropbox 或任何其他存储提供商,这些都与您其他问题中的硬编码路径无关。而且,如果您所做的只是复制单个文件,请使用ACTION_CREATE_DOCUMENT获取Uri,然后使用ContentResolver和openOutputStream()获取将内容写入到的流,这样可以省去一些麻烦。 -
这并没有改变 用户 可能会选择其他存储提供商的事实。除此之外,您应该仍然可以使用
DocumentFile和ContentResolver来完成此操作,从而处理那些选择不同存储提供商的用户和同时处理可移动媒体。 “那么是否可以检查用户是否有意选择了正确的目录?” ——不可靠。你可以检查getHost()和Uri,看看它是否符合你的预期,但我希望它会在不同的设备上中断,因为制造商会搞砸这些东西。 -
findFile()查看子目录是否存在。createDirectory()如果不存在则创建它。 -
不要打电话给
getPath()。 永远不要在Uri上调用getPath(),除非方案是file。您可以调用getDisplayName()来获取提供者想要为DocumentFile标识的文档的显示名称使用的内容。此显示名称不必是目录名或文件名,因为它取决于存储提供程序。
标签: android android-permissions android-sdcard storage-access-framework