当前位置: 首页 > 知识库问答 >
问题:

Android-文件提供程序-拒绝权限

蓬思博
2023-03-14

我有两个app:app1和app2。

App2具有:

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.android.provider.ImageSharing"
        android:exported="false"
        android:grantUriPermissions="true" >
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/paths" />
</provider>

paths.xml:

<paths>

     <files-path name="my_images" path="images/"/>

</paths>

App2在其活动中从App1接收获取映像URI的请求。确定URI后,App2活动执行以下操作:

Intent intent = new Intent();

intent.setDataAndType(contentUri, getContentResolver().getType(contentUri));

int uid = Binder.getCallingUid();
String callingPackage = getPackageManager().getNameForUid(uid);

getApplicationContext().grantUriPermission(callingPackage, contentUri,
                    Intent.FLAG_GRANT_READ_URI_PERMISSION);

setResult(Activity.RESULT_OK, intent);
finish();

从App2接收回结果后,App1执行以下操作:

Uri imageUri = data.getData();
if(imageUri != null) {
    ImageView iv = (ImageView) layoutView.findViewById(R.id.imageReceived);
    iv.setImageURI(imageUri);
}

在App1中,从App2返回时,我得到以下异常:

java.lang.SecurityException:权限拒绝:从ProcessRecord{52a99eb0 3493:com.android.app1.app/U0a57}(PID=3493,uid=10057)打开提供程序Android.support.v4.content.FileProvider,而该提供程序不是从uid 10058导出的

我做错了什么?

共有1个答案

张嘉
2023-03-14

解决这一问题的唯一方法是向所有可能需要它的包授予权限,如下所示:

List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
    String packageName = resolveInfo.activityInfo.packageName;
    context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
 类似资料:
  • 并且我在App2清单中添加了权限: 但我得到了这个错误: java.lang.SecurityException:拒绝权限:从ProcessRecord{46a1928 24678:com.x.x.myApplication11/U0a165}(PID=24678,UID=10165)打开提供程序com.x.x.adminapp.read_database或com.x.x.adminapp.wri

  • 我在尝试在Android emulator中执行应用程序升级时遇到了一些问题。该场景的流程来自一个活动,我将执行打开片段A的AsyncTask A,然后在AsyncTask A中,我将检查版本升级是否可用。 如果可用并且用户从片段A中选择了“OK”,我将转到AsyncTask B打开片段B,它向用户显示一条消息,说明正在进行升级。在AsyncTask B doInbackground()中,我将执

  • 我已经创建了一个自定义内容提供者,它将被更多的应用程序访问。我已经在我的提供者AndroidManifest中包含了权限标记。xml文件,在第二个应用程序中,我包含了uses-permissions标记,但没有成功。Logcat向我展示: 我也搜索过类似的问题,但似乎一切都是正确的。有什么想法吗?谢谢 这是我的提供者AndroidManifest。xml文件: 这是我的第二个应用程序Android

  • 我尝试生成一个CSV文件(加速度计的),将其保存到我的,然后使用FileProvider将其共享到Google Drive。 根据其他人的建议添加了和。 我尝试写入,但由于我的电话没有外部存储,因此无法运行。 我无法导出提供程序,因为它也会引发错误。 那我能做什么呢?或者这是生成和共享CSV文件的更好方法吗?如有任何建议,我将不胜感激。谢谢你们,伙计们。 当前代码段 在AndroidManifes

  • 我使用的是react模块react native image picker(https://github.com/marcshilling/react-native-image-picker)选择视频并获取视频URI。然后使用本地视频(https://github.com/brentvatne/react-native-video)播放选定的URI。但它不起作用。使用adb logcat,我发现它

  • java.lang.SecurityException:权限拒绝:从ProcessRecord{932688f 12849:mobi.hubbler.app/U0A158}(PID=12849,uid=10158)打开提供程序com.miui.gallery.provider.GalleryOpenProvider,而该提供程序不是从uid 10034导出的 试图从URI获取位图。这个问题只发生在