图片上传

This commit is contained in:
fengjignqi
2026-06-29 17:59:39 +08:00
parent f53408654b
commit b5e9f0de3b
21 changed files with 153 additions and 82 deletions

View File

@@ -11,9 +11,8 @@ import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.google.gson.Gson;
import com.ckkj.water.login.entity.LoginEntity;
import com.ckkj.water.network.NetWorkManager;
import com.ckkj.water.utils.dataUtil.SharePreUtil;
import com.ckkj.water.utils.manager.LanguageManager;

View File

@@ -7,14 +7,12 @@ import android.view.View;
import com.ckkj.water.AppConfig;
import com.ckkj.water.login.LoginActivity;
import com.ckkj.water.login.RegisterActivity;
import com.ckkj.water.login.RegisterSuccessActivity;
import com.gyf.immersionbar.ImmersionBar;
import com.ckkj.water.ConstantUtil;
import com.ckkj.water.MyApplication;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.databinding.GuideLayoutBinding;
import com.ckkj.water.main.MainContract;
import com.ckkj.water.main.MainImpl;
@@ -27,7 +25,6 @@ import com.ckkj.water.utils.dataUtil.SharePreUtil;
import com.ckkj.water.utils.manager.ActivityManager;
import me.jessyan.autosize.internal.CancelAdapt;
import me.jessyan.autosize.internal.CustomAdapt;
/**
* @author fengxiaoyang

View File

@@ -1,6 +1,5 @@
package com.ckkj.water.history.mvp;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.history.entity.WaterStatisticsEntity;
import com.ckkj.water.history.entity.WateringRecord;
import com.ckkj.water.network.BaseBean;

View File

@@ -1,7 +1,7 @@
package com.ckkj.water.main;
import com.ckkj.water.base.IView;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.main.entity.CheckVersionEntity;
import com.ckkj.water.network.BaseBean;

View File

@@ -1,11 +1,7 @@
package com.ckkj.water.main;
import com.ckkj.water.base.BasePresenter;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.login.mvp.LoginContract;
import com.ckkj.water.main.entity.CheckVersionEntity;
import com.ckkj.water.mine.mvp.MineImpl;
import com.ckkj.water.network.BaseBean;
import org.json.JSONObject;

View File

@@ -18,13 +18,12 @@ import com.ckkj.water.mine.MineCenterFragment;
import com.ckkj.water.plan.WaterPlanFragment;
import com.ckkj.water.utils.manager.ThemeManager;
import com.gyf.immersionbar.ImmersionBar;
import com.ckkj.water.AppConfig;
import com.ckkj.water.ConstantUtil;
import com.ckkj.water.EventMessage;
import com.ckkj.water.R;
import com.ckkj.water.adapter.ViewPageAdapter;
import com.ckkj.water.base.BaseActivity;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.databinding.MainActivityLayoutBinding;
import com.ckkj.water.dialog.DialogAppUpdate;
import com.ckkj.water.main.MainContract;
@@ -33,7 +32,6 @@ import com.ckkj.water.main.MainPresenter;
import com.ckkj.water.main.entity.CheckVersionEntity;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.utils.AppInfoUtil;
import com.ckkj.water.utils.dataUtil.SharePreUtil;
import com.ckkj.water.utils.manager.ActivityManager;
import com.ckkj.water.utils.manager.WaterUserInfoManager;
import com.ckkj.water.utils.show.ToastUtil;

View File

@@ -5,7 +5,7 @@ import android.view.View;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.databinding.AppThemeChangeLayoutBinding;
import com.ckkj.water.mine.mvp.MineContract;
import com.ckkj.water.mine.mvp.MineImpl;
@@ -124,7 +124,7 @@ public class AppThemActivity extends BaseActivity<AppThemeChangeLayoutBinding, M
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
}
}

View File

@@ -5,7 +5,7 @@ import android.os.CountDownTimer;
import android.text.TextUtils;
import android.view.View;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.gyf.immersionbar.ImmersionBar;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity;
@@ -14,7 +14,6 @@ import com.ckkj.water.mine.mvp.MineContract;
import com.ckkj.water.mine.mvp.MineImpl;
import com.ckkj.water.mine.mvp.MinePresenter;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.utils.manager.WaterUserInfoManager;
import com.ckkj.water.utils.number.PhoneNumberUtils;
import com.ckkj.water.utils.show.ToastUtil;
@@ -153,7 +152,7 @@ public class ChangePhoneActivity extends BaseActivity<ChangePhoneActivityBinding
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
}
}

View File

@@ -2,7 +2,6 @@ package com.ckkj.water.mine;
import static android.view.View.INVISIBLE;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
@@ -11,12 +10,9 @@ import com.ckkj.water.AppConfig;
import com.ckkj.water.ConstantUtil;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseFragment;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.databinding.MineFragmentBinding;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.databinding.MineFragmentLayoutBinding;
import com.ckkj.water.login.LoginActivity;
import com.ckkj.water.main.entity.CheckVersionEntity;
import com.ckkj.water.mine.entity.MemberComboEntity;
import com.ckkj.water.mine.mvp.MineContract;
import com.ckkj.water.mine.mvp.MineImpl;
import com.ckkj.water.mine.mvp.MinePresenter;
@@ -26,16 +22,11 @@ import com.ckkj.water.utils.manager.ActivityManager;
import com.ckkj.water.utils.manager.LanguageManager;
import com.ckkj.water.utils.manager.ThemeManager;
import com.ckkj.water.utils.manager.WaterUserInfoManager;
import com.ckkj.water.utils.show.ToastUtil;
import com.google.gson.Gson;
import com.gyf.immersionbar.ImmersionBar;
import com.lxj.xpopup.XPopup;
import com.lxj.xpopup.interfaces.OnSelectListener;
import java.util.List;
import de.greenrobot.event.EventBus;
/**
* @author fengxiaoyang
* @date 2026/5/16
@@ -166,7 +157,7 @@ public class MineCenterFragment extends BaseFragment<MineFragmentLayoutBinding,
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
}

View File

@@ -13,15 +13,14 @@ import com.bumptech.glide.Glide;
import com.ckkj.water.ConstantUtil;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.databinding.MineInformationLayoutBinding;
import com.ckkj.water.mine.mvp.MineContract;
import com.ckkj.water.mine.mvp.MineImpl;
import com.ckkj.water.mine.mvp.MinePresenter;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.utils.LubanCompressUtil;
import com.ckkj.water.utils.PreviewFileUtil;
import com.ckkj.water.utils.dataUtil.FileUtil;
import com.ckkj.water.utils.dataUtil.SharePreUtil;
import com.ckkj.water.utils.manager.ThemeManager;
import com.ckkj.water.utils.manager.WaterUserInfoManager;
import com.ckkj.water.utils.show.ToastUtil;
@@ -198,8 +197,32 @@ public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBi
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
hideDialogLoading();
// 后端约定data 为上传后的头像访问URLString
String avatarUrl = bean.getUrl();
if (TextUtils.isEmpty(avatarUrl)) {
ToastUtil.showShort(mContext, getString(R.string.avatar_update_success));
return;
}
// 更新内存中的用户信息
if (mUserBean != null && mUserBean.getUser() != null) {
mUserBean.getUser().setAvatar(avatarUrl);
WaterUserInfoManager.getInstance().setUserInfo(mUserBean);
}
// 缓存头像地址到本地
SharePreUtil.putString(ConstantUtil.SHARE_PRE_NAME, mContext,
ConstantUtil.USER_INFO_AVATAR, avatarUrl);
// 刷新头像显示
Glide.with(mContext)
.load(avatarUrl)
.error(mContext.getDrawable(R.mipmap.icon_mine_user_head_defaul))
.into(viewBinding.imgAvatar);
ToastUtil.showShort(mContext, getString(R.string.avatar_update_success));
}
@@ -225,7 +248,7 @@ public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBi
return;
}
//Todo 开始上传图片
// 上传图片
mPresenter.uploadImage(file);

View File

@@ -5,7 +5,7 @@ import android.view.View;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.databinding.PasswordManLayoutBinding;
import com.ckkj.water.login.ForgetPasswordActivity;
import com.ckkj.water.mine.mvp.MineContract;
@@ -103,7 +103,7 @@ public class PsdManageActivity extends BaseActivity<PasswordManLayoutBinding, Mi
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
}
}

View File

@@ -6,7 +6,7 @@ import android.view.View;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.databinding.ResetPsdLayoutBinding;
import com.ckkj.water.mine.mvp.MineContract;
import com.ckkj.water.mine.mvp.MineImpl;
@@ -97,7 +97,7 @@ public class ResetPsdActivity extends BaseActivity<ResetPsdLayoutBinding, MinePr
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
}

View File

@@ -6,7 +6,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.gyf.immersionbar.ImmersionBar;
import com.ckkj.water.AppConfig;
import com.ckkj.water.EventMessage;
@@ -226,7 +226,7 @@ public class SettingsActivity extends BaseActivity<ActivitySettingsLayoutBinding
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
}
}

View File

@@ -5,7 +5,7 @@ import android.os.CountDownTimer;
import android.text.TextUtils;
import android.view.View;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.gyf.immersionbar.ImmersionBar;
import com.ckkj.water.AppConfig;
import com.ckkj.water.R;
@@ -15,8 +15,6 @@ import com.ckkj.water.mine.mvp.MineContract;
import com.ckkj.water.mine.mvp.MineImpl;
import com.ckkj.water.mine.mvp.MinePresenter;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.utils.manager.WaterUserInfoManager;
import com.ckkj.water.utils.number.PhoneNumberUtils;
import com.ckkj.water.utils.show.ToastUtil;
@@ -133,7 +131,7 @@ public class UserLogOffAccountActivity extends BaseActivity<UserLogOffActivityBi
}
@Override
public void uploadImageSuccess(BaseBean bean) {
public void uploadImageSuccess(MineUserInfoBean bean) {
}
}

View File

@@ -1,4 +1,4 @@
package com.ckkj.water.base.entity;
package com.ckkj.water.mine.entity;
import java.io.Serializable;
import java.util.List;
@@ -26,6 +26,8 @@ public class MineUserInfoBean implements Serializable {
private UserBean user;
private List<?> permissions;
private List<?> roles;
private String url;
@NoArgsConstructor
@Data
@@ -77,5 +79,6 @@ public class MineUserInfoBean implements Serializable {
private Object roleId;
private Object oldPassword;
private List<?> roles;
}
}

View File

@@ -1,18 +1,11 @@
package com.ckkj.water.mine.mvp;
import com.ckkj.water.base.IView;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.login.mvp.LoginContract;
import com.ckkj.water.main.entity.CheckVersionEntity;
import com.ckkj.water.mine.entity.InviteeRecordEntity;
import com.ckkj.water.mine.entity.MemberComboEntity;
import com.ckkj.water.mine.entity.RecommendDataEntity;
import com.ckkj.water.mine.entity.RewardRecordEntity;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.network.BaseBean;
import org.json.JSONObject;
import java.util.List;
import java.util.Map;
/**
@@ -50,7 +43,7 @@ public class MineContract {
//退出登录
void logOutSuccess(BaseBean bean);
//上传图片成功
void uploadImageSuccess(BaseBean bean);
void uploadImageSuccess(MineUserInfoBean bean);
}

View File

@@ -1,15 +1,12 @@
package com.ckkj.water.mine.mvp;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.login.mvp.LoginContract;
import com.ckkj.water.mine.entity.MemberComboEntity;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.network.LoginStateManager;
import com.ckkj.water.network.NetWorkManager;
import org.json.JSONObject;
import java.util.List;
import java.io.File;
import java.util.Map;
import io.reactivex.Observer;
@@ -17,6 +14,9 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
/**
* @author fengxiaoyang
@@ -143,11 +143,73 @@ public class MineImpl implements MineContract.DataModel {
/**
* 上传图片
* @param json
* @param callBack
*
* @param json 预留参数,目前接口不需要,但保留扩展能力(例如上传类型/用户ID等
* @param callBack 上传结果回调
*/
@Override
public void uploadImage(JSONObject json, MineContract.CallBack callBack) {
File file = null;
if (json != null && json.has("file")) {
try {
String path = json.getString("file");
if (path != null && !path.isEmpty()) {
file = new File(path);
}
} catch (Exception e) {
e.printStackTrace();
}
}
if (file == null || !file.exists()) {
callBack.fail("文件不存在");
return;
}
// 推断 MIME 类型:根据后缀决定 image/jpeg 或 image/png其它统一用 image/jpeg
String fileName = file.getName().toLowerCase();
MediaType mediaType;
if (fileName.endsWith(".png")) {
mediaType = MediaType.parse("image/png");
} else if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")) {
mediaType = MediaType.parse("image/jpeg");
} else {
mediaType = MediaType.parse("image/jpeg");
}
RequestBody requestBody = RequestBody.create(mediaType, file);
// 参数名固定为 "file",与后端约定一致
MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
try {
NetWorkManager.getRequest().uploadImage(NetWorkManager.getToken(), part)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BaseBean<MineUserInfoBean>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull BaseBean<MineUserInfoBean> bean) {
if (bean.getCode() == 200) {
callBack.success(bean.getData());
} else {
callBack.fail(bean.getMessage());
}
}
@Override
public void onError(@NonNull Throwable e) {
callBack.fail(e.getMessage());
}
@Override
public void onComplete() {
}
});
} catch (Exception e) {
e.printStackTrace();
callBack.fail(e.getMessage());
}
}
}

View File

@@ -1,18 +1,10 @@
package com.ckkj.water.mine.mvp;
import android.text.Editable;
import android.text.TextUtils;
import com.ckkj.water.ConstantUtil;
import com.ckkj.water.base.BasePresenter;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.base.entity.UserInfoEntity;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.login.mvp.LoginContract;
import com.ckkj.water.login.mvp.LoginImpl;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.utils.dataUtil.SharePreUtil;
import com.ckkj.water.utils.manager.WaterUserInfoManager;
import com.google.gson.Gson;
import org.json.JSONException;
import org.json.JSONObject;
@@ -139,9 +131,32 @@ public class MinePresenter extends BasePresenter<MineContract.MineView> {
/**
* 上传图片
* @param file
* @param file 已压缩后的图片文件
*/
public void uploadImage(File file) {
try {
JSONObject json = new JSONObject();
json.put("file", file == null ? "" : file.getAbsolutePath());
impl.uploadImage(json, new MineContract.CallBack<MineUserInfoBean>() {
@Override
public void success(MineUserInfoBean bean) {
if (MinePresenter.this.getView() != null) {
MinePresenter.this.getView().uploadImageSuccess(bean);
}
}
@Override
public void fail(String msg) {
if (MinePresenter.this.getView() != null) {
MinePresenter.this.getView().showError(msg);
}
}
});
} catch (JSONException e) {
e.printStackTrace();
if (getView() != null) {
getView().showError(e.getMessage());
}
}
}
}

View File

@@ -2,7 +2,7 @@ package com.ckkj.water.network;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.history.entity.WaterStatisticsEntity;
import com.ckkj.water.history.entity.WateringRecord;
import com.ckkj.water.index.entity.WaterDeviceEntity;
@@ -20,6 +20,7 @@ import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.GET;
import retrofit2.http.HeaderMap;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
@@ -54,8 +55,9 @@ public interface Request {
Observable<BaseBean> updateUserInfo(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
//上传图片
@PUT("app/v1/uploadImage")
Observable<BaseBean> uploadImage(@HeaderMap Map<String, String> headMap,@Part MultipartBody.Part file);
@Multipart
@POST("app/v1/uploadImage")
Observable<BaseBean<MineUserInfoBean>> uploadImage(@HeaderMap Map<String, String> headMap,@Part MultipartBody.Part file);

View File

@@ -5,16 +5,13 @@ import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import com.ckkj.water.ConstantUtil;
import com.ckkj.water.R;
import com.ckkj.water.base.BaseActivity;
import com.ckkj.water.base.BaseActivityNoP;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.databinding.PermissionLayoutBinding;
import com.ckkj.water.main.MainContract;
import com.ckkj.water.main.MainImpl;

View File

@@ -4,8 +4,7 @@ import android.content.Context;
import com.ckkj.water.AppConfig;
import com.ckkj.water.ConstantUtil;
import com.ckkj.water.base.entity.MineUserInfoBean;
import com.ckkj.water.base.entity.UserInfoEntity;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.login.entity.LoginEntity;
import com.ckkj.water.utils.dataUtil.SharePreUtil;