Android N 后,由于不能訪問私有路徑脊阴,需要設置成共享文件
/**
* android N 執(zhí)行此安裝方法
*
* @param context 上下文
* @param file 文件路徑
*/
public static void installAPK(Context context, File file) {
// 獲取下載好的 apk 路徑
Intent intentN = new Intent(Intent.ACTION_VIEW);
// 由于沒有在Activity環(huán)境下啟動Activity,設置下面的標簽
intentN.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//參數(shù)1 上下文, 參數(shù)2 Provider主機地址 和配置文件中保持一致 參數(shù)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);
}
有可能系統(tǒng)下載功能被禁用豁陆,故需要判斷該系統(tǒng)功能是否可用
/**
* 判斷 系統(tǒng)下載功能是否可用
*
* @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;
}