Android N 后,由于不能访问私有路径,需要设置成共享文件
/**
* android N 执行此安装方法
*
* @param context 上下文
* @param file 文件路径
*/
public static void installAPK(Context context, File file) {
// 获取下载好的 apk 路径
Intent intentN = new Intent(Intent.ACTION_VIEW);
// 由于没有在Activity环境下启动Activity,设置下面的标签
intentN.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致 参数3 共享的文件
Uri apkUri = FileProvider.getUriForFile(context, "world.letsgo.booster.android.FileProvider", file);
//添加这一句表示对目标应用临时授权该Uri所代表的文件
intentN.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intentN.setDataAndType(apkUri, "application/vnd.android.package-archive");
context.startActivity(intentN);
}
/**
* android N 以下安装apk
*/
public static void promptInstall(Context context, Uri date) {
Intent promptInstall = new Intent(Intent.ACTION_VIEW)
.setDataAndType(date, "application/vnd.android.package-archive");
// FLAG_ACTIVITY_NEW_TASK 可以保证安装成功时可以正常打开 app
promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(promptInstall);
}
有可能系统下载功能被禁用,故需要判断该系统功能是否可用
/**
* 判断 系统下载功能是否可用
*
* @return true 可用 false 不可用
*/
static boolean downLoadMangerIsEnable(Context context) {
try {
int state = context.getApplicationContext().getPackageManager()
.getApplicationEnabledSetting("com.android.providers.downloads");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
return !(state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED ||
state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
|| state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED);
} else {
return !(state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED ||
state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER);
}
} catch (Exception e) {
LoggerUtils.debugAndSave(e.getMessage());
}
return false;
}