Android 应用更新提醒自动跳转安装

embedded/2024/9/24 6:19:30/

废话少说,直接上干货

1.首先需要你获取本地的程序版本号

//获取当前版本
public int getAppVersion(Context context) {try {PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);return packageInfo.versionCode;} catch (PackageManager.NameNotFoundException e) {// 应用程序没有找到,这应该不会发生e.printStackTrace();return 0;}
}

2,获取服务器APP版本号

我这里是直接发布到蒲公英平台的,所以我直接调用的蒲公英接口,你们这个发布到哪里就直接调用哪里的接口查询一下最新的版本

3.比较当前版本是否小于服务器的版本,判断是否更新

这里是重点

如果需要更新弹出提示框

我遇到的问题,开始没有弹出提示框,改为子线程中运行

 // 创建一个新的Thread实例Thread thread = new Thread(new Runnable() {@Overridepublic void run() {// 在这里执行你的任务// 这里的代码将在子线程中运行Looper.prepare();AlertDialog.Builder builer = new AlertDialog.Builder(LoginActivity.this) ;builer.setTitle("版本升级");builer.setMessage("软件更新");//当点确定按钮时从服务器上下载 新的apk 然后安装builer.setPositiveButton("确定", (dialog, which) -> downLoadApk(updateInfo.downloadURL));//当点取消按钮时不做任何举动builer.setNegativeButton("取消", (dialogInterface, i) -> {});AlertDialog dialog = builer.create();dialog.show();Looper.loop();}});// 启动线程thread.start();

下载APK方法downLoadApk

protected void downLoadApk(String dowUrl) {//进度条final ProgressDialog pd;pd = new ProgressDialog(this);pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pd.setMessage("正在下载更新");pd.show();new Thread(){@Overridepublic void run() {try {File file = getFileFromServer(dowUrl, pd);//安装APKinstallAPK(file.getAbsolutePath());pd.dismiss(); //结束掉进度条对话框} catch (Exception e) {}}}.start();
}

获取文件下载方法getFileFromServer

public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{//如果相等的话表示当前的sdcard挂载在手机上并且是可用的if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5000);//获取到文件的大小pd.setMax(conn.getContentLength());InputStream is = conn.getInputStream();File file = new File(Environment.getExternalStorageDirectory(), "爱智牧.apk");FileOutputStream fos = new FileOutputStream(file);BufferedInputStream bis = new BufferedInputStream(is);byte[] buffer = new byte[1024];int len ;int total=0;while((len =bis.read(buffer))!=-1){fos.write(buffer, 0, len);total+= len;//获取当前下载量pd.setProgress(total);}fos.close();bis.close();is.close();return file;}else{return null;}
}

下载后跳转安装的方法installAPK

    /*** * @param Path apk路径*/public void installAPK(String Path) {File apkFile = new File(Path);if (!apkFile.exists()){return;}Intent intent = new Intent(Intent.ACTION_VIEW);
//      安装完成后,启动appintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// Android 版本在7.0以上if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {boolean  hasInstallPermission = this.getPackageManager().canRequestPackageInstalls();if (!hasInstallPermission) {//请求安装未知应用来源的权限ActivityCompat.requestPermissions((Activity) this, new String[]{Manifest.permission.REQUEST_INSTALL_PACKAGES}, 6666);}}Uri apkUri = FileProvider.getUriForFile(this, "包名.fileprovider", apkFile);intent.setDataAndType(apkUri, "application/vnd.android.package-archive");this.startActivity(intent);}else {Log.e("安装","-----333----");Uri uri = Uri.parse("file://" + apkFile.toString());intent.setDataAndType(uri, "application/vnd.android.package-archive");}LoginActivity.this.startActivity(intent);}

说明:因为版本的要求,我们这里获取安装路径需要做一些配置,要不下载apk后不会自动跳转到安装界面。

1.在Android.xml中配置相关权限

这个可能还不够,我在我的项目中只添加了这两个,其他的可以百度查询一下。

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<!-- 安装未知来源权限-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

2.在Android.xml中配置provider

<providerandroid:name="androidx.core.content.FileProvider"android:authorities="包名.fileprovider"android:grantUriPermissions="true"tools:replace="android:authorities"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths" />
</provider>

3.在res/xml中新建文件file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><paths><external-path path="" name="download"/></paths>
</resources>

配置好这些才能自动跳转到安装界面


http://www.ppmy.cn/embedded/13008.html

相关文章

真实世界的密码学(一)

原文&#xff1a;annas-archive.org/md5/655c944001312f47533514408a1a919a 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 序言 当你拿起这本书时&#xff0c;你可能会想&#xff0c;为什么又一本关于密码学的书&#xff1f;甚至&#xff0c;为什么我要读这本…

Vue+Echarts 实现中国地图和飞线效果

目录 实现效果准备 实现效果 在线预览&#xff1a;https://mouday.github.io/vue-demo/packages/china-map/dist/index.html 准备 高版本的echarts&#xff0c;不包含地图数据&#xff0c;需要自己下载到项目中 1、地图数据下载 https://datav.aliyun.com/portal/school/at…

QTableView获取可见的行数

场景 当我们需要实时刷新QTableView时&#xff0c;而此时tableView的数据量较大&#xff0c;如果全部刷新显然不合理&#xff0c;如果可以只对用户看的到的数据进行刷新那就最好了&#xff0c;经过一番摸索找到了几种方式&#xff0c;可供参考 代码 方法1 QVector<int>…

禅道安装(非docker 版本)(一键部署版)

1.安装包下载地址 https://www.zentao.net/dl/zentao/18.5/ZenTaoPMS.18.5.zbox_64.tar.gzLinux一键安装包内置了Apache、PHP、MySQL和XXD 服务&#xff0c;不需要再单独安装。 2.上传到linux服务器 scp /Users/admin/Downloads/ZenTaoPMS.18.5.zbox_64.tar.gz root192.168.…

OneFlow新概念清单,AI深度学习的革命性突破(AI写作)

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

单链表的应用

文章目录 目录1. 单链表经典算法OJ题目1.1 [移除链表元素](https://leetcode.cn/problems/remove-linked-list-elements/description/)1.2 [链表的中间节点](https://leetcode.cn/problems/middle-of-the-linked-list/description/)1.3 [反转链表](https://leetcode.cn/problem…

Linux fcntl函数

fcntl函数 读法&#xff1a;file control函数 作用&#xff1a;复制文件描述符、设置/获取文件的状态标志 int fcntl(int fd, int cmd, ... /* arg */ )fd是文件描述符&#xff0c;cmd是命令&#xff08;定义的宏&#xff09;&#xff0c;… 表示可变的参数&#xff08;可有可…

Harmony OS应用开发性能优化全面指南

优化应用性能对于应用开发至关重要。通过高性能编程、减少丢帧卡顿、提升应用启动和响应速度&#xff0c;可以有效提升用户体验。本文将介绍一些优化应用性能的方法&#xff0c;以及常用的性能调优工具。 ArkTS高性能编程 为了提升代码执行速度&#xff0c;进而提升应用整体性…