权限拒绝:打开提供程序 android.support.v4.content.FileProvider

3
我在尝试在安卓模拟器中进行应用程序升级时遇到了一些问题。情景流程如下:我会从一个Activity中执行AsyncTask A,打开fragment A。然后在AsyncTask A中,我将检查版本是否可升级。
如果可升级并且用户从fragment A中选择“Okay”,我将继续执行AsyncTask B来打开fragment B,向用户显示正在进行升级的消息。在AsyncTask BdoInBackground()中,我将执行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

意图错误信息告诉我“解析包时出现了问题”。

你在logcat中看到任何错误吗?你是否查看了我在SO中的答案,以正确处理文件URI暴露异常? - Sagar
@Sagar 是的,我也尝试了同样的方法。唯一的错误是:请求uid 10085需要声明权限android.permission.REQUEST_INSTALL_PACKAGES和提供的未识别操作:android.intent.action.PACKAGE_REPLACED。 - user7691120
1
@Sagar 我从UI界面收到了一个新的错误,说有一个解析包的错误。当我检查logcat时,我得到了这个:Error staging apk from content URI java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{df5eecd 6335:com.google.android.packageinstaller/u0a20} (pid=6335, uid=10020) that is not exported from UID 10085 - user7691120
@Sagar 我明白,但我在哪里执行那段代码?我在执行install()之前执行吗? - user7691120
@Sagar,我已经粘贴了代码,但仍然出现相同的错误信息:( 错误提示说有一个解析包的错误。 - user7691120
显示剩余6条评论
1个回答

5

你可以尝试合并

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);

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接