app/build.gradle
@@ -130,48 +130,12 @@ //定位 implementation 'com.baidu.lbsyun:BaiduMapSDK_Location:9.3.7' // //推送相关 // // 此处以JPush 5.0.0 版本为例,5.0.0 版本开始可以自动拉取 JCore 包,无需另外配置 // implementation 'cn.jiguang.sdk:jpush:5.2.2' // //若不集成厂商通道,可直接跳过以下依赖 // // 极光厂商插件版本与接入 JPush 版本保持一致,下同 // // 接入华为厂商 // implementation 'com.huawei.hms:push:6.5.0.300' // implementation 'cn.jiguang.sdk.plugin:huawei:5.2.2' // // 接入 FCM 厂商 // implementation 'com.google.firebase:firebase-messaging:23.0.5' // implementation 'cn.jiguang.sdk.plugin:fcm:5.2.2' // // 接入魅族厂商 // implementation 'cn.jiguang.sdk.plugin:meizu:5.2.2' // // 接入 VIVO 厂商 // implementation 'cn.jiguang.sdk.plugin:vivo:5.2.2' // // 接入小米厂商 // implementation 'cn.jiguang.sdk.plugin:xiaomi:5.2.2' // // 接入 OPPO 厂商 // implementation 'cn.jiguang.sdk.plugin:oppo:5.2.2' // // JPush Android SDK v4.6.0 开始,需要单独引入 oppo 厂商 aar ,请下载官网 SDK 包并把 jpush-android-xxx-release/third-push/oppo/libs 下的 aar 文件单独拷贝一份到应用 module/libs 下 // implementation(name: 'com.heytap.msp-push-3.1.0', ext: 'aar') // //以下为 OPPO 3.1.0 aar需要依赖 // implementation 'com.google.code.gson:gson:2.6.2' // implementation 'commons-codec:commons-codec:1.6' // implementation 'androidx.annotation:annotation:1.1.0' // // 接入荣耀厂商 // implementation 'cn.jiguang.sdk.plugin:honor:5.2.2' // apply plugin: 'com.google.gms.google-services' // apply plugin: 'com.huawei.agconnect' //圆形头像 implementation 'de.hdodenhof:circleimageview:3.1.0' //广播通信 implementation 'io.github.jeremyliao:live-event-bus-x:1.8.0' //阿里的RocketMQ // implementation 'org.apache.rocketmq:rocketmq-client:4.9.4' //mqtt implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' //room数据库 @@ -182,21 +146,25 @@ implementation "androidx.room:room-rxjava3:2.3.0" //图片 implementation 'com.github.bumptech.glide:glide:4.11.0' implementation 'com.github.bumptech.glide:glide:4.16.0' // PictureSelector 基础 (必须图片选择) implementation 'io.github.lucksiege:pictureselector:v3.11.2' // 图片压缩 (按需引入) implementation 'io.github.lucksiege:compress:v3.11.2' // 图片查看 implementation('com.github.SherlockGougou:BigImageViewPager:androidx-8.0.0') { implementation('com.github.SherlockGougou:BigImageViewPager:androidx-8.1.3') { exclude group: 'androidx.appcompat'; exclude group: 'com.google.android.material'; exclude group: 'androidx.core'; } implementation "androidx.media3:media3-exoplayer:1.4.1" implementation "androidx.media3:media3-exoplayer-dash:1.4.1" implementation "androidx.media3:media3-ui:1.4.1" annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'// kotlin请使用kapt implementation 'com.github.bumptech.glide:okhttp3-integration:4.16.0' implementation "com.github.zjupure:webpdecoder:2.3.4.14.2" //进度加载 implementation 'com.github.jenly1314:circleprogressview:1.1.3' app/src/main/java/com/dayu/pipirrapp/MyAppGlideModule.java
New file @@ -0,0 +1,36 @@ package com.dayu.pipirrapp; import android.content.Context; import androidx.annotation.NonNull; import com.bumptech.glide.Glide; import com.bumptech.glide.Registry; import com.bumptech.glide.annotation.GlideModule; import com.bumptech.glide.load.model.GlideUrl; import com.bumptech.glide.module.AppGlideModule; import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader; import java.io.InputStream; import cc.shinichi.library.glide.progress.ProgressManager; import okhttp3.Call; /** * MyAppGlideModule - * * @author zuoxiao * @version 1.0 * @since 2025-01-13 */ @GlideModule public class MyAppGlideModule extends AppGlideModule { @Override public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) { super.registerComponents(context, glide, registry); // 替换底层网络框架为okhttp3 registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory((Call.Factory) ProgressManager.getOkHttpClient())); } } app/src/main/java/com/dayu/pipirrapp/activity/BaseActivity.java
@@ -25,9 +25,16 @@ @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 获取当前窗口 Window window = getWindow(); // 添加标志,允许窗口绘制系统栏背景 window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); // 设置状态栏颜色 window.setStatusBarColor(getResources().getColor(R.color.title_color)); } public void layoutFinish(RefreshLayout refreshLayout, boolean isRefresh) { app/src/main/java/com/dayu/pipirrapp/activity/IssueDetailActivity.java
@@ -23,6 +23,7 @@ import com.dayu.pipirrapp.net.BaseResponse; import com.dayu.pipirrapp.net.Constants; import com.dayu.pipirrapp.net.subscribers.SubscriberListener; import com.dayu.pipirrapp.tool.BigimageUtils; import com.dayu.pipirrapp.tool.FullyGridLayoutManager; import com.dayu.pipirrapp.utils.ToastUtil; import com.dayu.pipirrapp.view.ConfirmDialog; @@ -79,7 +80,7 @@ // 添加间距装饰,确保图片有合适的间隔 mRecyclerView.addItemDecoration(new GridSpacingItemDecoration(4, DensityUtil.dip2px(this, 8), false)); mAdapter = new ImageAdapter(this, images, (v, position) -> { ImagePreview.getInstance().with(IssueDetailActivity.this).setIndex(position).setMediaInfoList(imageInfoList).start(); BigimageUtils.showImages(this, position, imageInfoList); }); mRecyclerView.setAdapter(mAdapter); } @@ -97,27 +98,27 @@ binding.setData(orderDetailResult); binding.setItemclidk(IssueDetailActivity.this); state = orderDetailResult.getStateId(); if (!t.getContent().getImages().isEmpty()){ for (ImageResult imageResult:t.getContent().getImages()){ ImageBean imageBean=new ImageBean(); if (!t.getContent().getImages().isEmpty()) { for (ImageResult imageResult : t.getContent().getImages()) { ImageBean imageBean = new ImageBean(); imageBean.setId(imageResult.getId()); imageBean.setWebPath(imageResult.getWebPath()); imageBean.setType(UplodFileState.IMG_TYPE); images.add(imageBean); ImageInfo info=new ImageInfo(); ImageInfo info = new ImageInfo(); info.setOriginUrl(imageResult.getWebPath()); info.setType(Type.IMAGE); imageInfoList.add(info); } } if (!t.getContent().getVideos().isEmpty()){ for (ImageResult imageResult:t.getContent().getVideos()){ ImageBean imageBean=new ImageBean(); if (!t.getContent().getVideos().isEmpty()) { for (ImageResult imageResult : t.getContent().getVideos()) { ImageBean imageBean = new ImageBean(); imageBean.setId(imageResult.getId()); imageBean.setWebPath(imageResult.getWebPath()); imageBean.setType(UplodFileState.VIDEO_TYPE); images.add(imageBean); ImageInfo info=new ImageInfo(); ImageInfo info = new ImageInfo(); info.setOriginUrl(imageResult.getWebPath()); info.setType(Type.VIDEO); imageInfoList.add(info); app/src/main/java/com/dayu/pipirrapp/adapter/AddPictureAdapter.java
@@ -160,6 +160,7 @@ .centerCrop() .placeholder(R.color.app_color_f6) .diskCacheStrategy(DiskCacheStrategy.ALL) .thumbnail(0.25f) .into(viewHolder.mImg); } app/src/main/java/com/dayu/pipirrapp/bean/db/DivideBean.java
New file @@ -0,0 +1,213 @@ package com.dayu.pipirrapp.bean.db; import androidx.room.Entity; import androidx.room.PrimaryKey; /** * DivideBean -分水房 * * @author zuoxiao * @version 1.0 * @since 2025-01-13 */ @Entity public class DivideBean { @PrimaryKey(autoGenerate = true) public long localid; /** * 归属地 */ private String address; /** * 片区ID */ private String blockId; /** * 片区名称 */ private String blockName; /** * 分水房ID */ private String divideId; /** * 分水房名称 */ private String divideName; /** * 负责人 */ private String header; /** * 编号 */ private int id; /** * 纬度 */ private double lat; /** * 经度 */ private double lng; /** * 操作时间 */ private String operateDt; /** * 操作人 */ private String operator; /** * 联系电话 */ private String phone; /** * 备注 */ private String remarks; /** * 覆盖村 */ private String villages; /** * 覆盖面积 */ private double area; // Getters and Setters public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public double getArea() { return area; } public void setArea(double area) { this.area = area; } public String getBlockId() { return blockId; } public void setBlockId(String blockId) { this.blockId = blockId; } public String getBlockName() { return blockName; } public void setBlockName(String blockName) { this.blockName = blockName; } public String getDivideId() { return divideId; } public void setDivideId(String divideId) { this.divideId = divideId; } public String getDivideName() { return divideName; } public void setDivideName(String divideName) { this.divideName = divideName; } public String getHeader() { return header; } public void setHeader(String header) { this.header = header; } public int getId() { return id; } public void setId(int id) { this.id = id; } public double getLat() { return lat; } public void setLat(double lat) { this.lat = lat; } public double getLng() { return lng; } public void setLng(double lng) { this.lng = lng; } public String getOperateDt() { return operateDt; } public void setOperateDt(String operateDt) { this.operateDt = operateDt; } public String getOperator() { return operator; } public void setOperator(String operator) { this.operator = operator; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getRemarks() { return remarks; } public void setRemarks(String remarks) { this.remarks = remarks; } public String getVillages() { return villages; } public void setVillages(String villages) { this.villages = villages; } } app/src/main/java/com/dayu/pipirrapp/bean/net/AddIssueRequest.java
@@ -12,12 +12,16 @@ * @since 2024-12-09 */ public class AddIssueRequest extends BaseRequest { String workOrderId;//工单ID String inspectorId;//巡检员ID String content;//结果内容 //工单ID String workOrderId; //巡检员ID String inspectorId; //结果内容 String content; List<ImageRequest> images = new ArrayList<>(); List<ImageRequest> videos = new ArrayList<>(); String completeTime;//任务完成时间 //任务完成时间 String completeTime; String lng; String lat; app/src/main/java/com/dayu/pipirrapp/bean/net/DivideListResult.java
New file @@ -0,0 +1,59 @@ package com.dayu.pipirrapp.bean.net; import java.util.List; /** * DivideListResult -分水房 * * @author zuoxiao * @version 1.0 * @since 2025-01-13 */ public class DivideListResult { int itemTotal; int pageCurr; int pageSize; int pageTotal; List<DivideResult> obj; public int getItemTotal() { return itemTotal; } public void setItemTotal(int itemTotal) { this.itemTotal = itemTotal; } public int getPageCurr() { return pageCurr; } public void setPageCurr(int pageCurr) { this.pageCurr = pageCurr; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getPageTotal() { return pageTotal; } public void setPageTotal(int pageTotal) { this.pageTotal = pageTotal; } public List<DivideResult> getObj() { return obj; } public void setObj(List<DivideResult> obj) { this.obj = obj; } } app/src/main/java/com/dayu/pipirrapp/bean/net/DivideResult.java
New file @@ -0,0 +1,208 @@ package com.dayu.pipirrapp.bean.net; /** * DivideResult -分水房 * * @author zuoxiao * @version 1.0 * @since 2025-01-10 */ public class DivideResult { /** * 归属地 */ private String address; /** * 片区ID */ private String blockId; /** * 片区名称 */ private String blockName; /** * 分水房ID */ private String divideId; /** * 分水房名称 */ private String divideName; /** * 负责人 */ private String header; /** * 编号 */ private int id; /** * 纬度 */ private double lat; /** * 经度 */ private double lng; /** * 操作时间 */ private String operateDt; /** * 操作人 */ private String operator; /** * 联系电话 */ private String phone; /** * 备注 */ private String remarks; /** * 覆盖村 */ private String villages; /** * 覆盖面积 */ private double area; // Getters and Setters public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public double getArea() { return area; } public void setArea(double area) { this.area = area; } public String getBlockId() { return blockId; } public void setBlockId(String blockId) { this.blockId = blockId; } public String getBlockName() { return blockName; } public void setBlockName(String blockName) { this.blockName = blockName; } public String getDivideId() { return divideId; } public void setDivideId(String divideId) { this.divideId = divideId; } public String getDivideName() { return divideName; } public void setDivideName(String divideName) { this.divideName = divideName; } public String getHeader() { return header; } public void setHeader(String header) { this.header = header; } public int getId() { return id; } public void setId(int id) { this.id = id; } public double getLat() { return lat; } public void setLat(double lat) { this.lat = lat; } public double getLng() { return lng; } public void setLng(double lng) { this.lng = lng; } public String getOperateDt() { return operateDt; } public void setOperateDt(String operateDt) { this.operateDt = operateDt; } public String getOperator() { return operator; } public void setOperator(String operator) { this.operator = operator; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getRemarks() { return remarks; } public void setRemarks(String remarks) { this.remarks = remarks; } public String getVillages() { return villages; } public void setVillages(String villages) { this.villages = villages; } } app/src/main/java/com/dayu/pipirrapp/dao/AppDatabase.java
@@ -4,6 +4,7 @@ import androidx.room.RoomDatabase; import com.dayu.pipirrapp.bean.db.CenterPointBean; import com.dayu.pipirrapp.bean.db.DivideBean; import com.dayu.pipirrapp.bean.db.InspectionBean; import com.dayu.pipirrapp.bean.db.InspectionLocationBean; import com.dayu.pipirrapp.bean.db.LoginBean; @@ -17,7 +18,7 @@ * Date: 2023-11-05 16:23 * Description: */ @Database(entities = {InspectionBean.class,InspectionLocationBean.class, TagBean.class, LoginBean.class, CenterPointBean.class, MarkerBean.class}, version = 1, exportSchema = false) @Database(entities = {DivideBean.class,InspectionBean.class,InspectionLocationBean.class, TagBean.class, LoginBean.class, CenterPointBean.class, MarkerBean.class}, version = 1, exportSchema = false) public abstract class AppDatabase extends RoomDatabase { @@ -33,4 +34,6 @@ public abstract InspectionLocationDao inspectionLocationDao(); public abstract DivideDao divideDao(); } app/src/main/java/com/dayu/pipirrapp/dao/DivideDao.java
New file @@ -0,0 +1,53 @@ package com.dayu.pipirrapp.dao; import androidx.room.Dao; import androidx.room.Delete; import androidx.room.Insert; import androidx.room.OnConflictStrategy; import androidx.room.Query; import androidx.room.Update; import com.dayu.pipirrapp.bean.db.DivideBean; import com.dayu.pipirrapp.bean.db.MarkerBean; import java.util.List; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Single; /** * DivideDao - * * @author zuoxiao * @version 1.0 * @since 2025-01-13 */ @Dao public interface DivideDao { @Insert(onConflict = OnConflictStrategy.REPLACE) void insert(DivideBean divideBean); @Insert(onConflict = OnConflictStrategy.REPLACE) Completable insertAll(List<DivideBean> divideBeans); // 使用 Completable 进行异步插入 // @Insert(onConflict = OnConflictStrategy.REPLACE) // void insertAll(List<MarkerBean> markerBeans); // 使用 Completable 进行异步插入 @Update void update(DivideBean divideBean); @Delete void delete(DivideBean divideBean); @Query("DELETE FROM DivideBean") void deleteAll(); @Query("select * from DivideBean limit 1") DivideBean findFirst(); @Query("select * from DivideBean") List<DivideBean> findAll(); @Query("select * from DivideBean") Single<List<DivideBean>> findAllToSingle(); } app/src/main/java/com/dayu/pipirrapp/fragment/MapFragment.java
@@ -31,6 +31,7 @@ import com.dayu.pipirrapp.bean.db.LatLonBean; import com.dayu.pipirrapp.bean.db.MarkerBean; import com.dayu.pipirrapp.bean.net.CenterPointResult; import com.dayu.pipirrapp.bean.net.DivideResult; import com.dayu.pipirrapp.bean.net.InsectionResult; import com.dayu.pipirrapp.bean.net.InspectionRequest; import com.dayu.pipirrapp.bean.net.MarkerListResult; @@ -756,6 +757,41 @@ }); } /** * 获取分水房 */ private void getDivideList() { ApiManager.getInstance().requestPost(MapFragment.this.getContext(), BASE_URL + "/project/divide/getDivides", DivideResult.class, null, new SubscriberListener<BaseResponse<DivideResult>>() { @Override public void onNext(BaseResponse<DivideResult> t) { try { if (t.isSuccess()) { // if (t.getContent().) // // // // 使用 RxJava 异步插入数据 // DaoSingleton.getAsynchInstance(MapFragment.this.getContext()).markerDao().insertAll() // .subscribeOn(Schedulers.io()) // 在 IO 线程上执行 // .observeOn(AndroidSchedulers.mainThread()) // 在主线程上观察 // .subscribe(() -> { // // 插入成功 // Log.i("mWebView", "数据插入成功"); // }, throwable -> { // // 插入失败 // Log.e("mWebView", "数据插入失败: " + throwable.getMessage()); // }); } else { ToastUtil.showToastLong(MapFragment.this.getContext(), t.getMsg()); } } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } }); } @Override public void onDestroy() { app/src/main/java/com/dayu/pipirrapp/fragment/MyFragment.java
@@ -80,7 +80,7 @@ ConfirmDialog confirmDialog = new ConfirmDialog(MyFragment.this.getActivity(), "确定清除缓存吗?", (dialog, v1) -> { try { dialog.dismiss(); CleanDataUtils.cleanMapData(MyFragment.this.getContext()); CleanDataUtils.cleanData(MyFragment.this.getContext()); ToastUtil.showToast(MyFragment.this.getActivity(), "清除成功"); } catch (Exception e) { e.printStackTrace(); app/src/main/java/com/dayu/pipirrapp/tool/BigimageUtils.java
New file @@ -0,0 +1,28 @@ package com.dayu.pipirrapp.tool; import android.app.Activity; import com.dayu.pipirrapp.activity.IssueDetailActivity; import java.util.List; import cc.shinichi.library.ImagePreview; import cc.shinichi.library.bean.ImageInfo; /** * BigimageUtils -bigimageviewpager框架的公共类 * * @author zuoxiao * @version 1.0 * @since 2025-01-13 */ public class BigimageUtils { public static void showImages(Activity activity, int position, List<ImageInfo> imageInfoList) { ImagePreview.getInstance().with(activity).setIndex(position) // 是否显示下载按钮,在页面右下角。默认显示 .setShowDownButton(false) .setMediaInfoList(imageInfoList).start(); } } app/src/main/java/com/dayu/pipirrapp/utils/CleanDataUtils.java
@@ -5,6 +5,8 @@ import com.dayu.pipirrapp.MyApplication; import com.dayu.pipirrapp.dao.DaoSingleton; import cc.shinichi.library.glide.ImageLoader; /** * author: zuo * Date: 2024-10-10 @@ -16,17 +18,21 @@ /** * 清除地图缓存 */ public static void cleanMapData(Context context) { public static void cleanData(Context context) { //清除地图缓存 DaoSingleton.getInstance(context).markerDao().deleteAll(); //清除图片缓存 ImageLoader.cleanDiskCache(context); } /** * 清除用户信息缓存 * * @param context */ public static void cleanUserData(Context context) { DaoSingleton.getInstance(context).loginDao().deleteAll(); MyApplication.myApplication.token=""; MyApplication.myApplication.token = ""; SharedPreferencesHelper.getInstance(context).delete(CommonKeyName.Token); }