我有一个简单的内容提供程序,可以为其他应用程序提供文件。它扩展ContentProvider
(不是FileProvider
(,并在清单中声明如下:
<provider
android:name="com.FileProvider"
android:authorities="com.FileProvider"
android:exported="false"
android:grantUriPermissions="true" />
query
方法返回一个简单的游标,其中包含以下列(_display_name
、_data
和size
(。
我还实现了返回相同文件的openAssetFile
。
我使用以下代码与其他应用共享我的 URI:
val intent = Intent(Intent.ACTION_SEND)
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://com.FileProvider/teste"))
intent.type = "image/*"
startActivity(intent)
URI 中的最终路径段无关紧要,因为query
方法始终返回相同的游标。
我成功地与其他应用程序共享该文件,但是,我不会在任何地方通过调用Context.grantUriPermission
或通过意图标志来授予对此 URI 的读取或写入权限。不会导出提供程序。
我已经通过FileProvider
实现在其他应用程序中检查了此行为。即使 URI 指向内部文件,也可以共享它们。
删除android:grantUriPermissions="true"
会导致预期的行为,因此此行似乎会自动授予权限。但这不是文档所说的。
我的问题是,如果我没有授予其他应用程序共享此 URI 的权限,为什么我可以共享此 URI?
我成功地与其他应用程序共享该文件,但是,我绝不会通过调用 Context.grantUriPermission 或通过意图标志授予对此 URI 的读取或写入权限。
谷歌添加了在某些情况下自动授予FLAG_GRANT_READ_URI_PERMISSION
的逻辑,我认为这是一种向后兼容的举措。ACTION_SEND
就是其中之一。我仍然引导开发人员手动添加标志,以防将来的Android版本还原此更改(或设备制造商这样做(,但从技术上讲,这不是必需的。