我有一个简单的内容提供程序,可将文件提供给其他应用程序。它扩展了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?

最佳答案

我可以与其他应用程序成功共享文件,但是,在任何地方都不能通过调用Context.grantUriPermission或通过意图标志来授予对该URI的读写权限。


Google添加了在某些情况下自动授予FLAG_GRANT_READ_URI_PERMISSION的逻辑,我认为这是向后兼容的举动。 ACTION_SEND was one of them。我仍然引导开发人员手动添加标志,以防将来某些Android版本还原此更改(或设备制造商这样做),但是从技术上讲,这不是必需的。

关于android - Uri权限自动授予,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59543331/

10-13 03:05