android适配6.0\7.0\8.0升级直接安装APP

android的升级功能基本是必不可少的,但是google也是不断地为我们开发人员设置“障碍”,从6.0到7.0,再到8.0都需要作出相应调整。*近加班终于搞出来来了一套可以使用的代码,故写下来,作为笔记,也使各位同行能够指导一下。
如果按照这篇文章,我保你能完成升级功能

前期准备
三个:

权限申请框架AndPermission
AndroidNetworking框架引入
7.0文件适配
一、权限申请框架AndPermission

这个框架是我用过的*好用的,当然我用的也不多,我也写了*新的框架集成

二、AndroidNetworking框架引入

导包

implementation ‘com.amitshekhar.android:android-networking:1.0.2’
1
导包很简单,具体使用在代码中使用吧。

三、7.0文件适配

创建res/xml/file_paths.xml文件
<paths>
<external-path
name=”update”
path=””/>
</paths>

name:一个引用字符串。
path:文件夹“相对路径”,完整路径取决于当前的标签类型。path可以为空,表示指定目录下的所有文件、文件夹都可以被共享。

AndroidManifest.xml文件的”appliction”标签内添加如下语句
<provider
android:name=”android.support.v4.content.FileProvider”
android:authorities=”你的包名.fileprovider”
android:exported=”false”
android:grantUriPermissions=”true”>
<meta-data
android:name=”android.support.FILE_PROVIDER_PATHS”
android:resource=”@xml/file_paths” />
</provider>

android:name:provider你可以使用v4包提供的FileProvider,或者自定义的,只需要在name申明就好了,一般使用系统的就足够了。
android:authorities:类似schema,命名空间之类,后面会用到。
android:exported:false表示我们的provider不需要对外开放。
android:grantUriPermissions:申明为true,你才能获取临时共享权限。

开始升级
直接上代码了
1.一定条件下弹出升级框

new AlertDialog.Builder(DownActivity.this)
.setTitle(“版本更新”)
.setMessage(“发现新的app版本,请及时更新”)
.setNegativeButton(“暂不更新”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setPositiveButton(“立即更新”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

//弹出进度条,先隐藏前一个dialog
dialog.dismiss();
downApk();
}
})
.create().show();

2.接上面方法,使用AndroidNetworking开始下载

/**
* 下载apk
*/
private void downApk() {
AndPermission.with(DownActivity.this)
.runtime()
.permission(Permission.Group.STORAGE)
.onGranted(permissions -> {
//申请成功后的动作
//显示进度的对话框
mDialog1 = new Dialog(DownActivity.this, R.style.Theme_AppCompat_Dialog_Alert);
View view = DownActivity.this.getLayoutInflater().inflate(R.layout.progress_dialog, null);
mProgressBar = view.findViewById(R.id.pb);
mPrecent = view.findViewById(R.id.tv_precent);
mDialog1.setContentView(view);
mDialog1.show();
String fileName = “football.apk”;
String dirPath3 = Utils.getRootDirPath(DownActivity.this);
final File fs = new File(dirPath3 + “/Download/”);
final String TAG = “AA”;

AndroidNetworking.download(downurl, fs.getAbsolutePath(), fileName)
.setTag(“downloadTest”)
.setPriority(Priority.MEDIUM)
.build()
.setDownloadProgressListener(new DownloadProgressListener() {
@Override
public void onProgress(final long bytesDownloaded, final long totalBytes) {
Log.e(TAG, bytesDownloaded+””);
Log.e(TAG+TAG, totalBytes+””);
runOnUiThread(new Runnable() {
@Override
public void run() {
//TODO long类型相除 根据下载进度,设置进度条
long tv_precent = bytesDownloaded * 100 / totalBytes;
mPrecent.setText((int)tv_precent + “%”);
mProgressBar.setProgress((int) tv_precent);
}
});
}
})
.startDownload(new DownloadListener() {
@Override
public void onDownloadComplete() {

Toast.makeText(DownActivity.this, “下载成功”, Toast.LENGTH_SHORT).show();
//调用方法去安装app
toInstall(DownActivity.this);
// }
}

@Override
public void onError(ANError error) {
// handle error
Log.e(TAG, “onError errorDetail : ” + error.getErrorDetail());
}
});
})
.onDenied(permissions -> {
// Storage permission are not allowed.
})
.start();
}

这里先申请读写内存卡权限,然后使用AndroidNetworking下载文件,下载完成后直接去安装

安装app
/**
* 安装apk
* @param context
*/
private void toInstall(Context context) {
File apkFile = getExternalFilesDir(“DownLoad/football.apk”);
/*android版本大于等于8.0*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
/*是否有安装软件的权限*/
boolean canInstall = context.getPackageManager().canRequestPackageInstalls();
if (!canInstall) {
AndPermission.with(DownActivity.this)
.install()
.file(apkFile)
.onGranted(file -> {
installAPK();
})
.onDenied(file -> {
Toast.makeText(context, “请求权限被拒*,无法自动安装软件!!!”, Toast.LENGTH_SHORT).show();
})
.start();
}else{
installAPK();
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
/*androi版本小于7.0*/
installAPK();
}
}

判断android版本是否大于等于8.0,如果是则去判断有无安装未知来源权限,如果不是则直接去走安装流程

开始安装
// >=7.0安装
private void install7() {
Intent install = new Intent(Intent.ACTION_VIEW);
File apkFile = getExternalFilesDir(“DownLoad/football.apk”);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
install.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri uriForFile = FileProvider.getUriForFile(DownActivity.this, “包名.fileprovider”, apkFile);
install.setDataAndType(uriForFile, “application/vnd.android.package-archive”);
} else {
install.setDataAndType(Uri.fromFile(apkFile), “application/vnd.android.package-archive”);
}

install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(install);
}

结尾
我觉得这是一篇很使用的功能,故写下来以后自己可用,也可供各位老师指导。