美文网首页Android技术进阶Android 自定义控件
解析包时出现问题 Android - file provider

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

作者: 蜗牛学开车 | 来源:发表于2019-08-29 18:04 被阅读5次

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

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


    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<ResolveInfo> 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<ResolveInfo> 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

        本文链接:https://www.haomeiwen.com/subject/swhwectx.html