android 5.0 sd卡读写,如何使用为Android 5.0(Lollipop)提供的新SD卡存取API?

很多好的问题,让我们深入。:)

你如何使用它?

这是一个伟大的教程与KitKat中的存储访问框架交互:

在Lollipop中与新的API交互非常相似。要提示用户选择目录树,您可以启动这样的意图:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);

startActivityForResult(intent, 42);

然后在您的onActivityResult()中,您可以将用户选择的Uri传递给新的DocumentFile辅助类。这里有一个快速示例,列出了挑选的目录中的文件,然后创建一个新文件:

public void onActivityResult(int requestCode, int resultCode, Intent resultData) {

if (resultCode == RESULT_OK) {

Uri treeUri = resultData.getData();

DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);

// List all existing files inside picked directory

for (DocumentFile file : pickedDir.listFiles()) {

Log.d(TAG, "Found file " + file.getName() + " with size " + file.length());

}

// Create a new file and write into it

DocumentFile newFile = pickedDir.createFile("text/plain", "My Novel");

OutputStream out = getContentResolver().openOutputStream(newFile.getUri());

out.write("A long time ago...".getBytes());

out.close();

}

}

DocumentFile.getUri()返回的Uri足够灵活,可以与不同的平台API一起使用。例如,您可以使用Intent.setData()与Intent.FLAG_GRANT_READ_URI_PERMISSION共享它。

如果要从本机代码访问Uri,可以调用ContentResolver.openFileDescriptor(),然后使用ParcelFileDescriptor.getFd()或detachFd()获取传统的POSIX文件描述符整数。

如何检查是否可以访问文件/文件夹?

默认情况下,通过存储访问框架返回的Uris意图不会在重新启动后持久化。平台“提供”持久化权限的能力,但是您仍然需要“获取”权限,如果你想要的。在上面的示例中,您可以调用:

getContentResolver().takePersistableUriPermission(treeUri,

Intent.FLAG_GRANT_READ_URI_PERMISSION |

Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

您可以随时通过ContentResolver.getPersistedUriPermissions()API找出您的应用可以访问的持久授权。如果您不再需要访问持久化Uri,则可以使用ContentResolver.releasePersistableUriPermission()释放它。

这是在KitKat吗?

不,我们不能追溯地向平台的旧版本添加新功能。

我可以看到哪些应用程序有权访问文件/文件夹?

目前没有显示此内容的UI,但您可以在adb shell dumpsys活动提供程序输出的“Granted Uri Permissions”部分中找到详细信息。

如果在同一设备上为多个用户安装了应用,会发生什么情况?

Uri权限授予在每个用户的基础上隔离,就像所有其他多用户平台功能一样。也就是说,在两个不同用户下运行的同一个应用程序没有重叠或共享Uri权限授予。

权限可以撤销吗?

支持DocumentProvider可以随时撤销权限,例如删除基于云的文档时。发现这些撤消的权限的最常见方法是当它们从上面提到的ContentResolver.getPersistedUriPermissions()中消失时。

当针对授权中涉及的任一应用程序清除应用数据时,也会撤销权限。

将要求在所选文件夹上递归授权工作吗?

是的,ACTION_OPEN_DOCUMENT_TREE意图让您递归访问现有和新创建的文件和目录。

这是否允许多重选择?

是的,自KitKat以来支持多重选择,并且您可以在启动ACTION_OPEN_DOCUMENT意图时通过设置EXTRA_ALLOW_MULTIPLE来允许它。您可以使用Intent.setType()或EXTRA_MIME_TYPES缩小可以选择的文件类型:

有没有办法在模拟器上尝试新的API?

是的,主共享存储设备应该出现在选择器中,甚至在模拟器上。如果您的应用程序只使用存储访问框架访问共享存储,您不再需要READ / WRITE_EXTERNAL_STORAGE权限,可以删除它们,或使用android:maxSdkVersion功能仅在较旧的平台版本上请求它们。

当用户用另一个SD卡替换SD卡时会发生什么?

当涉及物理介质时,底层媒体的UUID(例如FAT序列号)总是被烧录到返回的Uri中。系统使用它将您连接到用户最初选择的媒体,即使用户在多个插槽之间交换媒体。

如果用户在第二张卡中交换,您需要提示您访问新卡。由于系统会记住基于每个UUID的授予,如果用户以后重新插入,您将继续先前授予对原始卡的访问权限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值