问题标签 [documentfile]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
82838 浏览

android - 如何使用为 Android 5.0 (Lollipop) 提供的新 SD 卡访问 API?

背景

Android 4.4 (KitKat) 上,Google 对 SD 卡的访问非常受限。

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

问题

该帖子将引导您访问两个网站:

这看起来像是一个内部示例(可能稍后会在 API 演示中显示),但很难理解发生了什么。

这是新 API 的官方文档,但没有详细说明如何使用它。

这是它告诉你的:

如果您确实需要对整个文档子树的完全访问权限,请首先启动 ACTION_OPEN_DOCUMENT_TREE 让用户选择一个目录。然后将生成的 getData() 传递给 fromTreeUri(Context, Uri) 以开始使用用户选择的树。

在浏览 DocumentFile 实例树时,您始终可以使用 getUri() 来获取表示该对象的基础文档的 Uri,以便与 openInputStream(Uri) 等一起使用。

为了简化运行 KITKAT 或更早版本的设备上的代码,您可以使用 fromFile(File) 来模拟 DocumentsProvider 的行为。

问题

我对新 API 有几个问题:

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

android - 结合使用 Android Storage Access Framework 和直接文件访问

我有一个广泛使用文件系统的应用程序,包括外部 SD 卡。

目前它使用文件 API 来创建/删除/列出文件,但我想使用新的 Android 存储访问框架。

问题是几乎 60% 的安装基础仍在 JB 及以下,我需要新的Intent.ACTION_OPEN_DOCUMENT_TREE。我不太确定如何实施它。

我想我会编写一个通用接口来在我的应用程序中使用类似 MyFile 的东西,然后根据平台版本使用适当的 API,但除非已经有一个库可以做到这一点,否则它会太多。

其他人在做什么?你如何处理这种情况?

0 投票
0 回答
2319 浏览

android - 如何使用 Android 5.0 的新 SD 卡访问 API 设置上次修改文件属性?

背景:

使用:ACTION_OPEN_DOCUMENT_TREE + DocumentFile

更多信息: 如何使用为 Android 5.0 (Lollipop) 提供的新 SD 卡访问 API?

我想问一下:

我找不到如何更改文件属性的方法。有没有?

特别是,我需要更改 Last Modified 属性——比如 File Class 方法:

我没有找到任何替代品:

https://developer.android.com/reference/android/support/v4/provider/DocumentFile.html

或在 DocumentsContract 等相关类之一中,...

新 API 的文档真的几乎没用,API 函数运行速度非常慢,新 API 的代码重写真的很麻烦。我很抱歉这么强硬,但是Kitkat 的“EACCESS(权限被拒绝)功能”让我花费了我几年的时间,而不是解决方案,我会得到这个。

编辑:

似乎setLastModified(...)方法即使对 Class 也不起作用java.io.File(至少从 Android 版本 4.4 开始):

https://code.google.com/p/android/issues/detail?id=18624

例如——如果你有一个归档应用程序并且你想要真正的最后修改时间,而不是文件从归档中提取的时间——对不起。很多同步工具变得无用...

编辑2:

Android 5.1(模拟器):setLastModified(long time)方法仍然不起作用。

编辑3:

Android 6.0(模拟器):setLastModified(long time)方法仍然不起作用。

0 投票
1 回答
548 浏览

android - 将 Intent.ACTION_VIEW 与 DocumentFile 类一起使用

我使用这段代码来实现文件类(java.io.File)的“打开”功能:

我想对 DocumentFile 类(android.support.v4.provider.DocumentFile)做同样的事情:

但是,似乎没有应用程序(即使在 Android 5 上)能够处理 URI - documentFile.getUri()

我做错什么了吗?

0 投票
1 回答
2290 浏览

android - 在 Lollipop 上使用 Android 存储访问框架列出文件时出现错误

背景

我有一些应用程序大量使用 SD 卡进行文件同步。Kitkat 上损坏的外部 SD 卡访问仍然是一个大问题,但我正在尝试使用 Lollipop 上为拥有此功能的用户提供的新 API 来解决这个问题。

我成功地请求并保留了对 SD 卡的权限,并且可以列出从授予权限活动返回的根 Uri 中的文件。

在此处查看有关如何完成此操作的更多信息: how-to-use-the-new-sd-card-access-api-presented-for-lollipop

然后,用户可以选择任何文件夹/子文件夹进行同步,我将文件夹文档 Uri 作为字符串保存在数据库中。

问题

稍后,可能在重新启动应用程序后,可以启动文件同步。然后,我尝试列出子文件夹中的文件(请记住,我已授予正确的权限,并且该文件的持久性有效,并且还授予我对所有子文件夹的访问权限)。

然后,我从存储的字符串创建 DocumentFile 的新实例并尝试列出文件:

问题是 listFiles 总是返回授予根 Uri 的孩子,而不是我给 DocumentFile.fromTreeUri 方法的实际 Uri 的孩子。

我检查了DocumentFile的源代码,那里似乎有一个错误,特别是我认为不需要进一步修改 Uri:

如果我们查看 DocumentsContractApi21.prepareTreeUri 的来源,我们会看到它重建了 Uri:

以及它调用的方法:

通过 getTreeDocumentId 找到的文档 ID 将始终对应于根 Uri id,无论使用什么 Uri 调用方法。这使得无法使用提供的框架方法列出子文件夹的子文件夹。

解决方案

请修复 fromTreeUri 方法,使其不总是使用根文档 Uri id。

做以下丑陋的 hack 解决了这个问题,我真的不希望这样做。

0 投票
1 回答
2227 浏览

android-5.0-lollipop - 如何通过为 Lollipop 提供的 API 随机访问 SD 卡上的文件?

我的应用程序使用 Java 类RandomAccessFile通过实现SeekableByteChannel接口随机读取/写入字节到 SD 卡上的文件。现在我需要用新的 Lollipop API 为 Android 5.0 重写它。

我找到了阅读的唯一方法

和写:

从/到新 API 中的文件。

我希望能够在某个随机位置设置通道并将字节读/写到该位置。是否可以在新的 SDK 21 中做到这一点?新的SDK是否暗示以这种方式获取渠道:

或其他方法?

0 投票
4 回答
2071 浏览

java - 文档文件随机存取文件

有什么办法RandomAccessFile从给定的DocumentFile

我知道可以通过 InputStreamgetUri

但我需要一个RandomAccessFile

谢谢你的帮助,

延斯

0 投票
1 回答
1325 浏览

android - Saving files to SD card on Android Lollipop

Android 5 introduce new API for working with SD-card. If you want to write files into some directory on the SC-card, y need get access to it. As far as I know, it could be done in this way:

and then:

This code launch folder picker, and when folder is picked it requires permissions on the folder by it's Uri.

But is it possible to get permissions on exact directory by it's path? Without using folder picker. I meant that I know directory, which I want get access, and I don't want to launch Folder Picker, because it will confuse user.

How to open DocumentFile without user interaction?

0 投票
2 回答
6331 浏览

android - 如何使用新的 Lollipop API 访问所有 SD 卡?

背景

从 Lollipop 开始,应用程序可以访问真正的 SD 卡(在 Kitkat 上无法访问,并且在以前的版本上尚未得到官方支持之后),正如我在这里询问的那样。

问题

因为看到支持 SD 卡的 Lollipop 设备已经变得非常罕见,而且因为模拟器并没有能力(或者是吗?)模拟 SD 卡支持,所以我花了很长时间来测试它.

无论如何,似乎不是使用普通的 File 类来访问 SD 卡(一旦你获得了它的权限),你需要使用 Uris,使用 DocumentFile 。

这限制了对正常路径的访问,因为我找不到将 Uris 转换为路径的方法,反之亦然(而且这很烦人)。这也意味着我不知道如何检查当前的 SD 卡是否可以访问,所以我不知道何时请求用户读取/写入它(或他们)的权限。

我试过的

目前,这是我获取所有 SD 卡路径的方式:

这就是我检查我可以到达的 Uris 的方式:

这是访问 SD 卡的方法:

问题

  1. 是否可以检查当前的 SD 卡是否可以访问,哪些不是,并以某种方式要求用户获得对它们的许可?

  2. 是否有官方方法可以在 DocumentFile uris 和真实路径之间进行转换?我找到了这个答案,但在我的情况下它崩溃了,而且看起来很糟糕。

  3. 是否可以向用户请求有关特定路径的许可?甚至可能只显示“你接受是/否吗?”的对话框?

  4. 授予权限后,是否可以使用普通的 File API 而不是 DocumentFile API?

  5. 给定一个文件/文件路径,是否可以只请求访问它的权限(并检查它是否之前给出),或者它的根路径?

  6. 是否可以使模拟器具有SD卡?目前,它提到了“SD卡”,但它作为主要的外部存储,我想使用辅助外部存储对其进行测试,以尝试使用新的 API。

我认为对于其中一些问题,一个对回答另一个有很大帮助。

0 投票
1 回答
1407 浏览

android - 如何使用 DocumentFile API 对文件执行基本操作?

背景

从 API 21 (Lollipop) 开始,应用程序可以获得特殊的“权限”来修改真正的 SD 卡,如我之前写过的帖子所示(这里这里)。

问题

我可以删除文件,也可以创建它们,但是我找不到执行其他基本文件操作的方法:

  • 读取、写入、使用 InputStream 和 OutputStream
  • 移动文件。
  • 创建一个文件夹而不仅仅是一个文件
  • 重命名文件
  • 获取文件信息(最近更新等...)
  • 通过其他应用程序共享/打开文件。
  • 我可能已经忘记的其他操作。

问题

我如何获得这些功能?当然可以执行基本的读写,例如......