当前位置: 首页 > 知识库问答 >
问题:

如何使用针对Android5.0(Lollipop)推出的新SD卡访问API?

祁聪
2023-03-14

在Android4.4(KitKat)上,谷歌对SD卡的访问进行了严格的限制。

从Android Lollipop(5.0)开始,开发人员可以使用一个新的API,它要求用户确认是否允许访问特定的文件夹,正如Google-Groups的帖子所写的那样。

    null
    null

关于新的API我有几个问题:

  1. 如何真正使用它?
  2. 根据这篇文章,操作系统会记住应用程序被授予了访问文件/文件夹的权限。如何检查是否可以访问文件/文件夹?是否有一个函数返回我可以访问的文件/文件夹列表?
  3. 如何在Kitkat上处理此问题?它是支持库的一部分吗?
  4. 操作系统上是否有设置屏幕显示哪些应用程序可以访问哪些文件/文件夹?
  5. 如果在同一设备上为多个用户安装了应用程序,会发生什么情况?
  6. 是否有关于此新API的其他文档/教程?
  7. 是否可以吊销权限?如果是,是否有意向发送到应用程序?
  8. 请求权限是否会在选定文件夹上递归工作?
  9. 使用该权限是否也允许给用户一个由用户选择的多个选择的机会?还是应用程序需要明确告知意图允许哪些文件/文件夹?
  10. 在模拟器上有没有办法尝试新的API?我的意思是,它有SD卡分区,但它作为主要外部存储工作,因此已经给予了对它的所有访问权限(使用一个简单的权限)。
  11. 当用户用另一张SD卡替换SD卡时会发生什么?

共有1个答案

帅银龙
2023-03-14

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

这里有一个在KitKat中与存储访问框架交互的很棒的教程:

https://developer.android.com/guide/topics/providers/document-provider.html#客户端

    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    startActivityForResult(intent, 42);
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();
    }
}
    getContentResolver().takePersistableUriPermission(treeUri,
            Intent.FLAG_GRANT_READ_URI_PERMISSION |
            Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

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

只要清除了授予中涉及的应用程序的应用程序数据,权限也会被撤销。

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

http://en.wikipedia.org/wiki/volume_serial_number

 类似资料:
  • 从Lollipop开始,应用程序可以访问真正的SD卡(在Kitkat上无法访问,之前的版本还没有正式支持),正如我在这里询问的那样。 因为现在已经很少看到支持SD卡的Lollipop设备了,因为模拟器没有这个功能(或者真的有吗?)为了模拟SD卡支持,我花了很长时间来测试它。 不管怎样,似乎不是使用普通的文件类来访问SD卡(一旦获得了权限),而是需要使用URI,使用DocumentFile。 这限制

  • 我尝试了,但说CreateFile失败:java.io.ioException:open失败:EACCES(权限被拒绝) 即使在添加权限后也使用-permissionandroid:name=“android.permission.write_external_storage” Android版本4.4.2

  • SD卡设备的使用 SD卡设备的使用 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-09-25 misonyo first edition. *//* * 程序清

  • 问题内容: 我想通过Selenium Webdriver启动Firefox浏览器时禁用通知。我找到了这个答案,但是它已被弃用,在Firefox上对我不起作用(尽管它在Chrome上可以完美运行)。 我将这种依赖关系用于我的 pom.xml : 问题答案: 如果您的用 例 是禁用 通知,则可以使用 以下选项: 要在 Firefox* 浏览器客户端中禁用 推送通知 ,请使用 FirefoxProfil

  • 我在使用网络视图(使用Android 5.1上的Nexus 9进行测试)时遇到了一些问题。我读到,在Android JellyBean发布前后,通过检查名为“增强网络可访问性”的首选项,向网络视图添加了对讲支持。我在系统设置中找不到这个首选项。 在我们的应用程序中,专注于Web视图只是读取“WebView”,并且不提供其他选项。 TalkBack是否在KitKat中删除了对Web视图的支持?如果没

  • 我正在为一个现有的代码库创建一个Python包装器,其中包含一个DLL和头文件。我用的是SWIG。 代码库有多个结构指针定义,如下所示: 在本例中,未在其他任何地方定义。DLL中的所有其他函数都将会话作为输入。如果我尝试在SWIG生成的代码中的任何地方引用,我会得到未定义的编译错误。我需要一种在Python代码中访问值的方法。 我试过使用cpointer。i和pointer_函数是宏,但这不起作用