应用更新时apk包解析错误

bug场景:

应用内升级下载apk完成后安装,6.0及以下的手机会报解析包错误,7.0及以上的手机是没问题的。开始以为是v1,v2签名问题导致的,但是我用浏览器下载下来的安装包是能够正确安装的。排除v1,v2签名的问题。研究半天终于发现问题所在:

原来我把下载的apk文件放在了getCacheDir().getAbsolutePath()的目录下,而不是sd中,这就导致apk文件没有相应的权限,不能被正确解析。

参考:解决APK下载到Cache目录安装提示“解析安装包失败”的问题

解决方案1:

调用安装的时候给文件授权:

public static void install(Context context, File apkFile) {
    try {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setDataAndType(FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider", apkFile), "application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        } else {
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
            chmod("777", apkFile.getAbsolutePath());//apk放在cache文件中,需要获取读写权限
        }
        App.getApp().startActivity(intent);
    } catch (Exception e) {
        HbLogger.log("---> install apk fail :" + e.getMessage());
    }
}

public static   void chmod(String permission, String path) {
    try {
        String command = "chmod " + permission + " " + path;
        Runtime runtime = Runtime.getRuntime();
        runtime.exec(command);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
解决方案2:

将下载的apk放在sd文件中:Environment.getExternalStorageDirectory().getAbsolutePath()

亲测两种方案均能解决问题。

补充:

可能有的小伙伴有疑惑了:为什么7.0以上的手机没有文件授权也能正确解析安装呢?这就涉及到7.0以上文件权限的变更了,查看以上代码可知,在安装的时候我做了版本判断,如果是7.0以上的手机,会采用新的权限机制安装。所以不会出现解析错误的bug,在此再贴一下代码:


猜你喜欢

转载自blog.csdn.net/anyanyan07/article/details/80332762