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

android - ContentResolver.openFileDescriptor() 不调用 ContentProvider.openFIle

我实现了一个ContentProvider通过覆盖的openFile(...)方法。然后我通过使用ContentResolver.openFileDescriptor(...)方法对其进行了测试。如 javadoc 中所述,openFileDescriptor假设调用ContentProvider.openFile

“...打开原始文件描述符以访问 URI 下的数据。这类似于openAssetFileDescriptor(Uri, String),但使用底层openFile(Uri, String) ContentProvider.openFile()方法...”

问题是该openFile()方法从未被调用过。相反,我观察到它openAssetFile()被调用了。我用 android 4.1.2r1 对其进行了测试。当我查看 android 类 ContentResolver (4.1.2) 的源代码时,我看到它openFileDescriptor()只会调用openAssetFileDescriptor(),我根本找不到任何ContentProvider.openFile()可以调用的执行路径。

有人知道我错在哪里吗?- 谢谢

这是我的测试方法调用:

bitmapUri是这样的“内容://com.myprovider.authority/filename”

0 投票
2 回答
1303 浏览

android - Android DocumentsProvider:在主线程调用openDocument

我正在将新的存储访问框架API 实施到我的应用程序中。一切似乎都运行良好,除了一个小细节。当我使用文档选择器从我自己的应用程序(比如从应用程序中的不同帐户)打开文件时,openDocument我的DocumentsProvider实现在主线程上被调用。如果请求的文件已在本地缓存,这很好,但如果不是,则发出网络请求,结果为NetworkInMainThreadException. 有趣的是,文档中提到“在这种方法中进行网络操作以下载文档是可以的”。这是一个已知的错误,如果是这样,有没有人知道解决这个问题的方法?

这是我启动选择器的代码:

然后当用户选择了一个文件时,这大致是我处理的方式openDocument

注意在主线程上调用的检查。当外部应用程序使用我的应用程序选择文件时不会发生这种情况,openDocument然后在后台线程上调用。只有当我试图从我自己的应用程序中选择一个文件时才会发生这种情况(但来自不同的帐户,因此是不同的 ROOT)。

然而,当我尝试在 Google Drive 上做同样的事情(即启动应用程序,然后使用它自己的选择器来选择文件)时,它似乎能够通过网络下载文件而不会导致应用程序崩溃。

0 投票
1 回答
172 浏览

android - Android 存储访问框架:QuickOffice 在保存文档时不显示错误

使用 QuickOffice 6.2.5.310b 在运行 Android 4.4 的 Nexus 7 上进行测试。

我编写了一个 DocumentsProvider 并测试了与 QuickOffice 的集成。在 QuickOffice 中,我单击打开,选择我的提供程序,然后选择一个文件。我编辑文件并单击保存。如果将文件上传到我的云服务器时发生错误,QuickOffice 会显示文件已成功保存并且不显示错误。我正在使用 ParcelFileDescriptor.closeWithError()。

0 投票
3 回答
17630 浏览

android - 未找到处理 Intent 的活动 - android.intent.action.OPEN_DOCUMENT

我正在尝试使用 android 4.4 的存储访问框架

我开发了一个虚拟应用程序,它会触发活动开始的意图。

我还开发了另一个虚拟应用程序作为文件提供程序。

我已经实现了 MyFileProvider 类。

但是当我启动用户应用程序(触发意图的应用程序)时,我收到以下错误

我只是在关注android的开发者文档。有什么想法我可能做错了吗?

编辑:这是我最新的清单。我还需要对 MyFileProvider“扩展 DocumentsProvider”进行“正确”实现吗?我现在可以在函数中返回 null 吗?

0 投票
1 回答
1244 浏览

android - Storage Access Framework does not update MediaScanner (MTP)

Using the SAF provided in KitKat, the MediaScanner is not called on files saved to the internal or external storage points of a device. As such I have to determine based on the returned URI if I should attempt to run MediaScanner.

Has anyone else had to work around this issue and if so, is there a better approach than this? Currently this only supports the device external storage and additional storage space such as the SDCard need to be handled in a separate check.

0 投票
2 回答
303 浏览

android - 带有 picasa 的存储访问框架

使用新的存储访问框架作为图像的内容选择器,如何将生成的文件作为位图获取?如果内容是手机本地的,这很容易完成,如下面的代码所示。但是,如果内容来自诸如 picasa 或谷歌驱动器或盒子之类的地方,则内容不可访问,因为 BitmapFactory.decodeStream(InputStream) 总是返回 false。有解决方案吗?

0 投票
1 回答
8018 浏览

java - SAF(存储访问框架)是否解决了 Android 4.4(KitKat)中的 SD 卡 WRITE 问题?

在 Android 4.4 中,来自 Play Store 的应用程序只能写入它的应用程序特定目录(例如:/storage/extSdCar/Android/data/com.example.myapp/),并且不允许在 micro SD 卡中写入除此目录之外的应用程序. 因此,我正在探索新的 SAF API 以检查是否可以使用 SAF 写入 micro SD 卡而不是应用程序特定的目录。

我通过创建示例提供程序和客户端应用程序实现了 SAF。在我的提供程序中,我尝试通过在 queryRoots 中实现以下代码来显示 SD 卡的全部内容:

我在我的客户端中创建了以下意图,我可以通过我的提供程序从 SAF 的系统 UI 浏览 SD 卡的全部内容。

当我单击保存按钮时,我收到 Toast 错误“无法保存文档”。但是当我导航到我的提供商的应用程序特定目录(/storage/extSdCar/Android/data/com.example.myprovider/)时系统用户界面,我可以保存文档。也没有诸如 Intent.CATEGORY_WRITABLE 之类的意图,因此我只能获取可以编辑的文档。请在以下几点上帮助我:

1.似乎即使我们使用SAF,对micro SD卡的WRITE限制仍然保持不变。这个对吗?

2.有什么方法可以创建、删除或修改 micro SD 卡中我的应用程序特定目录之外的现有文件?

3.谁决定普通用户文件(如照片、视频、音乐、文档等)的 FLAG_SUPPORTS_WRITE 标志?

0 投票
0 回答
185 浏览

android - 在 kitkat 上使用 ACTION_GET_CONTENT 时,使用 Storage Access Framework 注册的应用程序也会被列出

在 kitkat 上,我使用 ACTION_GET_CONTENT 列出支持图像的应用程序。但在选择器 UI 中,我可以看到两个部分。顶部列出了使用存储访问框架 (SAF) 注册的应用程序,列表的底部显示了为意图 ACTION_GET_CONTENT 注册的应用程序。

首先,我想知道这是否以正确的方式工作?如果是,那么注册到两者的应用程序会被看到两次。有没有办法在其中一个列表中过滤它们。例如,如果一个应用程序出现在顶部(注册到 SAF),它不应该出现在底部(注册到 ACTION_GET_CONTENT)。

0 投票
2 回答
4037 浏览

android - KitKat ACTION_OPEN_DOCUMENT 在三星设备上不显示文档

我正在使用此处指定的新 Kitkat 存储访问框架 (SAF): https ://developer.android.com/guide/topics/providers/document-provider.html

这与示例代码相同,但图像过滤器不起作用。S5 或 Note3 上没有任何显示。视频 (video/*) 也是如此。我还尝试了不同的模式,例如/无济于事。

这看起来像是他们应该解决的三星问题,我只是想知道是否有人知道解决方法。

0 投票
1 回答
1200 浏览

android - 存储访问框架作为“私人”(仅限本地)文件夹/文件选择器?

我的最终目标是允许用户选择一个文件夹来保存文件 - 该文件是一个视频文件,将在用户选择目标后的某个时间点创建。
我只是使用存储访问框架选择器来允许他们选择要保存的位置。

首先,有没有办法让用户只选择一个文件夹(而不是文件/文件名)?
我现在能做的最好的事情是使用ACTION_CREATE_DOCUMENTIntent 来获取保存位置,但是我真的不想在 SAF 选择器中指定文件名(这将在应用程序中完成)......

其次,在阅读了存储访问框架文档,并从一些 代码 示例中拼凑了一些位之后,我得到了一个可以工作的 DocumentsProvider,它几乎可以满足我的需求 - 即允许用户浏览他们的外部存储(SD 卡)用于保存视频文件的合适位置的目录 - 通过添加我自己的指向Environment.getExternalStorageDirectory()queryRoots() 方法的根目录。

但是,我真正想要的是让它成为我唯一的根(目前我还拥有 Drive、Downloads 等)。
是否可以删除/隐藏其他根,使其本质上成为特定于应用程序的文件选择器?
或者甚至只显示本地存储(也许Root.FLAG_LOCAL_ONLY标志可以帮助)?

谢谢!