前置条件:
1.权限:
<!-- 网络权限,不用在程序中动态申请 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 外部存储读写,需要在程序中动态申请,用于存储运行日志,以及下载的升级版本-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- 安装APK权限,需要在程序中动态申请,并且不同于外部存储读写权限申请 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
2.后端告诉了我们有升级,且有下载文件的路径
第一步,下载apk:
private void downloadNewVersion(String uri) {
clearDownloadFiles();
Log.e("", "正在下载最新版本...");
// 创建下载请求
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(uri));
request.setTitle("新版本下载");
request.setDescription("正在下载最新版本...");
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
String filePath = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getPath() + "/new_version.apk";
request.setDestinationUri(Uri.fromFile(new File(filePath)));
// 开始下载
DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
long downloadId = downloadManager.enqueue(request);
// 监听下载完成事件
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (id == downloadId) {
is_install = true;
String filePath = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getPath() + "/new_version.apk";
File downloadedFile = new File(filePath);
// 下载完成,启动安装程序
// installNewVersion(context,downloadedFile);
// TextView t = (TextView) findViewById(R.id.tv_keycode);
// t.setText("下载完成,安装中...");
installApp(filePath);
}
}
};
registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
第二步安装:
private void installApp(String path) {
Log.e("----", "进入安装");
File apkFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getPath(), "new_version.apk");
if (apkFile.exists()) {
if (is_machine) {
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// Android 7.0 及以上版本需要使用 FileProvider
Log.e("-----", BuildConfig.APPLICATION_ID);
uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", apkFile);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Log.e("----", "7.0以上授权");
} else {
uri = Uri.fromFile(apkFile);
}
intent.setDataAndType(uri, "application/vnd.android.package-archive");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
//销毁副屏
if (secondary != null) {
secondary.dismiss();
secondary = null;
}
Log.e("----", "执行了startActivity");
}
} else {
Log.e("----", "文件不存在");
Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
}
}
结果:
要注意,adb安装的应用并不能完全升级,出现类似以下的页面就证明使用成功了