diff --git a/app/build.gradle b/app/build.gradle index e4e77c9..1fa26f4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.navinfo.outdoor" minSdkVersion 24 targetSdkVersion 30 - versionCode 49 - versionName "8.230320-正式版" + versionCode 50 + versionName "8.230328-开发版" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk { @@ -130,7 +130,7 @@ dependencies { //加载图片的依赖包 implementation 'com.github.bumptech.glide:glide:4.8.0' //弹窗 https://github.com/kongzue/DialogV3 - implementation 'com.kongzue.dialog_v3x:dialog:3.2.4' +// implementation 'com.kongzue.dialog_v3x:dialog:3.2.4' implementation "com.kongzue.dialogx:DialogX:0.0.47" implementation "com.kongzue.dialogx.style:DialogXMIUIStyle:0.0.47" //xRecyclerview下拉刷新控件 diff --git a/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java index 8d0bee8..751b086 100644 --- a/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java +++ b/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java @@ -174,6 +174,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import io.reactivex.BackpressureStrategy; +import io.reactivex.Emitter; import io.reactivex.Flowable; import io.reactivex.FlowableEmitter; import io.reactivex.FlowableOnSubscribe; @@ -241,6 +242,9 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic private Logger logger = XLogUtils.Companion.getInstance().getAutoTakePictureLogWriter(); private ImageView imgLocationType; private PicturesSpeedCheck speedCheck; + // 任务结束对应的控制对象 + private Disposable finishDisposable; + private Emitter finishEmitter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -637,6 +641,82 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic // 清空缓存数据 spf.edit().remove("match-data"); spf.edit().commit(); + + // 启动数据完成的Rx流,当有数据需要完成时,会在捕捉流程中由上游发送数据 + finishDisposable = Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter emitter) throws Exception { + finishEmitter =emitter; + } + }) + .subscribeOn(Schedulers.io()).observeOn(Schedulers.computation()) + .filter(roadMatchEntity -> roadMatchEntity!=null) + .map(roadMatchEntity -> { + // 判断是否已领取,未领取则调用领取数据接口 + PoiEntity poiEntity = poiDao.getTaskIdPoiEntity(roadMatchEntity.getId()); + if (poiEntity == null) { + // 数据库中不存在,尝试再次领取 + InsertAndUpdateUtils.getInstance().insertOrUpdate(AutoTakePictureActivity.this, translateRoadMatchEntity(roadMatchEntity)); + // 调用网络领取任务 + receiverRoadTask(roadMatchEntity).subscribe(receiveObserver); + } + + List recorderList = recorderDao.getLocationRecorderByTime(roadMatchEntity.getStartMatchTime(), roadMatchEntity.getEndMathchTime()); + File recorderFolder = new File(Constant.PICTURE_FOLDER+"/"+poiEntity.getId()); + if (!recorderFolder.exists()) { + recorderFolder.mkdirs(); + } + // 编辑paper.txt + // 复制图片文件 + File paperFile = new File(recorderFolder.getAbsolutePath(), "paper.txt"); + for (int i = 0; i < recorderList.size(); i++) { + File originImg = new File(recorderList.get(i).getImgFileName()); + File destFile = new File(recorderFolder.getAbsolutePath()+"/"+i+".jpg"); + if (!destFile.exists()) { + FileUtils.copyFile(originImg.getAbsolutePath(), destFile.getAbsolutePath()); + } + FileUtils.writeFile(paperFile.getAbsolutePath(), recorderList.get(i).toString(picFormatter ,i), true); + } + + return poiEntity; + }) + .doOnNext(poiEntity -> { + // 网络提交数据 + if (poiEntity!=null) { + // 提交数据,更新状态 + roadSaveWork(poiEntity); + } + }) + .observeOn(AndroidSchedulers.mainThread()) + .onErrorResumeNext(Observable.empty()) + .subscribe(new Consumer() { + @Override + public void accept(PoiEntity poiEntity) { + // 重新绘制网络任务和本地任务 + initRoadLine2Map(); + finishTaskCount--; + if (finishTaskCount == 0&&wantBack) { + showExitDialog(false); + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) { + // 此处异常可能是服务返回的数据无法解析,但http正常返回了,因此可能为程序问题,不再重复尝试上报 + systemTTS.playText("注意,领取任务失败!"); + XLog.e("完成失败:"+throwable.getMessage()); + ToastUtils.Message(AutoTakePictureActivity.this, throwable.getMessage()); + finishTaskCount--; + if (finishTaskCount == 0&&wantBack) { + showExitDialog(true); + } + } + }, new Action() { + @Override + public void run() throws Exception { + + } + }); } /** @@ -1332,84 +1412,12 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic private boolean wantBack = false; // 用户是否想要退出当前界面,如果当前有正在处理的图片转移任务,会阻挡用户退出,此时该值状态置为true,当照片处理完后,可以对话框提示用户退出 private void finishRoadTask(Map finishEntityMap) { if (finishEntityMap!=null&&!finishEntityMap.isEmpty()) { - finishTaskCount++; - - Observable.fromIterable(finishEntityMap.values()) - .subscribeOn(Schedulers.io()).observeOn(Schedulers.computation()) - .filter(roadMatchEntity -> roadMatchEntity!=null) - .map(roadMatchEntity -> { - // 判断是否已领取,未领取则调用领取数据接口 - PoiEntity poiEntity = poiDao.getTaskIdPoiEntity(roadMatchEntity.getId()); - if (poiEntity == null) { - // 数据库中不存在,尝试再次领取 - InsertAndUpdateUtils.getInstance().insertOrUpdate(AutoTakePictureActivity.this, translateRoadMatchEntity(roadMatchEntity)); - // 调用网络领取任务 - receiverRoadTask(roadMatchEntity).subscribe(receiveObserver); - } - - List recorderList = recorderDao.getLocationRecorderByTime(roadMatchEntity.getStartMatchTime(), roadMatchEntity.getEndMathchTime()); - File recorderFolder = new File(Constant.PICTURE_FOLDER+"/"+poiEntity.getId()); - if (!recorderFolder.exists()) { - recorderFolder.mkdirs(); - } - // 编辑paper.txt - // 复制图片文件 - File paperFile = new File(recorderFolder.getAbsolutePath(), "paper.txt"); - for (int i = 0; i < recorderList.size(); i++) { - File originImg = new File(recorderList.get(i).getImgFileName()); - File destFile = new File(recorderFolder.getAbsolutePath()+"/"+i+".jpg"); - if (!destFile.exists()) { - FileUtils.copyFile(originImg.getAbsolutePath(), destFile.getAbsolutePath()); - } - FileUtils.writeFile(paperFile.getAbsolutePath(), recorderList.get(i).toString(picFormatter ,i), true); - } - - return poiEntity; - }) - .doOnNext(poiEntity -> { - // 网络提交数据 - if (poiEntity!=null) { - // 提交数据,更新状态 - roadSaveWork(poiEntity); - /*poiEntity.setTaskStatus(3); - InsertAndUpdateUtils.getInstance().insertOrUpdate(AutoTakePictureActivity.this, poiEntity);*/ - finishEntityMap.remove(poiEntity.getTaskId()); - } - }) - .observeOn(AndroidSchedulers.mainThread()) - .onErrorResumeNext(Observable.empty()) - .subscribe(new Consumer() { - @Override - public void accept(PoiEntity poiEntity) { -// // 已经处理过该任务,将其从finish列表中移除 -// if (poiEntity!=null) { -// finishEntityMap.remove(poiEntity.getTaskId()); -// } - - } - }, new Consumer() { - @Override - public void accept(Throwable throwable) { - // 此处异常可能是服务返回的数据无法解析,但http正常返回了,因此可能为程序问题,不再重复尝试上报 - systemTTS.playText("注意,领取任务失败!"); - XLog.e("完成失败:"+throwable.getMessage()); - ToastUtils.Message(AutoTakePictureActivity.this, throwable.getMessage()); - finishTaskCount--; - if (finishTaskCount == 0) { - showExitDialog(true); - } - } - }, new Action() { - @Override - public void run() throws Exception { - // 重新绘制网络任务和本地任务 - initRoadLine2Map(); - finishTaskCount--; - if (finishTaskCount == 0) { - showExitDialog(false); - } - } - }); + for (Map.Entry entry: finishEntityMap.entrySet()) { + if (finishEmitter!=null) { + finishTaskCount++; + finishEmitter.onNext(entry.getValue()); + } + } } } @@ -1741,6 +1749,9 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic // 退出后切换主定位模式为腾讯定位 LocationLifeCycle.getInstance().setMainLocationFrom(LocationLifeCycle.LOCATION_FROM.TENCENT); LocationLifeCycle.getInstance().stopGPSLocation(); + if (finishDisposable!=null&&!finishDisposable.isDisposed()) { + finishDisposable.dispose(); + } } @Override diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/AreaHubFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/AreaHubFragment.java index 211cdec..56a154b 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/AreaHubFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/AreaHubFragment.java @@ -519,7 +519,6 @@ public class AreaHubFragment extends BaseDrawerFragment implements View.OnClickL initPoiSaveLocal(true); } else { poiVideoUpload(poiEntity); - Constant.isPresent = false; } break; } @@ -681,7 +680,6 @@ public class AreaHubFragment extends BaseDrawerFragment implements View.OnClickL @Override public void run() { poiVideoUpload(poiEntity); - Constant.isPresent = false; } }); } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/BuildingInFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/BuildingInFragment.java index 2cf01e4..e1a6177 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/BuildingInFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/BuildingInFragment.java @@ -592,7 +592,6 @@ public class BuildingInFragment extends BaseDrawerFragment implements View.OnCli initPoiSaveLocal(true); } else { poiVideoUpload(poiEntity); - Constant.isPresent = false; } break; } @@ -782,7 +781,6 @@ public class BuildingInFragment extends BaseDrawerFragment implements View.OnCli @Override public void run() { poiVideoUpload(poiEntity); - Constant.isPresent = false; } }); } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java index 5dd2c9a..f77a5b1 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/PoiVideoFragment.java @@ -511,7 +511,6 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick initPoiSaveLocal(true); } else { poiVideoUpload(poiEntity); - Constant.isPresent = false; } break; case R.id.tv_draw_line_poi_video: @@ -683,7 +682,6 @@ public class PoiVideoFragment extends BaseDrawerFragment implements View.OnClick @Override public void run() { poiVideoUpload(poiEntity); - Constant.isPresent = false; } }); } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java index 7aeab3b..9e0f278 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java @@ -601,7 +601,6 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList initPoiSaveLocal(true); } else { poiVideoUpload(poiEntity); - Constant.isPresent = false; } break; @@ -778,7 +777,6 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList @Override public void run() { poiVideoUpload(poiEntity); - Constant.isPresent = false; } }); } diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/TrafficHubFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/TrafficHubFragment.java index 09804fd..8997582 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/TrafficHubFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/TrafficHubFragment.java @@ -519,7 +519,6 @@ public class TrafficHubFragment extends BaseDrawerFragment implements View.OnCli initPoiSaveLocal(true); } else { poiVideoUpload(poiEntity); - Constant.isPresent = false; } break; } @@ -681,7 +680,6 @@ public class TrafficHubFragment extends BaseDrawerFragment implements View.OnCli @Override public void run() { poiVideoUpload(poiEntity); - Constant.isPresent = false; } }); } diff --git a/app/src/main/java/com/navinfo/outdoor/http/HttpInterface.java b/app/src/main/java/com/navinfo/outdoor/http/HttpInterface.java index 6dbca73..3862823 100644 --- a/app/src/main/java/com/navinfo/outdoor/http/HttpInterface.java +++ b/app/src/main/java/com/navinfo/outdoor/http/HttpInterface.java @@ -3,8 +3,8 @@ package com.navinfo.outdoor.http; public class HttpInterface { // public static final String IP = "http://172.23.138.133:9999/m4";//测试接口-IP public static final String IP = "http://dtxbmaps.navinfo.com/dtxb/dev/m4";//开发接口-外网 - public static final String IP2 = "http://dtxbmaps.navinfo.com/dtxb/test/m4";//测试接口-外网 - public static final String IP1 = "http://dtxbmaps.navinfo.com/dtxb/m4";//正式接口 + public static final String IP1 = "http://dtxbmaps.navinfo.com/dtxb/test/m4";//测试接口-外网 + public static final String IP2 = "http://dtxbmaps.navinfo.com/dtxb/m4";//正式接口 public static final String USER_PATH = "/user/";//我的 public static final String MSG_LIST_PATH = "/msgList/";//发现 public static final String USER_LOGIN_PATH = "/userlogin/";//登录 diff --git a/app/src/main/java/com/navinfo/outdoor/util/PoiSaveUtils.java b/app/src/main/java/com/navinfo/outdoor/util/PoiSaveUtils.java index 8dd2d15..cfea049 100644 --- a/app/src/main/java/com/navinfo/outdoor/util/PoiSaveUtils.java +++ b/app/src/main/java/com/navinfo/outdoor/util/PoiSaveUtils.java @@ -178,7 +178,7 @@ public class PoiSaveUtils { public ObservableSource apply(Map.Entry integerPoiEntityEntry) throws Exception { PoiEntity poiEntity = integerPoiEntityEntry.getValue(); List photoFileList = AWMp4ParserHelper.getInstance().getFileListByUUID(poiEntity.getId()); - if (photoFileList == null||photoFileList.isEmpty()) { + if (photoFileList == null||photoFileList.size()<2/*如果文件压缩包内小于2个文件,说明拍摄的照片丢失了*/) { poiEntityUploadFailed(poiEntity, "照片数据获取为空!"); return Observable.empty(); } @@ -391,7 +391,7 @@ public class PoiSaveUtils { } else if (poiEntity.getType() == 3) { List videoFileList = AWMp4ParserHelper.getInstance().getFileListByUUID(poiEntity.getId()); - if (videoFileList != null && !videoFileList.isEmpty()) { + if (videoFileList != null && videoFileList.size()<2) { boolean existsPic = PoiSaveUtils.getInstance(mContext).checkPicExists(videoFileList); if (!existsPic) { bInt++; @@ -435,7 +435,7 @@ public class PoiSaveUtils { // } } else if (poiEntity.getType() == 4) { List videoFileList = AWMp4ParserHelper.getInstance().getFileListByUUID(poiEntity.getId()); - if (videoFileList != null && !videoFileList.isEmpty()) { + if (videoFileList != null && videoFileList.size()<2) { boolean existsPic = PoiSaveUtils.getInstance(mContext).checkPicExists(videoFileList); if (!existsPic) { bInt++; @@ -706,7 +706,7 @@ public class PoiSaveUtils { public boolean checkPicExists(List fileList) { boolean isExistsPic = false; // 是否记录的照片全部不存在 for (File picFile: fileList) { - if (picFile!=null&&picFile.exists()) { + if (picFile!=null&&picFile.exists()&&!picFile.getName().endsWith(".txt")/*至少包含1张照片*/) { isExistsPic = true; break; }