应用程序内安装apk没有完成页面或者有完成页面点击打开无反应

先来一个出问题的工厂方法

public class Installer {
    public static void install(Context context, String filePath) {
        File apkFile = new File(filePath);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            String authority = MrDeviceIdUtil.getPackageName(context) + ".fileprovider";
            Uri contentUri = FileProvider.getUriForFile(context, authority, apkFile);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
        }
        context.startActivity(intent);
    }
}

方法兼容了7.0的安装。但是下载完成点击安装之后,一些手机没有完成页面,一些手机有完成页面但是点击打开没有反应。
仔细想了一下,问题应该是intent的身上。果不其然,intent的标志位写成了setFlags,造成只有一个标志位存在。
这里总结一下setFlags和addFlags的区别:
两个方法的区别是setflags是直接给intent设置新的flag,清除原有的flag,addflag是在已有flag上添加新的flag。
标志位用的是二进制数,每一位为1代表着一个标志,例如1,10,100,1000分别代表着不一样的标志(其值分别是1,2,4,8)。以下是stackoverflow上的回答,很简单易懂:

// value of flags: 1
intent.setFlags(2|4); 
// now flags have this value: 110
intent.addFlags(8); 
// now flags have this value: 1110

so,改正一下代码

public class Installer {
    public static void install(Context context, String filePath) {
        File apkFile = new File(filePath);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            String authority = MrDeviceIdUtil.getPackageName(context) + ".fileprovider";
            Uri contentUri = FileProvider.getUriForFile(context, authority, apkFile);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
        }
        context.startActivity(intent);
    }
}

你可能感兴趣的:(应用程序内安装apk没有完成页面或者有完成页面点击打开无反应)