1.网上找了一些,不是不好用,就是差点东西...所以自己做了一个可用的,以后备用
首先先看代码吧,直接复制就可以使用
在一个按钮事件中,写入一个方法来检查版本
checkVersion();
private void checkVersion() {
Ba().showDialog(this, "正在检查版本...");
//获取service_ip
//String server_ip = "http://172.19.128.53:8080";
//这里是从配置文件中获取的服务器的地址,你可以删除根据自己的写
String server_ip = Ge("server_ip");
String hostUrl = server_ip + "/api/mdd/appVersion/selectVersion";
//如果第一次安装没有配置文件需要进入配置界面配置
if ("".equals(server_ip) || server_ip == null || "noFile".equals(server_ip)) {
//这里如果获取不到配置文件中的地址,就走到设置页面去设置
//系统未设置 走到设置端
startActivity(new intent(mContext, CommonSe));
return;
}
String versionCode = null;
try {
versionCode = ().
getPackageInfo(), 0).versionName;
} catch e) {
e.printStackTrace();
}
//这里一定要注意,这里获取的是build.gradle中的那个versionnum的值.
//请求参数
HashMap<String, String> param = new HashMap<String, String>();
("version", versionCode);//1.这个是本地存储的版本号
("apptype", "0");//0是安卓 //1是苹果
hostUrl = H(hostUrl, param);
Type type = new TypeToken<CommonResult<VersionInfo>>() {
}.getType();
// HashMap<String, String> header = new HashMap<String, String>();
// ("Authorization", "Bearer " + Ba().getToken());
//这里根据需要看,后台需不需要验证,需不需要添加token验证.
OkHttprequest<CommonResult<VersionInfo>> request1 = new OkHttpRequest<CommonResult<VersionInfo>>("POST", hostUrl, null, null, null, type, new OkH;CommonResult<VersionInfo>>() {
@Override
public void callBack(CommonResult<VersionInfo> result) {
//返回请求结果
Ba().closeDialog();//这个是弹出的蒙版框,这个之前有博文写过
if () != 200) {
//1.这里如果系统启动,请求版本检测失败就退出系统
//if () != 200 || re() == null) {
Toa, "系统错误,请稍后再试", Toa).show();
finish(); //这里可以添加 Sy(0)退出系统
return; //返回就可以了,不继续处理
}
final VersionInfo versionInfo = re();
if (versionInfo == null) { //2.如果系统没有返回信息,表示没有新版本
Toa, "当前已是最新版本!", Toa).show();
//如果没有新版本就可以进入系统了,这里根据自己需要打开自己的系统.
return;
}
//1.除了系统出错,以及是最新版本以外,正常返回以后,弹出确认是否更新到最新版本弹框.
final Aler normalDialog =
new Aler);
normalDialog.setTitle("提醒");
normalDialog.setMessage("是否更新到最新版本?");
normalDialog.setPositiveButton("确定",
new DialogIn() {
@Override
public void onClick(DialogInterface dialog, int which) {
//2.如果用户点击确认更新到最新版本,就调用更新版本方法
//把返回的新版本信息,传到uploadVersion中去
uploadVersion(versionInfo);
}
});
normalDialog.setNegativeButton("取消",
new DialogIn() {
@Override
public void onClick(DialogInterface dialog, int which) {
//当用户点击取消去判断该版本是否是强制更新版本
//如果用户点击取消,这里做的是这样,先判断该版本是否需要强制升级
//如果需要强制升级,那么系统退出不让用户使用了,如果非强制升级
//就进入系统让用户继续使用.
i(re().getForcea())) && re().getForcea() == 1){ //这里根据返回的信息,看看是否该版本需要强制安装
//强制更新 不允许进入系统
finish();
Sy(0);//强制更新,选择了取消,可以退出系统.
}else{ //不是强制更新 取消 进入原来版本系统
//这里如果用户点击了取消,并且该版本不是强制更新版本,就
//允许用户进入之前版本系统,根据自己需求写
finish();
}
}
});
// 显示
normalDialog.show();
}
}, new OkH() {
@Override
public void errorBack(String msg) {
Ba().closeDialog();
Toa, "服务暂时不可用:"+msg, Toa).show();
Toa, "请检查服务配置", Toa).show();
startActivity(new Intent(mContext, CommonSe));
finish(); //关闭当前程序
//如果服务不可用,有可能是访问后台访问不到,这个时候可以,打开设置页面,去
//配置后台地址.等配置
//
}
});
reque();
}
2.然后再看下一个方法uploadVersion
private void uploadVersion(VersionInfo versionInfo) {
//1.首先去下载安装包,安装包的地址在,请求后台,返回的内容里
//Ba().showDialog(this, "正在安装,请稍等。。");
Ba().showDialog(this, "正在下载安装包..");
//2.这里相当于给安装重新命名
String imgNameOri = "ydy_" + ver();
//3.可以看到这里把安装包,放到了安装目录的/ydy_store的文件夹中去了
String filesDir = Ba().getExternalfilesDir(
Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/ydy_store";
File pictureDirOri = new File(filesDir);
if (!()) {
();
}
//1.这种方式安装以后会把安装包删除掉
try {
final File file = File.createTempFile(
imgNameOri, /* prefix */
".apk", /* suffix */
pictureDirOri /* directory */
);
+ ver()
//2.这里是获取fastdfs的服务器地址,apk安装包是放到fastdfs上的.
String img_ip = Ge("img_ip");
String hostUrl = img_ip + "/"+ ver();
//3.获取安装包地址,然后通过okhttp,发送请求获取下载.
OkHttpRequest<String> request = new OkHttpRequest<String>("POST", hostUrl, null, null, null, S, new OkH;String>() {
//OkHttpRequest<String> request = new OkHttpRequest<String>("POST", DeviceFinal.FILE_SERVICE + ver(), null, null, null, S, new OkH;String>() {
@Override
public void callBack(String filePath) {
Ba().closeDialog();
//1.这里等待安装包下载成功以后,然后开始执行installAPK安装
Toa, "下载成功!开始安装..", Toa).show();
installAPK(file);
}
}, new OkH() {
@Override
public void errorBack(String msg) {
Toa, "版本文件下载失败,请稍后再试", Toa).show();
finish();
Sy(0);//如果出错以后就退出系统
}
});
reque(file);
} catch (IOException e) {
e.printStackTrace();
}
}
3.下载以后,就开始安装apk文件,执行installAPK方法
private void installAPK(File savedFile) {
//1.传入下载的文件 这里要注意,启动的intent这里是一个动作
//打开安装界面的动作,不是启动一个activity
Intent intent = new Intent();
in);
in);
//2.这里需要做判断如果sdk的版本大于24的话,那么共享文件就不能用
//file:// 直接获取了需要用到FileProvider 共享文件,这个需要做一些配置后面说
if >= Build.VERSION_CODES.N) {
in);
Uri uri = FileProvider.getUriForFile(this, "com.baidu.idl.;, savedFile);
in(uri, "application;);
} else {
//3.如果系统sdk,小于24 就可以直接获取文件就可以了.
in(savedFile), "application;);
}
//3.启动安装程序
startActivity(intent);
Ba().closeDialog();
finish(); //结束当前程序安装新版本程序
Sy(0);//安装以后结束程序,重新启动打开新程序
}
4.这个过程中,需要,首先,添加权限,这个必须要在:app\src\main\AndroidMani添加
否则不报错,也不显示有问题不好查原因,但就是不能用,不会弹出安装界面
<!-- 安装权限-->
<uses-permission android:name="android.; />
5.然后代码中用到的FileProvider配置,也有一篇文章是说FileProvider怎么用的,这里再提一下吧
先找到自己的applicationid 在build.gradle中:
然后在app\src\main\AndroidMani文件中:
<provider
android:name="androidx.core.con;
android:authorities="com.baidu.idl.;//这里就是applicationid+fileprovider
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.;
android:resource="@xml/update_file_paths" />
</provider>
添加上配置
然后再创建xml文件夹,然后创建xml文件:app\src\main\res\xml\u
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android=";>
<external-path name="external_path" path="." />
</paths>
这样就可以了.
1.《关于安卓系统app怎么更新,你需要知道这些安卓原生开发_apk在线升级_实现安装未知来源应用_亲测可用》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《关于安卓系统app怎么更新,你需要知道这些安卓原生开发_apk在线升级_实现安装未知来源应用_亲测可用》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/gl/3065565.html