繁体   English   中英

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

[英]Permission Denial: opening provider android.support.v4.content.FileProvider

尝试在Android模拟器中执行应用程序升级时遇到问题。 该场景的流程来自Activity,我将执行AsyncTask A ,这将打开片段A ,然后在AsyncTask A中 ,我将检查版本升级是否可用。

如果可用并且用户从片段A中选择“确定”,我将继续进行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仿真器没有植根,因此我不能使用“ 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.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);

我遇到了与您相同的问题,此解决方案使我自救了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM