问题标签 [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 回答
512 浏览

android - 如何从 Android 11 和 targetApi 30 上的文档 uri 获取真实的文件路径或文件名

Android 11
targetApi 30
不请求READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE
使用SAF api 来获取这样的 uri:
“content://com.android.providers.media.documents/document/document%3”
并像这样解析 uri:

我在低于 android 11 的手机上得到正常值,但在 android 11 手机上得到空值

好吧,我想获取文件的真实路径或名称

谁能帮帮我?<br />谢谢!

0 投票
0 回答
436 浏览

android - Whatsapp 分享 Android 11 范围存储

我在 Android 10 之前使用此代码没有问题。但现在在 Android 11 下它不再工作了。我认为 Whatsapp 无法读取从原始资源创建的应用目录中的 mp3。

我的技能不是很好,我了解 SAF 或 MediaStore。我认为这是问题所在,一般来说,WhatsApp 没有我的应用目录的权限。所以我只是不想将它下载到 Download/ 或类似的共享存储路径。但是怎么做?

目标 SDK 为 30

我的代码:

谢谢您的帮助!

0 投票
0 回答
89 浏览

android - 如何从下载文件夹中选择的 Uri 获取绝对路径?

从下载文件夹中选择一些文件时,我想通过 Uri 获取绝对路径。API 级别 21+。目前我有这样的错误:

或者这个:

取决于我如何访问这些文件。我怎样才能正确地做到这一点?您可以提供一些常用的文档链接。谢谢。

这是我目前的解决方案:

0 投票
0 回答
95 浏览

android - 如何将 FLAG_GRANT_PREFIX_URI_PERMISSION 与 Android 存储访问框架一起使用?

我想使用 Android 中的存储访问框架 (SAF) 来获取大量文件 (>600) 的 uri 并将其保存在本地数据库中。

所以要获得 1 个文件的 uri,我调用:

然后在 onActivityResult 中,我坚持授予的权限:

但我知道Android 11 将您可以保留的权限限制为 512 。所以我想我可以使用标志Intent.FLAG_GRANT_PREFIX_URI_PERMISSION来授予对 uri 具有前缀匹配的文件的访问权限,从而减少持久化 uri 权限的数量。

但我不知道如何使用这个标志。我使用它的方式,我无法读取前缀匹配的文件。

所以我的问题是:

应该如何使用标志 Intent.FLAG_GRANT_PREFIX_URI_PERMISSION?

0 投票
1 回答
1129 浏览

android - Android 11 - 如何访问 android/data/an app 目录

我想访问 android/data 中的 Chrome 浏览器目录,然后将文件(TXT)从资产复制到该文件夹

1.如何在Android 11中获得权限

2.获得许可后如何将资产文件夹中的任何文件复制到该目录

请给我一个像这样工作的代码

图像优先

图像第二

截图上方应用链接:https: //play.google.com/store/apps/details?id=eu.tsoml.graphicssettings

0 投票
0 回答
40 浏览

android - 共享使用 SAF 创建的文件

我在 Android 11 上遇到的问题如下:我的应用正在从 Internet 下载文件(例如图像)。该应用程序首先让用户使用 Intent.ACTION_OPEN_DOCUMENT_TREE 选择文件夹来存储文件。此步骤使应用程序 SAF 可以访问文件夹以创建文件并下载它。接下来我想让用户使用另一个意图打开图像:

(intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 没有帮助)但是如果其他应用程序尝试打开文件,我会遇到不同的错误:

从意图解析文件名时未找到 com.google.android.apps.photos 的权限授予或错误:权限拒绝:从 ProcessRecord{731d51b 4366:com.rhmsoft.edit/u0a277} 打开提供程序 com.android.externalstorage.ExternalStorageProvider( pid=4366, uid=10277) 要求您使用 ACTION_OPEN_DOCUMENT 或相关 API 获取访问权限

好像是第22条?我只使用 uri(我没有任何文件,也不需要它)但我无法共享使用 SAF 创建的文件?

非常感谢!

0 投票
1 回答
37 浏览

android - SAF(存储访问网络)自定义选项

我正在使用存储访问框架 (SAF):

我正在使用以下额外内容:

我的问题是,配置某些 SAF 选项的这些附加功能记录在哪里?我想将文件名显示为默认值,因为拇指无法显示 svg 文件的预览并且它令人困惑(这是默认值)。

0 投票
1 回答
41 浏览

android - 为什么 DocumentsContract.getTreeDocumentId(uri) 给我 Uri 参数的父级的文档 ID?

该应用程序使用ACTION_OPEN_DOCUMENT_TREE将用户发送到 SAF 选择器:

onActivityResult中,我们获取持久权限并存储 Uri 的字符串:

我们在需要时重新创建树 Uri:

我们想要列出文件,我们可以使用此处显示的模式。

但是,只有当目录恰好是存储卷中的顶级目录时,这才会按预期工作。如果用户选择的目录不是卷根的直接子目录,那么当我们尝试时DocumentsContract.getTreeDocumentId(rootUri),它返回的不是该 URI 的文档 ID,而是卷根之前其最高父级的文档 ID!

打印重建的 Uri 的日志调用给出以下输出:

解析的 dir uri:/tree/primary:a test dir/a child test dir/3rd level dir

但是另一个打印文档 ID 的日志调用会打印:

theDocToReturnChildrenFor:主要:测试目录

我在做吗?这是Android错误吗?我注意到这个问题描述了这种方法的完全相同的行为。通过遵循既定的递归列表模式可以解决该问题,但是,该用户说:

几乎就像 getTreeDocumentId(rootUri) 正在返回 getRootId(rootUri) 应该返回的内容。

这种方法的文档没有帮助,它们很简短并且有错字,意思不清楚。DocumentsContract.getTreeDocumentId 文档

该应用的目标SDK为30。设备Android版本也是api 30(Android 11)。

如果有人可以帮助我为用户选择的目录获取正确的文档 ID,我将不胜感激。

0 投票
1 回答
144 浏览

android - 如何使用其他应用程序打开 /Android/data 中的文件?

Android 11 之后,我们无法直接使用 File I/O访问Android/data目录。通过使用SAF,我现在可以使用 DocumentFile 来遍历我想要的文件,但是当我想用另一个应用程序打开文件时,我发现我做不到。即使我传入了正确的 Uri 参数,其他应用程序也无法访问该文件,因为它没有权限,我可以理解。但是我找到了一个叫“MT Manager”的应用,我惊讶的发现它可以打开数据目录下任意文件夹中的文件,并可以使用其他第三方应用,这太神奇了,我完全看不懂。请帮忙,你知道该怎么做吗?

此代码对普通目录下的文件有效,但在Android 11之后的Android/data目录下无效。

这就是我找到的MT 经理

我能想到一个不太聪明的方法,就是将sdcard/Android/data目录下的文件复制到sdcard目录下,然后调用上面的方法。这有效,但还不够好。我不知道那是什么。如何实现呢,他的效果看起来很不错。

0 投票
1 回答
35 浏览

android - 我使用存储访问框架浏览文件链接f.cfg,当你选择文件时,应用程序需要自动加载另一个文件,如f.dat,如何?

在 Android Studio 中:

此应用程序必须使用 COMTRADE 文件。COMTRADE 文件是 *.cfg *.dat 和 *.rio 文件。例如,(user.cfg、user.dat 和 user.rio)。主文件是 *.cfg 文件,所以用户必须通过 SAF 浏览才能找到 *.cfg 文件,当用户选择此文件时,应用程序必须自动加载其他文件(*.dat 和 *.rio)。

我不能<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>用于 30 级的 android

所以我必须使用存储访问框架,通过下面的代码用户浏览 *.cfg 文件并选择像 user.cfg 这样的文件

然后 SAF 返回该 user.cfg 文件的 URI,并且应用程序没有要加载的其他文件的任何 URI。

请帮助我,我该怎么做?谢谢。