问题标签 [saf]

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 投票
0 回答
1123 浏览

android - How to create a PDF document from ResponseBody into a Intent Android API 29

As of Android 10 (Q) Storage Access Framework deprecated the way we originally saved documents to external Download folder, I'm trying to create a PDF document without asking Android Writing Storage permissions, prompting the user every time he needs to download it. But I can't figure out how to bring the PDF (in memory) directly to the creation Intent, without creating a File object (Uri), and missing the main point of not creating a file.

Here's my code:

The PDF file is created but with 0Kb and unable to open.

Google I/O 19 about this topic: https://youtu.be/3EtBw5s9iRY?t=1582

Any suggestions on how to proceed would be appreciated!

0 投票
2 回答
163 浏览

android - 有谁知道此权限来自何处以及如何在 Android 中以编程方式授予此权限?

我想创建一个文件资源管理器,经过大量搜索,我发现如果没有 API 25 及更高版本的 SAF(存储访问框架),我无法在 SD 卡上修改、删除或创建文件。然后我安装了一些文件管理器测试它们是如何工作的。除了小米文件管理器,他们都使用 SAF。小米只授予权限。我截了一些截图。在此处输入图像描述 在此处 输入图像描述

编辑 1:我获得了所有运行时权限。

谢谢阅读 :)

0 投票
1 回答
753 浏览

documentfile - DocumentFile.createFile() 在某些 Android 10 设备上失败

DocumentFile.createFile() 在某些 Android 10 设备上返回 null ( java.lang.IllegalArgumentException )。
其中大部分是华为设备:VOG-L29、MAR-LX1A、...

一些用户报告了这一点,但我不知道为什么。我没有遇到此问题的设备,因此无法对其进行测试。
它在大多数设备上都可以正常工作。
有没有人解决过这个问题?

从用户收到的日志:

0 投票
0 回答
142 浏览

java - Android SAF重复(一)(二)文件在华为上创建

我正在使用 SAF 在 android 上处理文件,我认为一切正常,除了在 EMUI 10 上运行的华为设备上,我发现在输出流上写入时文件被复制。

截屏

我手动构建文档 uri 的路径,因为当我使用“findFile()”时,需要几分钟来遍历我需要的所有文件(超过 1000 个)。与 File 对象比较只需不到 1 秒。

如何手动构建路径 Uri

现在在下面的方法中,方法“exists”返回 false,当文件创建时,它在最后返回一个重复的计数器。

由于“exists()”返回 false,我尝试使用指定的 UUID 创建一个文件,但结果将是重复文件。当我使用文件管理器进行检查时,我可以在其中看到两个文件(文件 A 和文件 A (1))。有时,我猜“exists()”可以正常工作,因为我没有得到重复的计数器,但非常罕见。这个问题出现在华为 EMUI 10 设备上。

requestLegacyExternalStorage 也被启用 android:requestLegacyExternalStorage="true"

0 投票
0 回答
543 浏览

java - 如何使用存储访问框架在 android q 的 Downloads 中创建目录

我正在尝试在设备下载文件夹中创建我的应用程序的目录。我正在尝试使用存储访问框架在运行在 android q 或更高版本上的设备中创建目录。代码在大多数设备中运行良好,我能够创建目录并将文件存储在其中。但是在某些设备中我遇到了错误。

这是意图:

这是我收到错误的 onActivityResult() :

我在 android manifest 中添加了读/写权限,并且还要求用户许可。我已经询问了一些用户的设备应用程序崩溃并且他们已授予所有权限。所以,我不确定问题是什么以及为什么它只在少数设备上发生。

以下是其中一次崩溃的堆栈跟踪:

我们可以看到错误报告表明没有权限,但我正在请求权限并且用户正在授予权限。

下面是另一个相同错误但在不同设备上的堆栈跟踪。

不同之处在于,在第一种情况下,错误是上述情况下的安全异常,它是 NullPointerException,它指向代码中的这一行:grantUriPermission(getPackageName(),currentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

所以,我不确定,但可能是 onActivityResult 正在返回一个空 uri(Uri currentUri=data.getdata() 为空)并且应用程序没有路径或权限来创建导致应用程序崩溃的目录。

所以,我想知道我做错了什么以及为什么它只影响少数设备(三星设备中的五个案例四个)。我将不胜感激有关此的任何帮助。提前致谢。

0 投票
1 回答
146 浏览

android - 为 DocumentsProvider 正确实现 openDocument

我正在编写一个示例应用程序,它实现了 DocumentsProvider 以使用 SAF 框架与其他应用程序共享文件。代码可以在这里找到:DocumentsProvider 示例项目

我在与例如 Gmail 共享所选文件时遇到问题。根据我在 openDocument 中使用的方法(请参阅示例项目中的 openDocument 函数),我会得到各种结果(请参阅上面链接中的代码)。

总之:

1)当我读入文件内容并返回时

ParcelFileDescriptor.open(文件,ParcelFileDescriptor.parseMode(模式))

它适用于 Gmail。这是使用 readFilesUsingOpenDocumment() 函数。

2)当我读入内容并使用createReliablePipe时,我可以在示例应用程序中获取内容,但在Gmail中无法获取内容。这会出现以下异常:

2020-06-10 09:15:31.643 14097-14235/nl.jcraane.myapplication E/AndroidRuntime:致命异常:AsyncTask #2 进程:nl.jcraane.myapplication,PID:14097 原因:java.io.IOException:写失败:EPIPE(断管)

这是使用 readFileUsingReliablePipe() 函数。

3) 当我使用 createReliablePipe 并且我不使用 ASyncTask 时,当传输大量(超过几 Kb)数据时,应用程序会挂起。

是否有人对如何实施 openDocument 有更多见解?理想情况下,我还想通过 URL 下载文件,并在下载完成后将字节流回。是否有可能让调用应用程序知道正在下载(以显示进度条)?createReliablePipe应该如何正确使用?

我确实查看了Samba 文档提供程序,我从中获取了 ASyncTask 解决方案,但不幸的是没有成功。

谢谢!

0 投票
1 回答
520 浏览

android - Android 10 范围存储如何删除共享目录中的底层图像文件

我正在使用文档MediaStore中的范围存储和内容提供程序。

问题是基础文件没有被删除。(我还没有看到关于这个主题的具体问题,但许多评论表明这不是我独有的。)

它实际上变得更糟,因为当我打开 Google Photos 应用程序时,底层文件只消失了一瞬间并被恢复。该基础文件的新条目也在数据库中创建。

我通过使用带有旧_id值的内容提供程序查询并获得空结果来确认这一点。_id此外,使用新字段创建相同图像的新条目。在文件应用程序中,文件就在那里。

这是一个错误还是我错过了什么?我是否需要使用 SAF 删除文件?

0 投票
0 回答
131 浏览

android - 如何在 Android 10 上删除下载文件夹中的临时文件

在除 Android 之外的每个系统中都可以轻松完成,但我有一个需要在 SHARED EXTERNAL 下载文件夹中创建 csv 文件的应用程序。关闭/重新启动手机/应用程序并且文件仍然存在。然后我需要在用新数据重新创建文件之前删除文件(某个地方的持久 URI?)。(如果存在()删除)

我看到各种指向 SAF 的文档用于此过程,但在任何地方都找不到有关如何执行这个简单的创建/删除过程的示例。如果可以在 API 28 上执行此操作并且它可以在 29+ 上运行,那就太好了。

如果没有 SAF,我已经这样做了:

问题是当再次调用 fun 时,我需要删除此文件并使用新数据重新创建它,因为 Android 会创建“aTest (1).csv”而不是覆盖它。

0 投票
3 回答
262 浏览

java - 如何使用 SAF / DocumentFile 提取带有子目录的 zip 存档?

如您所知,我正在努力使用邪恶的存储访问框架提取 zip 文件内容;我不能使用任何 File 对象,所以我必须使用 ZipInputStream、ZipOutputStream 和 DocumentFile,这是 zip 文件结构:

这是我的代码:

下面是输出的样子:

输出

谢谢

0 投票
1 回答
20 浏览

onactivityresult - 当 Preference Fragment 将其作为父级调用时,未调用 onActivityResult

我的应用程序将 GNSS 位置记录为使用手机生成定向运动地图的工具。主要活动完成所有工作,当映射器需要导出完成的现场工作时,应用程序调用一个子活动 (Save_File) 负责在 Documents/Oribooklet 目录上保存一个文件,使用 gpx 格式。由于 getExternalStoragePublicDirectory 过时,SAF 是选择要走的路。我不是 IT 人员,我这样做是为了好玩,这就是为什么我这么晚才处理这件事:用户给我发消息说他们无法再保存现场工作了。

主要: Oribooklet

...

在我实现的 Save_File 活动中,它运行良好:当映射器推送保存时,触发 startActivityForResult,然后启动 Android 文件选择器,映射器选择保存位置。

然后 onActivityResult 获取返回的 Uri 以通过使用字段上收集的数据填充文件来完成作业。再好不过了!

该应用程序有一个 Preference 片段来设置一些参数。其中之一是要使用的标准。不能把两种标准混在一起做图。当映射器更改地图的类型时,Preference 会调用 Save_File 来完成这项工作,因此不会发生数据混合。它曾经工作得很好。

在 SAF 之后,Save_File 的 onActivityResult 永远不会被触发,startActivityForResult 会触发文件提供程序,但是当映射器选择保存位置时,它会返回到 Preference 而不是 Save_File 的 onActivityResult,因此文件被创建为空。

我做了很多测试,用很多断点进行调试,在很多地方设置和删除 super,检查了所有关于此事的 SO 帖子,但没有成功。

任何想法?