检测版本更新App

This commit is contained in:
fengjignqi
2026-07-02 08:45:59 +08:00
parent b5e9f0de3b
commit d2610d5b61
19 changed files with 251 additions and 66 deletions

View File

@@ -39,7 +39,7 @@ android {
minSdkVersion 26 minSdkVersion 26
targetSdkVersion 30 targetSdkVersion 30
versionCode 1 versionCode 1
versionName "1.0.1"//version 1.0.0-appstore version 1.0.0-xh versionName "Version 1.0.1"//version 1.0.0-appstore version 1.0.0-xh
// 添加自定义字段 // 添加自定义字段
buildConfigField "String", "APP_VERSION_NAME", "\"${versionName}\"" buildConfigField "String", "APP_VERSION_NAME", "\"${versionName}\""
buildConfigField "int", "APP_VERSION_CODE", "${versionCode}" buildConfigField "int", "APP_VERSION_CODE", "${versionCode}"

View File

@@ -19,6 +19,7 @@ import android.view.WindowManager;
import android.view.animation.Animation; import android.view.animation.Animation;
import android.view.animation.AnimationUtils; import android.view.animation.AnimationUtils;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
@@ -48,8 +49,10 @@ public class DialogAppUpdate {
public static View layoutView; public static View layoutView;
private Dialog mDialog; private Dialog mDialog;
private Activity mContext; private Activity mContext;
private TextView tvTitle,tvContent,tvConfirm,tvCancel; private TextView tvTitle,tvContent,tvConfirm,tvCancel,tvVersionName;
private TextView tvProgressPercent;
private RelativeLayout rlUpdateContent; private RelativeLayout rlUpdateContent;
private LinearLayout llProgressContainer,llButton;
private ImageView imgClose,imgClear; private ImageView imgClose,imgClear;
private String startTime = ""; private String startTime = "";
private String endTime = ""; private String endTime = "";
@@ -84,7 +87,7 @@ public class DialogAppUpdate {
this.mContext = context; this.mContext = context;
this.mIsForceUpdate = isForceUpdate; this.mIsForceUpdate = isForceUpdate;
this.mVersionBean = bean; this.mVersionBean = bean;
mDwonLoadUrl = bean.getVersionUrl(); mDwonLoadUrl = bean.getDownloadUrl();
mDialog = new Dialog(context, R.style.ActionSheetDialogStyle); mDialog = new Dialog(context, R.style.ActionSheetDialogStyle);
//填充对话框的布局 //填充对话框的布局
layoutView = LayoutInflater.from(context).inflate(layoutId, null); layoutView = LayoutInflater.from(context).inflate(layoutId, null);
@@ -122,29 +125,28 @@ public class DialogAppUpdate {
dialogWindow.setAttributes(lp); dialogWindow.setAttributes(lp);
} }
tvTitle = layoutView.findViewById(R.id.tv_title); tvTitle = layoutView.findViewById(R.id.tv_title);
tvVersionName = layoutView.findViewById(R.id.tv_version);
tvContent = layoutView.findViewById(R.id.tv_update_content); tvContent = layoutView.findViewById(R.id.tv_update_content);
tvConfirm = layoutView.findViewById(R.id.tv_update); tvConfirm = layoutView.findViewById(R.id.tv_update);
tvCancel = layoutView.findViewById(R.id.tv_cencel); tvCancel = layoutView.findViewById(R.id.tv_cancel);
progressBar = layoutView.findViewById(R.id.progress_bar); progressBar = layoutView.findViewById(R.id.progress_bar);
rlUpdateContent = layoutView.findViewById(R.id.rel_file_content); rlUpdateContent = layoutView.findViewById(R.id.rel_file_content);
llProgressContainer = layoutView.findViewById(R.id.ll_progress_container);
llButton = layoutView.findViewById(R.id.Linear_button);
tvConfirm.setOnClickListener(onclick); tvConfirm.setOnClickListener(onclick);
tvCancel.setOnClickListener(onclick); tvCancel.setOnClickListener(onclick);
if(isForceUpdate){ if(isForceUpdate){
tvCancel.setVisibility(View.GONE); tvCancel.setVisibility(View.GONE);
} }
// 初始化 DownloadManager tvVersionName.setText(bean.getLatestVersion());
downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE); // 解析更新说明支持纯文本和HTML格式
notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); String releaseNotes = bean.getReleaseNotes();
releaseNotes = releaseNotes.replace("\n", "<br>");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
tvContent.setText(Html.fromHtml(bean.getVersionDescription(), Html.FROM_HTML_MODE_LEGACY)); tvContent.setText(Html.fromHtml(releaseNotes, Html.FROM_HTML_MODE_LEGACY));
} else { } else {
tvContent.setText(Html.fromHtml(releaseNotes));
} }
String [] desStr = bean.getVersionDescription().split("#");
String desLine = "";
for(String str : desStr){
desLine = desLine + str + "\n";
}
tvContent.setText(desLine);
tvContent.setLineSpacing(0, 1.2f); tvContent.setLineSpacing(0, 1.2f);
} }
@@ -165,7 +167,7 @@ public class DialogAppUpdate {
} }
startUpdateApp(); startUpdateApp();
break; break;
case R.id.tv_cencel: case R.id.tv_cancel:
dismiss(); dismiss();
AppConfig.USER_CONFIRM_UPDATE_APP = true; AppConfig.USER_CONFIRM_UPDATE_APP = true;
break; break;
@@ -176,8 +178,8 @@ public class DialogAppUpdate {
public void startUpdateApp() { public void startUpdateApp() {
//强制更新不需要隐藏dialog //强制更新不需要隐藏dialog
if(mIsForceUpdate){ if(mIsForceUpdate){
progressBar.setVisibility(View.VISIBLE); llProgressContainer.setVisibility(View.VISIBLE);
rlUpdateContent.setVisibility(View.GONE); llButton.setVisibility(View.GONE);
progressBar.setMax(100); progressBar.setMax(100);
}else{ }else{
ToastUtil.showShort(mContext,"可在任务栏查看下载进度"); ToastUtil.showShort(mContext,"可在任务栏查看下载进度");

View File

@@ -276,7 +276,8 @@ public class IndexFragment extends BaseFragment<IndexFragmentLayoutBinding, Inde
case 302: case 302:
// 这是一台没有在mqtt中注册的设备需要通过蓝牙连接配网,(可理解为新设备,走蓝牙,配网) // 这是一台没有在mqtt中注册的设备需要通过蓝牙连接配网,(可理解为新设备,走蓝牙,配网)
// 先检查蓝牙权限和开启状态 // 先检查蓝牙权限和开启状态
pendingDeviceEntity = entity;
checkBluetoothAndProceed(); checkBluetoothAndProceed();
break; break;

View File

@@ -12,7 +12,7 @@ import java.util.Map;
public interface MainContract { public interface MainContract {
interface DataModel{ interface DataModel{
//新版本检测 //新版本检测
void checkAppVersionCode(JSONObject json, CallBack callBack); void checkAppVersionCode(Map<String,String> map, CallBack callBack);
//运势 //运势
void getYunshiData(Map<String,Object> map, CallBack callBack); void getYunshiData(Map<String,Object> map, CallBack callBack);
} }

View File

@@ -20,13 +20,13 @@ public class MainImpl implements MainContract.DataModel{
/** /**
* 检测新版本 * 检测新版本
* @param jsonObject * @param map
* @param callBack * @param callBack
*/ */
@Override @Override
public void checkAppVersionCode(JSONObject jsonObject, MainContract.CallBack callBack) { public void checkAppVersionCode(Map<String,String> map, MainContract.CallBack callBack) {
try { try {
NetWorkManager.getRequest().checkVersionCode(NetWorkManager.getToken(),NetWorkManager.toRequestBody(jsonObject)) NetWorkManager.getRequest().checkVersionCode(NetWorkManager.getToken(),map)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())

View File

@@ -1,5 +1,6 @@
package com.ckkj.water.main; package com.ckkj.water.main;
import com.ckkj.water.BuildConfig;
import com.ckkj.water.base.BasePresenter; import com.ckkj.water.base.BasePresenter;
import com.ckkj.water.main.entity.CheckVersionEntity; import com.ckkj.water.main.entity.CheckVersionEntity;
@@ -20,8 +21,10 @@ public class MainPresenter extends BasePresenter<MainContract.MainView> {
* 获取用户信息 * 获取用户信息
*/ */
public void checkNewVersion() { public void checkNewVersion() {
JSONObject json = new JSONObject(); Map<String,String> map = new HashMap<>();
mainImpl.checkAppVersionCode(json, new MainContract.CallBack<CheckVersionEntity>() { map.put("platform","android");
map.put("currentVersion", BuildConfig.APP_VERSION_NAME);
mainImpl.checkAppVersionCode(map, new MainContract.CallBack<CheckVersionEntity>() {
@Override @Override
public void success(CheckVersionEntity bean) { public void success(CheckVersionEntity bean) {
if( MainPresenter.this.getView() != null){ if( MainPresenter.this.getView() != null){

View File

@@ -103,7 +103,7 @@ public class MainActivity extends BaseActivity<MainActivityLayoutBinding, MainPr
@Override @Override
public void initData(Bundle savedInstanceState) { public void initData(Bundle savedInstanceState) {
super.initData(savedInstanceState); super.initData(savedInstanceState);
// mPresenter.checkNewVersion(); mPresenter.checkNewVersion();
// 清空Fragment列表避免状态恢复问题 // 清空Fragment列表避免状态恢复问题
mFragmentList.clear(); mFragmentList.clear();
mFragmentList.add(new IndexFragment()); mFragmentList.add(new IndexFragment());
@@ -356,16 +356,16 @@ public class MainActivity extends BaseActivity<MainActivityLayoutBinding, MainPr
if(bean == null){ if(bean == null){
return; return;
} }
if(bean.getVersionCoercion().equals("0")){//不强制 if(!bean.isForceUpdate()){//不强制
isForceUpdate = false; isForceUpdate = false;
}else{ }else{
isForceUpdate = true; isForceUpdate = true;
} }
//前期强制更新 //前期强制更新
// isForceUpdate = true; // isForceUpdate = true;
if(bean.getVersionNumber() > versionCode){ if(bean.getVersionCode() > versionCode){
//App更新dialog //App更新dialog
mUpdateDialog = new DialogAppUpdate(mContext,R.layout.dialog_app_update,isForceUpdate,bean); mUpdateDialog = new DialogAppUpdate(mContext,R.layout.dialog_app_update_water,isForceUpdate,bean);
mUpdateDialog.show(); mUpdateDialog.show();
mUpdateDialog.setOnDialogListener(new DialogAppUpdate.DialogListener() { mUpdateDialog.setOnDialogListener(new DialogAppUpdate.DialogListener() {
@Override @Override

View File

@@ -1,41 +1,32 @@
package com.ckkj.water.main.entity; package com.ckkj.water.main.entity;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable; import java.io.Serializable;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@NoArgsConstructor
@Data @Data
@NoArgsConstructor
public class CheckVersionEntity implements Serializable { public class CheckVersionEntity implements Serializable {
@SerializedName("versionNumber") /**
private int versionNumber; * platform : android
@SerializedName("versionEnd") * currentVersion : 1.0.1
private String versionEnd; * latestVersion : 1.0.0
@SerializedName("versionCoercion") * versionCode : 1
private String versionCoercion; * updateAvailable : true
@SerializedName("versionDescription") * forceUpdate : false
private String versionDescription; * downloadUrl : null
@SerializedName("versionName") * releaseNotes : null
private String versionName; */
@SerializedName("versionUrl")
private String versionUrl; private String platform;
@SerializedName("versionHide1") private String currentVersion;
private String versionHide1; private String latestVersion;
@SerializedName("versionHide2") private int versionCode;
private String versionHide2; private boolean updateAvailable;
@SerializedName("versionHide3") private boolean forceUpdate;
private String versionHide3; private String downloadUrl;
@SerializedName("versionHide4") private String releaseNotes;
private String versionHide4;
@SerializedName("versionHide5")
private Object versionHide5;
@SerializedName("versionHide6")
private Object versionHide6;
@SerializedName("paipanApiKey")
private String paipanApiKey;
} }

View File

@@ -6,6 +6,7 @@ import android.os.Bundle;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View; import android.view.View;
import com.bumptech.glide.Glide;
import com.ckkj.water.AppConfig; import com.ckkj.water.AppConfig;
import com.ckkj.water.ConstantUtil; import com.ckkj.water.ConstantUtil;
import com.ckkj.water.R; import com.ckkj.water.R;
@@ -143,6 +144,13 @@ public class MineCenterFragment extends BaseFragment<MineFragmentLayoutBinding,
}else{ }else{
viewBinding.tvUserAccount.setText(bean.getUser().getPhonenumber()); viewBinding.tvUserAccount.setText(bean.getUser().getPhonenumber());
} }
if(!TextUtils.isEmpty(bean.getUser().getAvatar())){
// 刷新头像显示
Glide.with(mContext)
.load(bean.getUser().getAvatar())
.error(mContext.getDrawable(R.mipmap.icon_mine_user_head_defaul))
.into(viewBinding.imgAvatar);
}
} }
/** /**

View File

@@ -140,7 +140,7 @@ public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBi
@Override @Override
public void onConfirmClisk(String content) { public void onConfirmClisk(String content) {
showLoadingDialog(); showLoadingDialog();
mPresenter.updateUserInfo(content); mPresenter.updateUserInfo(content,null);
mUserBean.getUser().setNickName(content); mUserBean.getUser().setNickName(content);
viewBinding.tvNicknameValue.setText(content); viewBinding.tvNicknameValue.setText(content);
} }

View File

@@ -66,7 +66,7 @@ public class MineUserInfoBean implements Serializable {
private String email; private String email;
private String phonenumber; private String phonenumber;
private String sex; private String sex;
private Object avatar; private String avatar;
private String password; private String password;
private String status; private String status;
private String loginIp; private String loginIp;

View File

@@ -1,5 +1,7 @@
package com.ckkj.water.mine.mvp; package com.ckkj.water.mine.mvp;
import android.text.TextUtils;
import com.ckkj.water.base.BasePresenter; import com.ckkj.water.base.BasePresenter;
import com.ckkj.water.mine.entity.MineUserInfoBean; import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.login.mvp.LoginContract; import com.ckkj.water.login.mvp.LoginContract;
@@ -51,12 +53,18 @@ public class MinePresenter extends BasePresenter<MineContract.MineView> {
/** /**
* 修改用户信息 * 修改用户信息
* @param content * @param nickName
* @param avatar
*/ */
public void updateUserInfo(String content) { public void updateUserInfo(String nickName,String avatar) {
try { try {
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
json.put("nickName", content); if(!TextUtils.isEmpty(avatar)){
json.put("nickName", nickName);
}
if(!TextUtils.isEmpty(avatar)){
json.put("avatar", avatar);
}
impl.updateUserInfo(json, new MineContract.CallBack<BaseBean>() { impl.updateUserInfo(json, new MineContract.CallBack<BaseBean>() {
@Override @Override
public void success(BaseBean bean) { public void success(BaseBean bean) {
@@ -142,6 +150,7 @@ public class MinePresenter extends BasePresenter<MineContract.MineView> {
public void success(MineUserInfoBean bean) { public void success(MineUserInfoBean bean) {
if (MinePresenter.this.getView() != null) { if (MinePresenter.this.getView() != null) {
MinePresenter.this.getView().uploadImageSuccess(bean); MinePresenter.this.getView().uploadImageSuccess(bean);
updateUserInfo(null,bean.getUrl());
} }
} }

View File

@@ -148,8 +148,8 @@ public interface Request {
@POST("mobile/version?end=android") @GET("app/v1/checkVersion")
Observable<BaseBean<CheckVersionEntity>> checkVersionCode(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody); Observable<BaseBean<CheckVersionEntity>> checkVersionCode(@HeaderMap Map<String, String> headMap, @QueryMap Map<String, String> map);
//版本检测更新 //版本检测更新
@POST("mine/api/versionNum") @POST("mine/api/versionNum")
Observable<BaseBean<CheckVersionEntity>> getVersionCheck(@HeaderMap Map<String, String> headMap, @QueryMap Map<String, Object> map); Observable<BaseBean<CheckVersionEntity>> getVersionCheck(@HeaderMap Map<String, String> headMap, @QueryMap Map<String, Object> map);

View File

@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@android:color/transparent"
android:gravity="center_horizontal">
<!-- 白色内容卡片(底层) -->
<LinearLayout
android:id="@+id/linear_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/dp_30"
android:layout_marginTop="@dimen/dp_75"
android:paddingTop="@dimen/dp_75"
android:orientation="vertical"
android:gravity="center_horizontal"
android:background="@drawable/shape_white_coeners_8">
<!-- 标题区域 -->
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/sp_18"
android:textColor="@color/color_2E2E2E"
android:textStyle="bold"
android:text="发现新版本"/>
<!-- 版本号 -->
<TextView
android:id="@+id/tv_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_4"
android:textSize="@dimen/sp_13"
android:textColor="@color/color_ff999999"
android:text="V2.0.0"/>
<!-- 更新内容区域 -->
<LinearLayout
android:id="@+id/ll_update_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginLeft="@dimen/dp_28"
android:layout_marginRight="@dimen/dp_28">
<!-- 更新内容行1 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="top">
<TextView
android:id="@+id/tv_update_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/sp_14"
android:textColor="@color/color_2E2E2E"
android:lineSpacingExtra="@dimen/dp_4"
android:text="1.优化布局\n2.修复已知bug优化用户体验\n3.测试内容测试内容测试内容测试内容测试内容"/>
</LinearLayout>
</LinearLayout>
<!-- 进度条区域(下载时显示) -->
<LinearLayout
android:id="@+id/ll_progress_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginBottom="@dimen/dp_30"
android:layout_marginLeft="@dimen/dp_28"
android:layout_marginRight="@dimen/dp_28">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="@dimen/sp_13"
android:textColor="@color/color_2E2E2E"
android:text="正在下载..."/>
<TextView
android:id="@+id/tv_progress_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/sp_13"
android:textColor="@color/color_ff999999"
android:text="0%"/>
</LinearLayout>
<ProgressBar
android:id="@+id/progress_bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_5"
android:layout_marginTop="@dimen/dp_8"
android:progressDrawable="@drawable/update_app_progress_bg"
android:max="100"
android:progress="0"/>
</LinearLayout>
<!-- 按钮区域 -->
<LinearLayout
android:id="@+id/Linear_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="@dimen/dp_24"
android:layout_marginLeft="@dimen/dp_28"
android:layout_marginRight="@dimen/dp_28"
android:layout_marginBottom="@dimen/dp_20"
android:visibility="visible">
<!-- 立即升级按钮 -->
<TextView
android:id="@+id/tv_update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_green_button_bg"
android:textSize="@dimen/sp_17"
android:textColor="@color/white"
android:text="立即升级"
android:gravity="center"
android:paddingTop="@dimen/dp_12"
android:paddingBottom="@dimen/dp_12"/>
<!-- 暂不升级按钮 -->
<TextView
android:id="@+id/tv_cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/sp_17"
android:textColor="@color/color_ff999999"
android:text="暂不升级"
android:gravity="center"
android:paddingTop="@dimen/dp_12"
android:paddingBottom="@dimen/dp_12"
android:layout_marginTop="@dimen/dp_8"/>
</LinearLayout>
</LinearLayout>
<!-- 顶部图片区域(上层,覆盖在白色卡片上方) -->
<FrameLayout
android:id="@+id/frame_layout"
android:layout_width="@dimen/dp_150"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/img_update_res"
android:layout_gravity="center_horizontal"/>
</FrameLayout>
</FrameLayout>

View File

@@ -24,7 +24,8 @@
android:layout_width="@dimen/dp_60" android:layout_width="@dimen/dp_60"
android:layout_height="@dimen/dp_60" android:layout_height="@dimen/dp_60"
app:riv_corner_radius="@dimen/dp_30" app:riv_corner_radius="@dimen/dp_30"
android:src="@mipmap/img_pay_weixin" android:scaleType="centerCrop"
android:src="@mipmap/icon_mine_user_head_defaul"
android:layout_marginLeft="20dp"/> android:layout_marginLeft="20dp"/>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@@ -26,8 +26,8 @@
android:layout_width="@dimen/dp_112" android:layout_width="@dimen/dp_112"
android:layout_height="@dimen/dp_112" android:layout_height="@dimen/dp_112"
app:riv_corner_radius="@dimen/dp_120" app:riv_corner_radius="@dimen/dp_120"
android:src="@mipmap/img_pay_weixin"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@mipmap/icon_mine_user_head_defaul"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_centerHorizontal="true"/> android:layout_centerHorizontal="true"/>
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB