自动授予 Uri 权限



我有一个简单的内容提供程序,可以为其他应用程序提供文件。它扩展ContentProvider(不是FileProvider(,并在清单中声明如下:

<provider
android:name="com.FileProvider"
android:authorities="com.FileProvider"
android:exported="false"
android:grantUriPermissions="true" />

query方法返回一个简单的游标,其中包含以下列(_display_name_datasize(。

我还实现了返回相同文件的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版本还原此更改(或设备制造商这样做(,但从技术上讲,这不是必需的。

最新更新