Android 为什么我必须在使用grantUriPermission之前调用其他应用程序?

Android 为什么我必须在使用grantUriPermission之前调用其他应用程序?,android,android-intent,android-contentprovider,android-fileprovider,Android,Android Intent,Android Contentprovider,Android Fileprovider,我对函数有点困惑。我想使用它通过一个应用程序授予另一个应用程序的文件访问权限。因为有充分的理由,FileProvider必须是本地的(非导出的),所以我必须授予另一个应用程序临时读/写权限。文件说: 通常,您应该使用Intent.FLAG\u GRANT\u READ\u URI\u权限或 Intent.FLAG\授予\写入\ URI\权限,意图用于 启动活动,而不是直接启动此功能。如果你用这个 函数,您应该确保调用revokeUriPermission(Uri, int)当目标不再被允许访问它

我对函数有点困惑。我想使用它通过一个应用程序授予另一个应用程序的文件访问权限。因为有充分的理由,FileProvider必须是本地的(非导出的),所以我必须授予另一个应用程序临时读/写权限。文件说:

通常,您应该使用Intent.FLAG\u GRANT\u READ\u URI\u权限或 Intent.FLAG\授予\写入\ URI\权限,意图用于 启动活动,而不是直接启动此功能。如果你用这个 函数,您应该确保调用revokeUriPermission(Uri, int)当目标不再被允许访问它时

很公平,因为我不需要打开活动,也不需要显式启动服务(其他应用程序在时间到来时只需要请求该文件),我认为我可以简单地:

Uri newFileUri = FileProvider.getUriForFile(this, AUTHORITY, file);
grantUriPermission(OTHER_APP_PACKAGE_NAME, newFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
令我惊讶的是,我仍然得到了安全例外:

java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{42ee0b98 5878:example.com.myapplication3/u0a82} (pid=5878, uid=10082) that is not exported from uid 10081
经过几次实验,我发现我必须至少通过一次意图调用另一个应用程序:

Intent intent = new Intent();
intent.setClassName(OTHER_APP_PACKAGE_NAME, OTHER_APP_SERVICE_NAME);
startService(intent);
只要我这样做,我就可以按预期完成所有事情——我可以删除这个意图代码,甚至可以重新安装这两个应用程序,它仍然可以工作(!)。似乎有一个隐藏的要求,所有者必须至少调用另一个应用程序一次,并将其存储在系统中的某个位置

这有文件记录吗

编辑:首先,我认为我必须使用Intent.FLAG\u GRANT\u READ\u URI\u PERMISSION标志,但这似乎不是必需的