我有一个简单的内容提供程序,可将文件提供给其他应用程序。它扩展了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?
最佳答案
我可以与其他应用程序成功共享文件,但是,在任何地方都不能通过调用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/