问题标签 [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 投票
2 回答
1422 浏览

java - 在不使用 findFiles() 的情况下获取作为文档树子级的 DocumentFile

我有一个从中获得的树 URI ACTION_OPEN_DOCUMENT_TREE如何在不使用的情况下获得作为该树的子项的 DocumentFilefindFiles()?鉴于我知道如何获取它的 documentId、它的绝对路径或它的 URI。我需要与文档树相关的权限。

这就是我现在所拥有的:

docFile以 TreeDocumentFile 的形式返回,它是我的根目录的子项。我有写权限并且可以使用createFile()它,因为它位于ACTION_OPEN_DOCUMENT_TREE.

所以它有效,但findFile()真的很慢。

如果我尝试像这样使用 DocumentsContract:

它返回一个以 为根的新 TreeDocumentFile docFile,而不是docFile作为我的原始文档树(根)的子级。所以我没有这棵树的写权限。

如果我这样尝试:

我得到一个实际上看起来像我想要的 URI,但它是一个 URI,而不是 DocumentFile。

如果我执行与上述相同的操作,但使用 fromTreeUri() 从该 uri 构建 DocumentFile:

我得到了原始树 DocumentFile,而不是代表孩子的 DocumentFile。

0 投票
0 回答
1006 浏览

android - Android:DocumentFile InputStream 的奇怪行为

背景

我有一个使用存储访问框架的应用程序。

它提示用户选择一个目录以获得使用文件的权限:

然后允许用户在目录中选择一个 JPG 图像:

问题

一位用户在 Android 7 上遇到以下问题。

当程序尝试读取文件的内容(JPEG 图像)时:

内容不是文件的真实内容,而是一些带有单词“CONSOLE”后跟零的随机垃圾:

在此处输入图像描述

文件长度正确,没有报错,只有内容是废话。

这种行为是独一无二的,在任何其他设备上都无法重现。

有没有人遇到过这样的事情?

0 投票
1 回答
2766 浏览

android - 存储访问框架获取正确的 Uri 路径删除/编辑/获取文件

TL:博士;我解释了如何使用 DocumentFile 创建文件夹和子文件夹,以及如何删除使用此类创建的文件。从 onActvityResult() 和 documentFile.getUri.toString() 返回的 Uri 不相同。我的问题是如何在不使用 SAF UI 的情况下获得有效的 Uri 来操作文件夹和文件,如果可能的话,不使用 hack。

让我分享我到目前为止所学到的知识并提出我的问题。如果要获取文件夹的 Uri 并对其进行处理,则应使用IntentwithACTION_OPEN_DOCUMENT_TREE获取 Uri 以访问文件夹并为该 uri 设置 W/R 权限。

授予onActivityResult 的持久权限:

如果选择设备的主文件夹:

返回:content://com.android.externalstorage.documents/tree/primary:

返回:存储/模拟/0

返回:内容:/com.android.externalstorage.documents/tree/primary:

如果你使用 DocumentFile 类来获取你得到的主文件夹的路径

返回:file:///storage/emulated/0

我的第一个问题是如何使用 DocumentFile 类获取带有内容的 Uri。

我正在构建一个摄影应用程序,默认情况下我想使用 DocumentFile 类为图像设置一个初始文件夹。

此方法根据选择在设备的主内存或 PICTURES 或 DCIM 文件夹中创建 DIR_MAIN/DIR_SUB。使用这个默认文件夹,我将图像保存到这个创建的子文件夹中。我得到 newSubDir.getUri().toString(): file:///storage/emulated/0/MainFolder/SubFolder我命名为 DIR_MAIN MainFolder, DIR_SUB: SubFolder 进行测试。

要访问或删除图像,我使用这个路径和我创建的图像名称

imageDelete 返回 null 因为 Uri 的格式不正确。

如果我打开 SAF ui 并获取 UI onActivityResult 并将其保存为字符串,我将使用此方法获取目录并检查 Uri 权限

检查字符串中的 Uri 是否具有写入权限,如果您不获取或删除可持久性权限,它可能没有。

使用有效 uri 保存图像并使用后

0 投票
1 回答
1464 浏览

android - 将 EXIF 数据写入使用 DocumentFile 类保存的图像

content://com.android.externalstorage.documents/tree/primary:如果选择了设备的主存储器,我需要从 DocumentFile 或 Uri 获取具有正确方案的文件,而不是使用正确方案的文件。要获取图像的文件或绝对路径,我需要使用 file:///storage/emulated/0 或 storage/emulated/0 的路径,但我找不到一种方法来获取正确的 Uri 来构建文件以将 EXIF 数据写入图片。

我的情况是:

  1. 用户选择保存图像的路径,该路径使用content://com.android.externalstorage.documentsonActivityResult() 返回 Uri。我将此路径保存treeUri.toString()到 SharedPreferences 以供以后使用。
  2. 用户拍照并保存图像DocumentFile.fromTreeUri(MainActivity.this, Uri.parse(uriString));
  3. 这是我失败的地方,得到一个正确指向图像的文件,带有 content:// 的 Uri 不返回现有图像。正确的 Uri 应该file:///storage/emulated/并且我可以使用此 Uri 将此 Uri 转换为文件File filePath = new File(URI.create(saveDir.getUri().toString()));

如何使用从 SAF UI 获得的 Uri 获取构建文件或文件所需的 Uri?

编辑: 为可以使用 InputStream 或 FileDescriptor 的 Android 7.1+ 引入了ExifInterface 支持库。

注意: ExifInterface 不适用于远程 InputStream,例如从 HttpURLConnection 返回的那些。强烈建议仅将它们与 content:// 或 file:// URI 一起使用。

上面的代码段显然是在读取数据,因为它打开了一个 InputStream 来读取数据。我需要能够将 EXIF 数据写入 JPEG 文件。

0 投票
1 回答
381 浏览

android - 授予 SD 卡根权限后,不允许子文件夹使用 DocumentFile 写入文件

我正在使用这个来调用一个意图:

并选择我的外部 SD 卡的根目录,然后使用以下方法获取持久权限:

我可以使用输出流将文件写入根目录(我的初始选择),但我不能写入任何其他子文件夹,除非我再次请求它们的权限并明确选择它们。

我现在没有做任何花哨的事情来确定我有权访问哪些文件夹,我只是创建一个 POC 并尝试将文件写入我选择并授予权限的文件夹的子文件夹。我使用下面的目标变量在 DocumentFile 对象上得到一个空异常:

同样,如果我明确授予该子文件夹的权限,它就可以工作。我读过的所有内容都表明,您授予权限的文件夹下的所有现有子文件夹和任何新创建的文件夹都应该允许访问写入文件,但这对我不起作用。

我错过了什么?

TIA

编辑:我也尝试使用 URL 编码字符作为我的 URI 中的斜杠,但仍然无法正常工作,除非我直接选择子文件夹并再次调用我的意图。

0 投票
0 回答
401 浏览

android - DocumentFile.length() 非常慢,想直接访问 sd 卡

我想让用户选择将图像保存在他们的 sd 卡上,并且我希望能够计算这些图像的文件夹大小。我发现Environment.getExternalStorageDirectory()返回内部存储。我可以找到 SD 卡的唯一方法是使用ACTION_OPEN_DOCUMENT_TREE请求。但这意味着我必须使用 DocumentFiles 而不是常规文件。我只能获得内容 uri,而不是 sd 卡本身的直接路径。

因此,File.length()内部存储运行良好,但DocumentFile.length()外部存储运行速度极慢。有没有办法根据其内容 uri 获取文件夹的大小而不会永远占用它?或者我可以以某种方式找到 sd 卡的实际路径并改用 Files 吗?我找到了一个类似的文件夹,/storage/3857-3732但我似乎没有写入权限(是的,我有WRITE_EXTERNAL_STORAGE权限)。

0 投票
1 回答
901 浏览

storage-access-framework - 为什么 DocumentFile.getParentFile() 使用 Uri 创建后返回 null?

代码:

为什么从 DocumentFile 的 Uri 创建的 DocumentFile 在这方面与原始文件不同?

0 投票
0 回答
1780 浏览

android - 将文件转换为 DocumentFile

我想将File( /storage/A54E-14E9/bp.mp4) 转换为DocumentFile

UriDocumentFile应该是content://com.android.externalstorage.documents/tree/A54E-14E9%3A/document/A54E-14E9%3Abp.mp4

但是当我使用DocumentFile.fromFile(file).getUri()它时返回不正确Uri

onActivityResult所以它和你打电话后进去的时候不同startActivityForResult(new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE), REQUEST_CODE_STORAGE_ACCESS);

或者如果不可能,那么如何在以下位置找到等于File( /storage/A54E-14E9/bp.mp4) 的内容:

只检查文件名不是好主意,我需要检查绝对路径(如果它们相等),文件也可以放在子文件夹中,所以这让事情变得更加困难

File我的任务是从MicroSD 卡中删除,它可以DocumentFile在请求存储后使用(ACTION_OPEN_DOCUMENT_TREE)但我需要以某种方式获得与DocumentFile我相同的权利File

0 投票
2 回答
2168 浏览

java - 由于 DocumentFile().fromTreeUri() 在尚不存在的路径上的 DocumentFile.exists() 总是返回 true

我正在尝试使用 DocumentFile (由于存储访问框架)在创建文件之前检查文件是否存在。但是DocumentFile().fromTreeUri()删除了可能的 Uri 中不存在的部分,这将导致DocumentFile().exists()始终返回 true,而不管它是否存在。

我创建了一个简单的例子来证明我的观点。首先我们要求用户选择一个目录:

在响应时,我们添加/fictionalFile到路径(从而使其成为不存在的文件),然后检查它是否存在:

但是,当 DocumentFile.fromTreeUri() 在虚构的 Uri 上运行时,虚假的“/fictionalfile”部分会丢失,这会导致 DocumentFile.exists() 函数返回 true,如下面的 LogCat 所示:

I/STORAGE:虚构 URI:content://com.android.externalstorage.documents/tree/17FA-1C18%3AFileSync%2Ftarget/fictionalFile

I/STORAGE: FICTIONAL DOCUMENTFILE URI: content://com.android.externalstorage.documents/tree/17FA-1C18%3AFileSync%2Ftarget/document/17FA-1C18%3AFileSync%2Ftarget

I/STORAGE:虚构文件存在

(在上面的例子中,我使用的是 SD 卡,因此路径名很长)

是否有另一种方法来检查尚未创建的 DocumentFile 是否存在?用例是,将文件从目录 A 复制到目录 B 时,我想在开始传输之前检查目录 B 中是否已经存在所述文件。

更新:我现在意识到 usingDocumentFile.fromTreeUri()是错误的,我应该使用DocumentFile.fromSingleUri(). 这有帮助,但是在.exists()新文件上运行时,我得到W/DocumentFile: Failed query: java.lang.UnsupportedOperationException: Unsupported Uri content://com.android.externalstorage.documents/tree/17FA-1C18%3AFileSync%2Ftarget/fictionalFile. 有什么想法吗?

0 投票
1 回答
1262 浏览

java - 如何重写文档文件

我想让用户拿起文件夹,我的应用程序将在这个文件夹中创建一个文件。所以我用Intent.ACTION_OPEN_DOCUMENT_TREE. 谷歌说我需要使用 DocumentFile 而不是 File。以前我使用 File 并希望得到类似于下面代码结果的结果

但是 DocumentFile 不是文件,我不能使用 FileOutputStream。所以我使用 OutputStream 编写了这段代码

此代码不会重写我的文件,而是创建另一个名为 Note(1) 的文件所以我想知道是否有一种方法可以使用 OutputStream 或另一种方法使用 FileOutputStream 来重写文件,但我不知道如何使用它与 DocumentFile。

先感谢您。