关于Android6.0和7.0下载安装apk出现的问题

原因:Android N对访问文件权限收回,按照Android N的要求,若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。
而进行此授权的最简单方式是使用 FileProvider类
APP下载更新,所有的APP都有这样的功能,在6.0之前都是这么写的:

 public void installAPK(Activity context, String saveFileName, String md5) {
    File apkFile = new File(saveFileName);
    if (!apkFile.exists()) {
        return;
    }
    try {
        String fileMd5 = MD5Utils.getFileMD5String(apkFile);
        if (md5.equalsIgnoreCase(fileMd5)) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(Uri.parse("file://" + apkFile.toString()), "application/vnd.android.package-archive");
            context.startActivity(intent);
        } else {
            ToastUtil.makeText(context, "安装包已损坏,请重新下载安装", Toast.LENGTH_SHORT).show();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

但是6.0之后这样写部分手机会调不起来这个intent,是因为文件的uri地址不对。
7.0之后文件共享需要使用FileProvider的功能,uri的获取又不一样了。
因此,为了兼容这个问题,下面就给出正确的解决办法。

第一步,manifest文件中加入:






第三步,修改代码:

 /**
 * 下载完成后自动安装apk
 */
public void installAPK(Activity context, String saveFileName, String md5) {
    File apkFile = new File(saveFileName);
    if (!apkFile.exists()) {
        return;
    }
    try {
        String fileMd5 = MD5Utils.getFileMD5String(apkFile);
        if (md5.equalsIgnoreCase(fileMd5)) {
            openFile(apkFile, context);
        } else {
            ToastUtil.makeText(context, "安装包已损坏,请重新下载安装", Toast.LENGTH_SHORT).show();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

}

/**
 * 重点在这里
 */
public void openFile(File file, Context context) {
    Intent var2 = new Intent();
    var2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    var2.setAction(Intent.ACTION_VIEW);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Uri uriForFile = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", file);
        var2.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        var2.setDataAndType(uriForFile, "application/vnd.android.package-archive");
    } else {
        var2.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
    }
    try {
        context.startActivity(var2);
    } catch (Exception var5) {
        var5.printStackTrace();
        ToastUtil.makeText(context, "没有找到打开此类文件的程序", Toast.LENGTH_SHORT).show();
    }
}

这样就可以喽。

你可能感兴趣的:(关于Android6.0和7.0下载安装apk出现的问题)