现在应用都有自动更新提示, 升级后自动安装, 但是8.0后谷歌需要添加安装未知来源应用权限,否则不会自动安装的,所以下面我们适配一下8.0, 有两种方法:
第一种方法
首先我们要在清单文件中添加请求权限
<!-- 8.0安装apk权限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
我们主要讲下载后安装的适配问题,下载apk的逻辑大家可以自行百度一下,或者可以直接评论需要下载源码,那我会打包发给你,当我们下载成功后
public static final int INSTALL_PACKAGES_REQUESTCODE = 9999;
/**
* 请求权限 path apk下载成功后路径
*/
public static void judgeApkPermissions(final Activity activity, String path){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//请求安装权限
boolean b = activity.getPackageManager().canRequestPackageInstalls();
if (b) {
//如果请求成功了,可以直接安装
installAPk(activity, path);//安装应用的逻辑(写自己的就可以)
} else {
//请求安装未知应用来源的权限
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.REQUEST_INSTALL_PACKAGES}, INSTALL_PACKAGES_REQUESTCODE);
}
} else {
installAPk(activity, path);
}
}
//安装apk
public static void installAPk(Context context, String filePath) {
if (!TextUtils.isEmpty(filePath)){
File apkFile = new File(filePath);
Intent intent = new Intent(Intent.ACTION_VIEW);
// 由于没有在Activity环境下启动Activity,设置下面的标签
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N) { //判读版本是否在7.0以上
//参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致 参数3 共享的文件
Uri apkUri = FileProvider.getUriForFile(context, HexCommonFileProvider.shareProvider().getFileProviderName(), apkFile);
//添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
}else{
intent.setDataAndType(Uri.fromFile(apkFile),
"application/vnd.android.package-archive");
}
context.startActivity(intent);
}
}
然后我们在请求权限页面添加权限返回方法
protected static final int GET_UNKNOWN_APP_SOURCES = 9998;
@Override
protected void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case HexInstallApkUtils.INSTALL_PACKAGES_REQUESTCODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//当权限被允许后,直接开始安装
HexInstallApkUtils.installAPk(CourseMainActivity.this, filePath);
} else {
//当权限未被允许,弹出alert 提示用户需要
new HexSweetAlertDialog(CourseMainActivity.this, HexSweetAlertDialog.NORMAL_TYPE, true)
.setTitleText(getResources().getString(R.string.hex_update_tip))
.setConfirmText(getResources().getString(R.string.hex_update_open))
.setCancelText(getResources().getString(R.string.hex_update_cancel))
.setCancelClickListener(new HexSweetAlertDialog.OnSweetClickListener() {
@Override
public void onClick(HexSweetAlertDialog hexSweetAlertDialog) {
hexSweetAlertDialog.dismiss();
}
})
.setConfirmClickListener(new HexSweetAlertDialog.OnSweetClickListener() {
@Override
public void onClick(HexSweetAlertDialog hexSweetAlertDialog) {
hexSweetAlertDialog.dismiss();
//BuildConfig 一定要是主项目的包名
Uri packageURI = Uri.parse("package:" + BuildConfig.APPLICATION_ID);
//注意这个是8.0新API
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
startActivityForResult(intent, GET_UNKNOWN_APP_SOURCES);
}
}).show();
}
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case GET_UNKNOWN_APP_SOURCES:
HexInstallApkUtils.judgeApkPermissions(CourseMainActivity.this, filePath);
break;
}
}
如果请求安装权限通过的话,就直接开始安装了
如果没有通过的话,弹出alert,提示用户需要打开安装权限,如果用户允许后,就会出现下面页面
当用户将允许来自此来源应用开关打开后, 就开始直接安装
第二种方法
public static boolean installApp(Activity activity, String filePath) {
try {
Intent intent = getInstallAppIntent(activity, filePath);
if (intent != null && activity.getPackageManager().queryIntentActivities(intent, 0).size() > 0){
activity.startActivity(intent);
}
return true;
} catch (Exception e) {
HexLog.e(e.getMessage());
}
return false;
}
可以不用请求安装未知来源权限, 下载成功后直接调用该方法.就可以直接安装了,比第一种的方法要简单