问题标签 [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.

0 投票
1 回答
4168 浏览

android - Android - 使用 Intent 打开音频内容 uri

我有一个应用程序可以让用户列出他们从设备中选择的歌曲。然后他们可以选择要播放的歌曲,应用程序将使用 Intent 打开歌曲的 uri,以便使用默认音乐播放器实际播放歌曲。

如果我使用 Astro 文件管理器选择歌曲,这可以正常工作,但如果我通过 google Drive、音频部分或下载部分选择文件,则歌曲将无法播放。

我正在选择具有如下意图的文件:

然后用 . 检索 Uri data.getData()

稍后使用以下意图打开 Uri Im:

Astro 文件管理器以表格形式返回 Uris,file:///storage/sdcard0/Download/My%20Song.mp3这些文件可以在默认媒体应用程序中打开并正常播放。

谷歌驱动器正在返回 Uris 的形式content://com.google.android.apps.docs.storage/document/acc%3D1%3Bdoc%3D421。当我尝试使用默认媒体应用程序使用 Intent 打开 Uris 时,它会显示一个弹出窗口“无法播放您请求的曲目”。

如何打开 Google Drive 使用该媒体类型的默认应用返回的内容 Uri?

编辑:我还尝试在使用 Intent 打开 uri 时显式设置 mime 类型:

当我这样做时,它会打开 VLC 媒体播放器,并且 VLC 报告错误“VLC 遇到此媒体错误。请尝试刷新媒体库。”

编辑 2:即使我强制选择器,它也总是使用 VLC 打开:

我什至尝试过设置->应用程序->重置应用程序首选项,它仍然始终默认为 VLC。这是在运行 Android 5.1 的 Nexus 5 上。

编辑 3:Logcat 错误我在 logcat 窗口中看到这些错误:

在应用程序的 AndroidManifest.xml 中,我确实指定了:

编辑 4:这似乎是特定于设备的。上面的所有测试都是在 Nexus 5 上完成的。我刚刚在我的 Nexus 7(Android 5.0.2)上进行了测试,并使用直接 Intent 而不是选择器打开内容 uri,没有错误。

0 投票
0 回答
1485 浏览

android - 如何在 Android SAF 中刷新文件列表

SAF 似乎不会刷新文件列表。我已经在带有 Android KitKat 的三星 Galaxy S4 上对此进行了测试。

当我使用访问DownloadsSAF 中默认提供程序的应用程序时,我看到文件已被删除。现在我有两个文件,我通过/sdcard/Download/adb 检查并使用手机的My Files应用程序确认了这一点,但 SAF 显示了超过一百个文件的列表。结果是,当我选择其中一个已删除的文件时,应用程序告诉我该文件不存在(这当然是正确的)。

还有其他人面临这个问题吗?刷新 SAF 显示的列表的任何解决方案?


更新:在 Nexus 5 和 Android 5.1 上尝试过,同样的事情发生了。我相信我误解了Downloads提供者的目标。

可通过 SAF 获得的Downloads提供程序显示下载文件的历史记录(通常在下载文件夹中结束)。如果我们转到下载目录并删除文件,这些文件不会从Downloads提供程序中删除,因为它显示的是下载文件的历史记录,而不是目录中存在的实际文件列表。

在 nautilus 中通过复制/粘贴添加文件时,在 ubuntu 中安装手机后,此文件不会显示在Downloads提供程序中。

那么我们如何摆脱这段历史呢?有一个应用程序调用,等待它,下载。打开应用程序并删除那里的文件或像我一样清除所有文件,文件就会消失。

(Google drive SAF 提供程序正确地反映了您在它之外所做的事情,因此使用它进行测试。)

0 投票
1 回答
3851 浏览

android - 在 Android 中使用存储访问框架保存文件

我正在将文档访问框架与我的云存储访问应用程序集成。使用文档,我已经能够访问该文件并检索它(我只是使用 Gmail 应用程序的附加功能来检查这一点)。

我现在正在尝试查找如何使用相同的方法保存文件(通过应用程序直接将文件保存到云存储)并且我已经完成了以下更改:

对于 getRoots 调用,

而且我也覆盖了该createDocument方法。

我没有看到太多关于如何执行此操作的示例代码或文档。我还看到像“照片”应用程序这样的一堆应用程序有“共享”按钮,它们使用不同的方法(日志显示 miniShareActivity),而我的应用程序没有显示出来(看起来它使用了不同的文件共享机制)

我正在寻找有关信息

  1. 如何使用 SAF 存储文件(任何示例文件都很好或指向文档)。我假设它将允许用户使用选择器界面导航到文件夹并存储文件。

  2. 如何让应用程序显示在应用程序的“Minishare 活动”列表中以将文件导入应用程序(看起来它不提供选择器界面,但我仍然想提供支持,以便将文件保存到默认位置)

0 投票
0 回答
232 浏览

android - 在 Android 中使用服务中的 SAF

SAF操作似乎用于startActivityForResult触发 UI 选择器。这是有道理的,因为当用户在选择器上选择一个文档时,调用活动通过onActivityResult().

问题是我需要从 a 使用 SAFService并且startActivityForResult是特定的Activity。是否有另一种与 SAF 交互的方式,一种可以从 android 服务中使用的方式?

0 投票
1 回答
2298 浏览

android - 使用存储访问框架打开特定目录

我目前可以通过使用以下代码打开 Lollipop 文件选择器来获取文件 URI:

文件选择器在内部存储的根目录或我打开的最后一个目录中打开。如何让文件选择器显示特定目录的内容?例如,我可能希望文件选择器在启动后显示下载文件夹的内容,如下图所示。

打开子目录

0 投票
2 回答
1893 浏览

android - KitKat,存储访问框架,特定文件权限?

我有一个应用程序,它实现了自己的文件选择界面,这是应用程序正常工作的要求。

在 KitKat 中,(外部)SD 卡上的文件需要通过存储访问框架授予权限,然后才能修改。

由于这些受限制的文件仍然可以自由阅读,因此不会阻止我的应用程序显示它们。但是,一旦用户选择对这些文件之一执行操作,我可以使用存储访问框架向用户提示特定权限请求吗?

以下是文档中的示例。这将返回一组所有可能的图像。显然,如果我已经可以识别我请求许可的特定图像,我不想向用户显示所有图像。是否有任何其他过滤器可以缩小呈现给用户的范围?

0 投票
1 回答
268 浏览

android - ACTION_OPEN_DOCUMENT_TREE 持久权限

如果用户选择了 sd 卡的 root 进行ACTION_OPEN_DOCUMENT_TREE权限并且应用程序持久化了它,那么访问之后如何工作?那会只是充当前者WRITE_EXTERNAL_STORAGE,允许以 4.4 之前的方式进行简单File访问吗?

如果不是,例如,如何删除持久根目录中的文件(请告诉我它不会每次都涉及弹出窗口)?

0 投票
2 回答
8492 浏览

android - Android:从存储访问框架获得的 URI 中使用意图选择器打开文件

一开始,用户可以使用新的存储访问框架选择文件(假设应用程序 API>19):

https://developer.android.com/guide/topics/providers/document-provider.html

然后我通过保存如下所示的 URI 来保存对这些选定文件的引用:

(在这种情况下,文件来自默认下载目录)。

稍后,我想让用户打开这些文件(例如,它们的名称显示在 UI 列表中,用户选择一个)。

我想用 Android 著名的意图选择器功能来做到这一点,而我所拥有的只是上面的 URI 对象......

谢谢,

0 投票
1 回答
730 浏览

android - 在 Android 5.0 上从本机代码写入外部 SD 卡?

我的应用程序的用户抱怨该应用程序无法写入外部 SD 卡。在研究了这个问题后,我得出的结论是应用程序必须使用存储访问框架才能写入外部 SD 卡。但是,如果我需要能够从本机代码写入文件怎么办?有什么方法可以请求这个权限吗?有没有办法请求可以从我的应用程序写入特定文件夹?

0 投票
0 回答
180 浏览

android - 使用存储访问框架创建多个文档

我正在使用类型意图ACTION_CREATE_DOCUMENT从我的应用程序将文件保存在设备上。有没有办法以这种意图一次创建多个文档?我正在考虑使用EXTRA_ALLOW_MULTIPLE,但我不知道如何提供我想要创建的文档数量。

谢谢你的帮助。