解析包时出现问题 Android - file provider - permission denial。

玄学Bug某些手机某些应用上出现

今天在开发的过程中发现了一个神奇的Bug。就是当APK下载完成后调起系统安装时出现解析包时出现错误。
而相同的代码在项目B中是好的,到了项目A中就出现了,而项目A部署在A手机中是好的而B手机中就出现了。


解析包时出现问题 Android - file provider - permission denial。_第1张图片
Bug截图

下面是出现问题的代码(调起系统安装Apk的代码)

public static boolean installApk(Context context, File apkFile) {
    if (apkFile == null || !apkFile.exists()) {
        return false;
    }
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addCategory("android.intent.category.DEFAULT");
    // 判断版本大于等于7.0
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        // 给目标应用一个临时授权
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        Uri uri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileProvider", apkFile);
        intent.setDataAndType(uri, context.getContentResolver().getType(uri));
    } else {
        intent.setDataAndType(Uri.fromFile(apkFile), getIntentType(apkFile));
    }
    context.startActivity(intent);
    try {
        android.os.Process.killProcess(android.os.Process.myPid());
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

有人说是intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)的问题,还有人说是intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)的问题,还有人说是killProcess导致的。
我都试过了,根本没有解决。
最后终于在stackoverflow上找到了解决方案,就是添加下面的代码。

List resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
    context.grantUriPermission(resolveInfo.activityInfo.packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}

最终的代码:

public static boolean installApk(Context context, File apkFile) {
    if (apkFile == null || !apkFile.exists()) {
        return false;
    }
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addCategory("android.intent.category.DEFAULT");
    // 判断版本大于等于7.0
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        // 给目标应用一个临时授权
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        Uri uri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileProvider", apkFile);
        intent.setDataAndType(uri, context.getContentResolver().getType(uri));

        List resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        for (ResolveInfo resolveInfo : resInfoList) {
            context.grantUriPermission(resolveInfo.activityInfo.packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }
    } else {
        intent.setDataAndType(Uri.fromFile(apkFile), getIntentType(apkFile));
    }
    context.startActivity(intent);
    try {
        android.os.Process.killProcess(android.os.Process.myPid());
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

由于这个问题比较坑爹所以在这里记录一下,也许能帮到跟我一样倒霉的人。

你可能感兴趣的:(解析包时出现问题 Android - file provider - permission denial。)