概述
很多好的问题,让我们深入。:)
你如何使用它?
这是一个伟大的教程与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的授予,如果用户以后重新插入,您将继续先前授予对原始卡的访问权限。
最后
以上就是刻苦黄蜂为你收集整理的android 5.0 sd卡读写,如何使用为Android 5.0(Lollipop)提供的新SD卡存取API?的全部内容,希望文章能够帮你解决android 5.0 sd卡读写,如何使用为Android 5.0(Lollipop)提供的新SD卡存取API?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复