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

权限拒绝:打开提供程序android。支持v4.content。文件提供者

鲍驰
2023-03-14

我在尝试在Android emulator中执行应用程序升级时遇到了一些问题。该场景的流程来自一个活动,我将执行打开片段A的AsyncTask A,然后在AsyncTask A中,我将检查版本升级是否可用。

如果可用并且用户从片段A中选择了“OK”,我将转到AsyncTask B打开片段B,它向用户显示一条消息,说明正在进行升级。在AsyncTask B doInbackground()中,我将执行install(),在onPostExecute()中,我将显示成功消息。

在执行安装的AsyncTask B中:

@Override
protected Boolean doInBackground(Void... params) {
boolean ret= viewmodel.installApk(mActivity);
return ret;
}

在我的视图模型类中:

public boolean installApk(Activity mActivity){
    boolean success = false;
    String fullPath = scanDirectoryForApk();

    System.out.println("INSTALLING APK ......................... ");

    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri apkURI = FileProvider.getUriForFile(mActivity, mActivity.getApplicationContext().getPackageName() + ".provider", new File(fullPath));
    intent.setDataAndType(apkURI, "application/vnd.android.package-archive");
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mActivity.startActivity(intent);
    return true;
 }

然而,当我执行上面的代码时,没有显示错误消息,版本升级也无法正常工作。它基本上只是重新启动意图,根本没有升级。

它也不会提示我安装新版本的权限。有什么想法吗?

顺便说一句,我的android模拟器没有root,因此我无法使用“su”命令方法。

谢谢

编辑

根据@Sagar的建议,我将上面的代码更改为:

Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri apkURI = FileProvider.getUriForFile(mActivity, mActivity.getApplicationContext().getPackageName() + ".provider", new File(fullPath));

    List<ResolveInfo> resInfoList = mActivity.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    for (ResolveInfo resolveInfo : resInfoList) {
        String packageName = resolveInfo.activityInfo.packageName;
        mActivity.grantUriPermission(packageName, apkURI, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    }

    intent.setDataAndType(apkURI, "application/vnd.android.package-archive");
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mActivity.startActivity(intent);

我从logcat收到新的错误消息:

Error staging apk from content URI
java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{3883c8 9647:com.google.android.packageinstaller/u0a20} (pid=9647, uid=10020) that is not exported from UID 10085

intent错误消息告诉我“分析包时出现问题”。

共有1个答案

裴彦
2023-03-14

您可以尝试合并

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

进入

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK);

我遇到了和你一样的问题,这个解决方案拯救了我自己。

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

  • 并且我在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

  • 我有两个app:app1和app2。 App2具有: paths.xml: App2在其活动中从App1接收获取映像URI的请求。确定URI后,App2活动执行以下操作: 从App2接收回结果后,App1执行以下操作: 在App1中,从App2返回时,我得到以下异常: java.lang.SecurityException:权限拒绝:从ProcessRecord{52a99eb0 3493:com

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

  • 我开始图像拾取器的意图使用: 在中,我获取所有选中图像的URI,启动在后台运行的作业并上传这些图像(https://github.com/yigit/android-priority-jobqueue)。但如果按下“后退”按钮并退出活动,则任何未启动的作业在运行并抛出异常时都无法访问选定的映像: java.lang.SecurityException:拒绝权限:从ProcessRecord{...

  • 我遇到了问题,我尝试在我的comsumer应用程序中实现内容提供程序: 这是我从App A(提供商)获得的Android清单: 这是我从App B(消费者)获得的Android清单: 应用程序A得我得提供商: process:com.erlanggakmoekasan.favoritemovies,pid:27146 java.lang.runtimeException:无法启动活动Compone