问题标签 [document-provider]
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 - 我的 DocumentsProvider 如何访问用于启动文件选择器的意图数据
我正在实现一个自定义 DocumentsProvider。当使用标准 Android 协议访问文件选择器时,应用程序可以提供他们感兴趣的多种 mime 类型,然后请求文件选择器执行以下操作:
当文件选择器打开时,会显示我的自定义文档提供程序。我在该类中需要做的是能够检测到应用程序存储在上面的“putExtra”行中的 mime 类型列表是什么,因此我可以在文档提供程序的“queryChildDocuments”方法中适当地加载光标。
如何从 DocumentsProvider 中获取用于启动文件选择器的意图中的数据?
android - 是否可以仅在我的应用程序中提供我自己的文档提供程序?
这是一个非常简短的答案,我找不到答案,不在文档中,也不在互联网上的任何地方:
在 Android 上,应用程序可以让用户从中选择文件,以从其他应用程序中进行选择。例如,谷歌照片应用程序允许从中选择照片文件。这是通过实现DocumentProvider来完成的。
我想问是否可以仅向我的应用程序本身提供我的应用程序的内容。
这在提供照片选择的情况下会有所帮助,例如,仅与应用程序本身相关。
android - DocumentProvider 无权拥有 ContentProvider
我的应用程序有 2 种类型的提供程序
- 规范要求的DocumentProvider ( DP ) 被导出=“true”
- ContentProvider (CP) isexported="false" 安全要求
基本通信流程是第 3 个应用程序向 DP 请求一些信息,DP 向 CP 请求此信息并将信息返回给第 3 个应用程序。
假设我们使用 Microsoft Word/Excel 从 DocumentProvider 获取一些数据。这是应用程序之间通信流程的方案:
Word < ------- > Document Provider < ---- error here ---- > ContentProvider
问题是 DocumentProvider 无权访问它自己的 ContentProvider。我的意思是 DP 和 CP 在 1 个应用程序中,但它们在不同的进程中运行。
错误是:
DP:
CP:
android - 使用 ACTION_GET_CONTENT 或 OPEN_DOCUMENT 从 Google 相册提供商处挑选
我不知道为什么会发生这种情况,但我无法从 Google 照片提供商那里挑选图片。在 API 27 上进行测试。
使用 ACTION_GET_CONTENT
如果我使用:
- 我可以在提供商中看到 Google 相册
- 我可以浏览到一些图片并选择它
- 然后我被引导回提供者列表(而不是我的应用程序),就好像提供者在 try-catch 中崩溃了一样
当我打开照片提供程序并浏览文件夹时,我会看到很多:
当我点击图片时,我看到了这些:
使用 ACTION_OPEN_DOCUMENT
在这种情况下,我什至在提供程序抽屉中都看不到 Google 相册。
问题
我该如何解决这个问题,最好使用 ACTION_GET_CONTENT?
android - 在 ExoPlayer 中使用缓存来保存流式视频
更新:
我找到了这篇文章,其中详细说明了我所看到的完全相同的问题。事实证明,我在 DocumentsProvider 中使用 Pipe 方法从 DropBox 流式传输内容意味着 ExoPlayer 不提前知道文件的大小,因此默认情况下不会将其保存到缓存中。
所以我最终做了我认为作者所做的事情 - 我为这些情况创建了一个自定义 CacheDataSource ,它改变了该类的 open() 方法中的 DataSpec.flags 变量:
不是最佳解决方案,我还在另一篇文章中附和,要求提供更受支持的方式来指示应设置此标志。
但至少现在我的流媒体文件被保存在缓存中。
我正在为 ExoPlayer2 实现一个客户 CacheDataSourceFactory,以便实现一个缓存来存储流式传输到 ExoPlayer 的视频。
我在这里查看了几篇文章,这篇文章有助于获得将视频缓存到我选择的目录中的一般方法。
我注意到在处理解析为我的自定义 DocumentsProvider 的 URI 时,CacheDataSourceFactory 定义的缓存仅用于存储看起来像“指针”或“索引”文件(“cached_content_index.exi”)的内容。在该文件中,我看到了由我的自定义 DocumentsProvider 流式传输的视频的 URI。但是实际的视频不在缓存中。
这是我的 Provider 的相关部分,它非常简单:
和 TransferThread:
再一次 - 在这种情况下,ExoPlayer 似乎对它从 DocumentsProvider 接收的 ParcelFileDescriptor 非常满意 - 它接收流向它的字节并播放视频。我只是没有看到视频文件最终在缓存中。
我还尝试了一个示例,从我的 Google Drive 流式传输视频(它使用 SAF 的开箱即用文档提供程序),这一次视频确实在缓存中结束。
由于它们都使用相同的 MediaSource 实例 - Google Docs 提供程序必须采用一种方法,以便 ExoPlayer 知道将生成的流式视频放置在我的自定义 Dropbox DocumentsProvider 没有执行的缓存中。
有谁知道如何获取管理对 Google Docs 访问权限的 SAF 附带的 DocumentsProvider 的源代码?我想看看它在 openDocument() 方法中做了什么。
Dropbox 提供商在其 ParcelFileDescriptor 中使用管道这一事实是 ExoPlayer 无法处理的吗?
其他想法?
android - 使用 ProviderTestRule 测试 DocumentProvider
我有一个 DocumentProvider,它由磁盘上的文件支持,我想用仪器测试进行测试。不幸的是,我找不到推荐的方法来做到这一点。在文档中ProviderTestCase2
,似乎它将与IsolatedContext
.
这样做的新方法似乎是ProviderTestRule
,但我无法让它与任何工作DocumentProvider
。
我的清单:
我的仪器测试:
当我运行测试时,它会在初始化时引发异常ProviderTestRule
:
我已经尝试了 Provider 的所有排列exported
,permission
但无济于事。ProviderTestRule 不是这里的路吗?我用错了吗?还是某处有错误?
android - Android DocumentProvider 崩溃 Files-App / DocumentsUI
嘿,我在使用 DocumentProvider 提供文档时遇到问题
实际上我试图提供一个静态文件,但如果我打开我的文件应用程序并发生以下异常。Files-App 正在崩溃,但如果我试图在我的提供程序中只显示目录,我的代码就可以工作。我做错了什么?我确实为看到 DEFAULT_FILE_PROJECTION 的文档设置了所有必填字段,但在我在文件应用程序中选择我的提供程序后它仍然崩溃
这是我正在设置所有必需字段的代码。如果我使用 MimeType Directory 尝试相同的代码,它可以工作
c# - 首次启动后如何强制 QueryRoots 在 Xamarin 应用程序上触发,存储提供程序
我正在尝试按照此处的示例实现 Xamarin 存储提供程序。
https://github.com/xamarin/monodroid-samples/tree/master/StorageProvider
问题是我希望用户在呈现根文件夹之前登录。
用于查询根的方法如下:
public override ICursor QueryRoots(string[] projection)
这在应用程序首次启动时被调用,但随后似乎没有被调用。
如果我立即登录(硬编码凭据),这可以正常工作。但是,如果我打开应用程序以便手动添加一些登录详细信息,则不会再次调用它,因此不会重新呈现正确的根。
有没有人知道我如何强制 Android 再次重新调用此方法以刷新此列表?
android - 使用带有 EXTRA_INITIAL_URI 和 file:// Uri 的 ACTION_OPEN_DOCUMENT
是否可以使用Intent.ACTION_OPEN_DOCUMENT
file:// 格式的 Uri 作为DocumentsContract.EXTRA_INITIAL_URI
额外的,让 DocumentsProvider 在文件的位置开始导航?
在我的应用程序中,我为用户提供了使用自定义设置文件的选项,当他选择此选项时,示例默认文件将在应用程序的数据文件夹中创建(由 返回getExternalFilesDir
)。
选择自定义文件时,我希望 DocumentsProvider 使用 . 打开当前所选文件所在的文件夹EXTRA_INITIAL_URI
。如果某个文件之前选择了 Intent,则没有问题ACTION_OPEN_DOCUMENT
,因为返回的 Uri 是content://
格式的。
在用户第一次选择文件之前存在问题,并且只有创建默认自定义文件的 Uri 可用。文件通过使用File.createNewFile
返回的目录中的使用创建Context.getExternalFilesDir
,并使用使用生成Uri Uri.fromFile(file)
,从而产生file://
格式Uri。
这是一个简单的示例代码:
创建自定义文件。像返回 Urifile:///storage/emulated/0/Android/data/com.example.testsapp/files/customFile.txt
让用户选择一个自定义文件:
当 fileUrifile://
格式化时,DocumentsProvider 将不会在文件目录中打开,而是显示默认目录。用户选择新的自定义文件后,onActivityResult
方法将提供一个新的 Uri,如content://com.android.externalstorage.documents/document/primary%3AAndroid%2Fdata%2Fcom.example.testsapp%2Ffiles%2FcustomFile.txt
当使用此 Uri withpickNewFile
方法时,它将在文件目录中打开。
有没有办法将file://
Uricontent://
类型转换为 Uri 类型?