问题标签 [storage-access-framework]
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.
android - Play 商店中的 SAF 客户端示例
我在 Google Play 中寻找 Android 存储访问框架的客户端应用程序;请提供一个免费的应用程序。允许您从文档提供程序存储文件和打开文件的东西。这可能是一个简单的文本编辑器,允许将文件保存到 SAF 中,然后使用 SAF 选择器加载文件。
我正在开发自己的文档提供程序,并且在向其他人演示时通常使用自己的测试客户端。当我说市场上使用 SAF 的其他应用程序能够使用我的提供程序时,显而易见的问题是“我能看到一个例子吗”。问题是我无法找到 SAF 客户端的具体示例。有 MS Word 但它只允许打开文件,不能保存。
android - 尝试通过 ACTION_OPEN_DOCUMENT 对自定义 DocumentsProvider 进行 takePersistableUriPermission() 失败
我正在尝试编写一个自定义DocumentsProvider
,允许其他应用程序对其提供的 Uris 获取持久权限
我有一个DocumentsProvider
我声明AndroidManufest.xml
如下
我的应用MANAGE_DOCUMENTS
设置了权限
(显然这不是必需的,但添加/删除它也无关紧要)。ACTION_OPEN_DOCUMENT
然后,当我打开选择器 UI时,我可以看到我的提供者
并且,在从我的提供者那里选择一个文件后,在onActivityResult()
我的应用程序的方法中,我可以成功地打开我DocumentsProvider
通过Uri
I get from提供的文件intent.getData()
。
但是,尝试使用
或者
总是失败并出现异常,例如
如果我从谷歌驱动器或选择器 UI 中的下载提供程序中选择一个文件,以这种方式获取权限。所以我认为问题出在我的提供者身上。
尽管我指定了,为什么没有创建权限授予android:grantUriPermissions="true"
?
如何说服 Android 为我创建这样的权限授予?
毕竟我不认为我可以自己做,因为我不知道UID
打开选择器 UI 的过程,或者至少不知道我知道如何。
android - Android:由于无效的 UID,应用程序在重新安装后无法访问外部存储
卸载和重新安装后,我们的应用程序无法写入<sdcard>/Android/data/<applicationpackage>/files
外部存储上的应用程序文件夹 ( ),无法与 MediaStore 提供商合作,也无法使用 Storage Access Framework 访问 SD 卡上的其他文件。该问题随机发生,但很常见,并且很容易在许多设备上重现。
它可以在许多带有 SD 卡的 Android 5.x 设备上复制:LG G3 VS985 4G (5.1.1)、LG G Pad V500 (5.0.2)、Alcatel Idol 3、Nvidia SHIELD Tablet K1 (5.1.1)、Verizon SM-G900V (5.0) 和其他 LG、Alcatel、Asus 设备...
重现步骤:
- 安装应用程序
<sdcard>/Android/data/<applicationpackage>/files
在 SD 卡上的应用程序文件夹 ( ) 中创建一些文件。此文件夹的 UID 是例如 10206。应用程序 UID 也是 10206。访问 SD 卡工作正常。我可以通过存储访问框架访问应用程序文件夹或访问其他文件夹- 卸载应用程序 - SD 卡上的应用程序文件夹已正确删除。
- 重新安装应用程序(在重新安装之前必须完全卸载它。通过更新应用程序,您将不会复制它。)
现在可能会发生以下 3 种情况之一:
案例 A) 没有错误:应用程序的 UID 增加到例如 10207,SD 卡上的应用程序文件夹的 UID 相同 - 10207,一切正常。我可以通过存储访问框架访问应用程序文件夹或访问其他文件夹。
CASE B)BUG:SD卡上app和应用程序文件夹的UID没有增加,仍然是10206,但是在内部(在系统中)这个应用程序包的UID显然已经不同了。这会导致以下异常:
重复步骤 3. 和 4. 后,情况 C) 总是出现。大多数情况下 C) 立即发生,没有情况 B) 并重复步骤 3. a 4。
案例 C) BUG:应用程序的 UID 增加到例如 10207,但应用程序文件夹 ( <sdcard>/Android/data/<applicationpackage>/files
) 的 UID 仍为 10206,无法从应用程序访问。这会导致以下异常:
任何进一步的卸载和重新安装都无济于事。应用程序文件夹的 UID 仍然是 10206!并且每次重新安装后(正确地)更改应用程序的 UID。唯一的解决方法是重新启动设备。重新启动后,应用程序文件夹的 UID 会根据应用程序 UID 进行更新。之后,一切正常,直到下一次卸载。所以现在我必须强制用户重启设备。
笔记:
- 我通过以下方式获取应用程序 UID:
android.os.Process.myUid()
- 我通过以下方式获取应用程序文件夹 UID:
Os.stat("<sdcard>/Android/data/<applicationpackage>/files").st_uid
我在很长一段时间内都面临这个问题,现在我很确定它与不同的 UID 有某种关系。我不知道如何很好地修复或解决它。
java - Android - Storage Access Framework - Uri into local file
I am using Storage Access Framework(SAF)
in my app. In order to scan a file(photo or document) i need send a local file path trough an API. I've managed to setup the SAF
correctly, and now when a user chooses a file and i am getting a Uri as it supposed to be.
As it seems the Uri is a key for the cloud and not a local file.
The Uri value looks like that:
How can i convert this Uri into a local file? Should i download the file from the cloud? How can i do it?
android - 文件方案到文档方案 Uri
我正在寻找与预期相反的事情。我想从文件方案 (file://) 转到文档方案 (content://...externalstorage...)。原因是 UriPermission 是树文档 uri 的一种形式。因此,要确认您的权限等于或高于您感兴趣的当前文件,您最好检查 UriPermission,这意味着您需要以适当的方式将文件路径转换为文档 uri “根标识”。例如:
文件:
file:///storage/sdcard1/_WriteTest/file.ext
文件版本:
content://com.android.externalstorage.documents/tree/0000-0000%3A_WriteTest/document/0000-0000%3A_WriteTest%2Ffile.ext
根权限:
content://com.android.externalstorage.documents/tree/0000-0000%3A_WriteTest
因此,通过将 treeId 与 documentId 进行比较,文档版本相当容易关联,但关键是/storage/sdcard1
在0000-0000
文件案例中关联。
知道这是否可能吗?
android - 如何管理所有版本中的所有本地存储(主存储、辅助存储、sd 卡、usb)
介绍
管理主存储文件+辅助存储文件(仅限本地):我将列出我已经拥有的所有信息,并希望您扩展它们或纠正我,以便这个问题希望成为一个概述,总结某人必须知道的所有主要信息在开始使用本地存储之前。我相信很多人都在寻找这样的概述......
概述
通常你有以下存储:
- 主存储(始终可直接访问,主要在内部存储上,但取决于手机制造商)
- 辅助存储(android <=4.3 可直接访问)
- 其他外部存储,例如 USB OTG...
提出以下问题:
如何找出所有可用的本地存储 + 找出类型(主要、次要、内部、sd 卡、usb)?
列出存储中的所有可用文件
2.1 哪些存储将通过
MediaStore
?2.2 如何通过 ? 获取所有文件
MediaStore
?2.3 如何在没有 的情况下获取所有文件
MediaStore
?如何编辑这些存储上的文件?
我已经知道的大部分事情,主要是我的问题是基于媒体存储索引的数据,如何找出可用的存储,如何识别存储......所以我发布了一个回答大部分问题的答案部分,并且还显示每个问题的状态 <=> android 版本对,以便很容易看到仍然缺少哪些信息
状态 - 如果您知道更多或我错了,请随时扩展/更正我对问题的回答
安卓 < 4.4
- 问题 1 - 部分已知 ✖</li>
- 问题 2.1 - 未知 ✖</li>
- 问题 2.2 - 已知 ✔</li>
- 问题 2.3 - 已知 ✔</li>
- 问题 3 - 已知 ✔</li>
安卓 4.4
- 问题 1 - 部分已知 ✖</li>
- 问题 2.1 - 未知 ✖</li>
- 问题 2.2 - 已知 ✔</li>
- 问题 2.3 - 部分已知 ✖</li>
- 问题 3 - 部分已知 ✖</li>
安卓 >=5
- 问题 1 - 部分已知 ✖</li>
- 问题 2.1 - 未知 ✖</li>
- 问题 2.2 - 已知 ✔</li>
- 问题 2.3 - 已知 ✔</li>
- 问题 3 - 已知 ✔</li>
android - DocumentFile.fromFile 在 5.0+
在我的测试中,我发现在 5.0+ 上DocumentFile
创建的fromFile
任何写入( 、 等)都会失败createFile
,createDirectory
即使您拥有 SAF 的 root 权限。
这是预期的行为吗?
如果fromFile
仅适用于 <5.0 的兼容性,我真的希望他们能在文档中明确这一点。
java - Android - 从 StorageAccessFramework 作为目标的 Uri 下载管理器问题
我在我的应用程序 DownloadManager 中使用下载文件。我正在使用这种方法:
Request.setDestinationUri()
如果我从外部存储设置为文件的目标 Uri,它可以正常工作。但是,如果我从 SAF 设置为目标 Uri:
但我得到了这个例外
java.lang.IllegalArgumentException: Not a file URI: content://com.android.externalstorage.documents/tree/D224-A5C1%3Abadu%2Fsd/document/D224-A5C1%3Abadu%2Fsd%2Ff6%2F27%2F85%2Ff4f8d950-d0b7-11e5-9c3c-4b49c28527f6
DownloadManager 可以将文件下载到 SD 卡吗?你知道如何解决这个问题吗?
android - 来自服务器存储的 Android DocumentsProvider
我如何从 Web 服务而不是本地资产中提取目录?我需要编写一个 DocumentsProvider 来共享位于服务器上的文档。我对如何做到这一点完全不知所措。服务器有一个 API,允许我检索有关文档和它们所包含的库的信息。
例如 - 我可以检索一个 JSON 数组,http://myserver/api/getlibraries
其中包含包含有关可用文档库的信息的对象,例如 CreatedBy、Name 以及该库中有多少文档。我也可以从下载文件http://myserver/api/getdocument?docID=<documentID>
我将如何从 Web 服务而不是本地资产中提取目录?
我不能提供更多细节,因为我不知道要提供哪些细节,但请随时询问,我会尽力提供。
谢谢你的帮助