diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index 5a34468..0cb8468 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -51,5 +51,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 5627231..8b9254b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -12,8 +12,8 @@ android {
applicationId "com.navinfo.outdoor"
minSdkVersion 23
targetSdkVersion 30
- versionCode 34
- versionName "8.221130"
+ versionCode 35
+ versionName "8.221206"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
lintOptions {
@@ -163,5 +163,10 @@ dependencies {
implementation 'com.wanghong.webpnative:webpnative:0.1.0'
// 自动发送邮件 https://github.com/teprinciple/MailSender
implementation 'com.teprinciple:mailsender:1.2.0'
-
+// // https://github.com/JiongBull/jlog/blob/master/README_ZH.md 日志记录
+// implementation 'com.github.JiongBull:jlog:0.1.0'
+// // https://github.com/JiongBull/jlog-storage-qiniu 自动将日志上传到七牛云
+// implementation 'com.github.JiongBull:jlog-storage-qiniu:0.1.0'
+ // https://github.com/elvishew/xLog/blob/master/README_ZH.md 日志记录
+ implementation 'com.elvishew:xlog:1.10.1'
}
\ No newline at end of file
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 d596295..8931fbc 100644
--- a/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java
+++ b/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java
@@ -35,7 +35,17 @@ import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
+import com.elvishew.xlog.Logger;
+import com.elvishew.xlog.XLog;
+import com.elvishew.xlog.flattener.ClassicFlattener;
+import com.elvishew.xlog.printer.AndroidPrinter;
+import com.elvishew.xlog.printer.ConsolePrinter;
+import com.elvishew.xlog.printer.Printer;
+import com.elvishew.xlog.printer.file.FilePrinter;
+import com.elvishew.xlog.printer.file.naming.DateFileNameGenerator;
+import com.elvishew.xlog.printer.file.naming.FileNameGenerator;
import com.github.lazylibrary.util.FileUtils;
+import com.github.lazylibrary.util.NetWorkUtils;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@@ -146,9 +156,11 @@ import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
+import java.util.TimeZone;
import java.util.Timer;
import java.util.TimerTask;
import java.util.function.Predicate;
@@ -220,6 +232,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
private ImageView imgNaviDistance/*自动规划到距离最近的数据开关*/, imgRoadDirection; // 道路方向匹配开关
private Polyline currentNaviLine; // 当前界面上正显示的导航路径线,重绘路径时需要清除此前已绘制的路径
private boolean startMatchEnableDirection = true; // 是否启用方向匹配起点
+ private Logger logger;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -696,7 +709,9 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
@Override
public void onError(Throwable e) {
-
+ if (AutoTakePictureActivity.this!=null) {
+ write2Log("领取任务失败:", e.getMessage()+",网络状态-:"+ NetWorkUtils.getNetworkTypeName(AutoTakePictureActivity.this));
+ }
}
@Override
@@ -711,6 +726,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
private double minDistance = MATCH_START_BUFFER_DISTANCE; // 最小距离,需要在匹配过程点时判断哪个任务是距离最小的
private void startMatchRoadLink(Point currentPoint) {
if (roadLinkEntityList == null/*没有需要匹配的道路数据*/ || currentPoint == null/*没有位置信息*/) {
+ write2Log("开始匹配:", "roadLinkEntityList == null:"+(roadLinkEntityList == null)+",currentPoint == null:"+(currentPoint == null));
return;
}
double[] speedAndBearing = getSpeedAndBearing(currentPoint);
@@ -722,17 +738,27 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
matchMiddleDistance = MATCH_BUFFER_DISTANCE*1.5;
}
// 此处开始匹配起点
+ write2Log("开始匹配起点位置:", "currentLocation:"+currentPoint.toString()+",可匹配数据个数:"+roadLinkEntityList.size());
List matchStartList = roadLinkEntityList.stream()
// 筛选当前任务与起点距离
- .filter(it-> GeometryTools.createGeometry(it.getsPoint()).distance(currentPoint) {
+ if (GeometryTools.createGeometry(it.getsPoint()).distance(currentPoint) {
if (startMatchEnableDirection) {
double dataBearing = it.getAngle();
if (currentBearing!=0&&(Math.abs(dataBearing-currentBearing)<=90 || Math.abs(dataBearing-currentBearing)>=270)) {
return true;
+ } else {
+ // 根据方向判定无法匹配
+ write2Log("方向不匹配:", "currentBearing:"+currentBearing+",数据角度:"+dataBearing+",数据id:"+it.getDataDetail().getId());
+ return false;
}
- return false;
} else {
return true;
}
@@ -764,6 +790,8 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
// 将匹配到的数据加入到已匹配列表中
roadMatchEntityList.addAll(matchStartList);
+ } else {
+ write2Log("匹配起点数据为空:", "当前位置为:"+currentPoint.toString()+"当前角度:"+currentBearing);
}
// 尝试用当前位置点匹配已经匹配到的roadLink,如果能匹配到,需要将该点记录,如果无法匹配,则需要评估已匹配的link是否需要被剔除
@@ -1114,6 +1142,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
* 初始化领取任务的管理栈
* */
private Observable receiverRoadTask(RoadMatchEntity entity) {
+ write2Log("开始领取任务:", entity.getId()+"");
return Observable.just(entity).subscribeOn(Schedulers.io()).observeOn(Schedulers.computation())
.filter(roadMatchEntity -> roadMatchEntity!=null)
.map(new Function() {
@@ -1162,6 +1191,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
}
} else if (taskByNetBean.getCode() == 230) { // Token过期
systemTTS.playText("注意,Token过期,请重新登陆!");
+ write2Log("领取任务失败:", "Token过期:"+taskByNetBean.getMessage());
FlushTokenUtil.flushToken(AutoTakePictureActivity.this);
Message msg = handler.obtainMessage(0x103);
msg.obj = entity;
@@ -1169,6 +1199,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
} else {
systemTTS.playText("注意,领取任务失败!");
ToastUtils.Message(AutoTakePictureActivity.this,taskByNetBean.getMessage());
+ write2Log("领取任务失败:", "领取失败:"+taskByNetBean.getMessage());
Message msg = handler.obtainMessage(0x103);
msg.obj = entity;
handler.sendMessageDelayed(msg, 10*1000); // 10秒后重试
@@ -2073,6 +2104,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
public void onEventMessageMainThread(Message msg) {
if (msg.what == Constant.EVENT_WHAT_LOCATION_CHANGE) { // 用户位置更新
if (!locationEnable) {
+ write2Log("onEventMessageMainThread", "关闭了获取GPS定位开关");
return;
}
TencentLocation tencentLocation = (TencentLocation) msg.obj;
@@ -2087,10 +2119,41 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic
// 判断当前点位和上一个点位的距离,如果距离过近,忽略该点
Point currentPoint = (Point) GeometryTools.createGeometry(new LatLng(tencentLocation.getLatitude(), tencentLocation.getLongitude()));
if (lastPositionPoint!=null&&lastPositionPoint.distance(currentPoint)<5e-7) { // 如果当前点小于最小距离阈值,过滤该数据
+ write2Log("onEventMessageMainThread", "距离上一点位距离过近:currentPoint-"+currentPoint.toString()+"lastPositionPoint:"+lastPositionPoint.toString());
return;
}
lastPositionPoint = currentPoint;
startMatchRoadLink(currentPoint);
}
}
+ private void write2Log(String tag, String log) {
+ if (logger == null) {
+ Printer filePrinter = new FilePrinter // 打印日志到文件的打印器
+ .Builder(Constant.LOG_FOLDER) // 指定保存日志文件的路径
+ .fileNameGenerator(new DateFileNameGenerator() {
+ ThreadLocal mLocalDateFormat = new ThreadLocal() {
+
+ @Override
+ protected SimpleDateFormat initialValue() {
+ return new SimpleDateFormat("yyyy-MM-dd", Locale.US);
+ }
+ };
+ @Override
+ public boolean isFileNameChangeable() {
+ return true;
+ }
+
+ @Override
+ public String generateFileName(int logLevel, long timestamp) {
+ SimpleDateFormat sdf = mLocalDateFormat.get();
+ sdf.setTimeZone(TimeZone.getDefault());
+ return "AutoTakePicture-"+sdf.format(new Date(timestamp));
+ }
+ }) // 指定日志文件名生成器,默认为 ChangelessFileNameGenerator("log")
+ .flattener(new ClassicFlattener())
+ .build();
+ logger = XLog.printers(filePrinter).build();
+ }
+ logger.v(null, tag, log);
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/outdoor/activity/HomeActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/HomeActivity.java
index d2f459f..4611880 100644
--- a/app/src/main/java/com/navinfo/outdoor/activity/HomeActivity.java
+++ b/app/src/main/java/com/navinfo/outdoor/activity/HomeActivity.java
@@ -1,8 +1,21 @@
package com.navinfo.outdoor.activity;
+import com.elvishew.xlog.LogConfiguration;
+import com.elvishew.xlog.LogLevel;
+import com.elvishew.xlog.XLog;
+import com.elvishew.xlog.flattener.ClassicFlattener;
+import com.elvishew.xlog.printer.AndroidPrinter;
+import com.elvishew.xlog.printer.ConsolePrinter;
+import com.elvishew.xlog.printer.Printer;
+import com.elvishew.xlog.printer.file.FilePrinter;
+import com.elvishew.xlog.printer.file.backup.BackupStrategy2;
+import com.elvishew.xlog.printer.file.backup.FileSizeBackupStrategy2;
+import com.elvishew.xlog.printer.file.backup.NeverBackupStrategy;
+import com.elvishew.xlog.printer.file.clean.FileLastModifiedCleanStrategy;
+import com.elvishew.xlog.printer.file.naming.DateFileNameGenerator;
+import com.elvishew.xlog.printer.file.naming.LevelFileNameGenerator;
import com.github.lazylibrary.util.ShellUtils;
import com.google.gson.Gson;
-import com.hjq.permissions.XXPermissions;
import com.kongzue.dialog.interfaces.OnDialogButtonClickListener;
import com.kongzue.dialog.util.BaseDialog;
import com.kongzue.dialog.util.DialogSettings;
@@ -45,7 +58,6 @@ import com.google.android.material.tabs.TabLayout;
import com.gyf.immersionbar.ImmersionBar;
import com.teprinciple.mailsender.Mail;
import com.teprinciple.mailsender.MailSender;
-import com.umeng.message.PushAgent;
import com.umeng.message.UmengNotificationClickHandler;
import com.umeng.message.entity.UMessage;
@@ -104,6 +116,24 @@ public class HomeActivity extends BaseActivity {
// 检测用户是否为虚拟定位
boolean result = handler.sendEmptyMessageDelayed(0x101, 1000*60*(int)(10*Math.random()));
Log.d("HomeActivity", "作弊检查:"+result);
+
+ LogConfiguration logConfiguration = new LogConfiguration.Builder()
+// .enableStackTrace(5)
+ .enableBorder()
+ .tag("OutDoor").build();
+ Printer androidPrinter = new AndroidPrinter(true); // 通过 android.util.Log 打印日志的打印器
+ Printer consolePrinter = new ConsolePrinter(); // 通过 System.out 打印日志到控制台的打印器
+ Printer filePrinter = new FilePrinter // 打印日志到文件的打印器
+ .Builder(Constant.LOG_FOLDER) // 指定保存日志文件的路径
+ .fileNameGenerator(new LevelFileNameGenerator()) // 指定日志文件名生成器,默认为 ChangelessFileNameGenerator("log")
+ .flattener(new ClassicFlattener())
+ .build();
+ // 初始化XLog
+ XLog.init( // 初始化 XLog
+ logConfiguration, // 指定日志配置,如果不指定,会默认使用 new LogConfiguration.Builder().build()
+ androidPrinter, // 添加任意多的打印器。如果没有添加任何打印器,会默认使用 AndroidPrinter(Android)/ConsolePrinter(java)
+ consolePrinter,
+ filePrinter);
} else {
finish();
}
diff --git a/app/src/main/java/com/navinfo/outdoor/activity/PicturesActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/PicturesActivity.java
index 69d1031..4caf347 100644
--- a/app/src/main/java/com/navinfo/outdoor/activity/PicturesActivity.java
+++ b/app/src/main/java/com/navinfo/outdoor/activity/PicturesActivity.java
@@ -239,9 +239,9 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
});
RadioGroup radioGroupPicture = findViewById(R.id.radio_group_picture);
RadioButton radioBtnHand = findViewById(R.id.radio_btn_hand);
- RadioButton radioBtnHalfSec = findViewById(R.id.radio_btn_half_sec);
RadioButton radioBtnAuto = findViewById(R.id.radio_btn_auto);
RadioButton radioBtnAutoSec = findViewById(R.id.radio_btn_auto_sec);
+ RadioButton radioBtnHalfSec = findViewById(R.id.radio_btn_half_sec);
if (type == 3) {//poiVideo 1秒
ivPicVideoImage.setVisibility(View.VISIBLE);
ivPicRoadImage.setVisibility(View.GONE);
@@ -252,6 +252,10 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
ivPicVideoImage.setVisibility(View.GONE);
radioPicture = 4;
radioBtnHalfSec.setChecked(true);
+ // 道路采集时自动隐藏其他选项,只保留自动0.5秒1张的设定
+ radioBtnHand.setVisibility(View.GONE);
+ radioBtnAuto.setVisibility(View.GONE);
+ radioBtnAutoSec.setVisibility(View.GONE);
}
radioGroupPicture.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
diff --git a/app/src/main/java/com/navinfo/outdoor/api/UserApplication.java b/app/src/main/java/com/navinfo/outdoor/api/UserApplication.java
index b4a8fd0..61f56bf 100644
--- a/app/src/main/java/com/navinfo/outdoor/api/UserApplication.java
+++ b/app/src/main/java/com/navinfo/outdoor/api/UserApplication.java
@@ -11,6 +11,8 @@ import android.widget.RemoteViews;
import androidx.core.app.NotificationCompat;
+import com.elvishew.xlog.LogLevel;
+import com.elvishew.xlog.XLog;
import com.google.gson.Gson;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.cache.CacheEntity;
diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/MineFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/MineFragment.java
index 6a3f37a..9200308 100644
--- a/app/src/main/java/com/navinfo/outdoor/fragment/MineFragment.java
+++ b/app/src/main/java/com/navinfo/outdoor/fragment/MineFragment.java
@@ -174,7 +174,10 @@ public class MineFragment extends BaseFragment implements View.OnClickListener {
public void onError(Throwable e, int id) {
dismissLoadingDialog();
String message = e.getMessage();
- assert message != null;
+ if (message == null) {
+ ToastUtils.Message(getActivity(), "获取余额失败,请重试!");
+ return;
+ }
if (message.equals("timeout") || message.equals("Read time out")) {
ToastUtils.Message(getActivity(), "请求超时");
} else {
diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/PhotoFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/PhotoFragment.java
index 88b0f47..c1221f2 100644
--- a/app/src/main/java/com/navinfo/outdoor/fragment/PhotoFragment.java
+++ b/app/src/main/java/com/navinfo/outdoor/fragment/PhotoFragment.java
@@ -110,6 +110,11 @@ public class PhotoFragment extends BaseFragment implements View.OnClickListener
List fileArrayList = new ArrayList<>();
if (fileListByUUID.size() >= 2) {
for (int i = 0; i < fileListByUUID.size(); i++) {
+ File file = fileListByUUID.get(i);
+ // 过滤分包数据,如果不是txt和照片文件,则自动跳过
+ if (!file.getName().endsWith(".txt")&&!file.getName().endsWith(".webp")&&!file.getName().endsWith(".jpg")&&!file.getName().endsWith(".png")&&!file.getName().endsWith(".jpeg")) {
+ continue;
+ }
if (!fileListByUUID.get(i).getPath().endsWith("paper.txt")) {
fileArrayList.add(fileListByUUID.get(i));
} else {
diff --git a/app/src/main/java/com/navinfo/outdoor/util/AWMp4ParserHelper.java b/app/src/main/java/com/navinfo/outdoor/util/AWMp4ParserHelper.java
index b3003f4..4c6a848 100644
--- a/app/src/main/java/com/navinfo/outdoor/util/AWMp4ParserHelper.java
+++ b/app/src/main/java/com/navinfo/outdoor/util/AWMp4ParserHelper.java
@@ -417,12 +417,14 @@ public class AWMp4ParserHelper {
if (strings != null) {
for (int i = 0; i < strings.size(); i++) {
String[] split = strings.get(i).split(",");
- LatLng latLng = new LatLng();
- latLng.setLatitude(Double.valueOf(split[2]));
- latLng.setLongitude(Double.valueOf(split[3]));
- latLags.add(latLng);
+ if (split.length>3) {
+ LatLng latLng = new LatLng();
+ latLng.setLatitude(Double.valueOf(split[2]));
+ latLng.setLongitude(Double.valueOf(split[3]));
+ latLags.add(latLng);
+ }
}
- if (strings.size() == 1) {
+ if (latLags.size() == 1) {
LatLng latLng = latLags.get(0);
latLags.add(latLng);
}
diff --git a/app/src/main/java/com/navinfo/outdoor/util/DataSaveUtils.java b/app/src/main/java/com/navinfo/outdoor/util/DataSaveUtils.java
index 6e7c4e8..cdafa84 100644
--- a/app/src/main/java/com/navinfo/outdoor/util/DataSaveUtils.java
+++ b/app/src/main/java/com/navinfo/outdoor/util/DataSaveUtils.java
@@ -109,9 +109,12 @@ public class DataSaveUtils {
PoiDatabase.getInstance(mContext).getPoiDao().updatePoiEntity(poiEntity);
ToastUtils.Message(mContext, "数据:"+poiEntity.getName()+"已成功上传!");
}
- if (body==null||body.isEmpty()) {
+ if (body==null) {
throw new Exception(response.getMessage());
}
+ if (body.isEmpty()) {
+ return new HashMap<>();
+ }
String[] needUploadStrIndex = body.split(",");
// 批量转换String为int
int[] needUploadIndex = new int[needUploadStrIndex.length];
diff --git a/app/src/main/java/com/navinfo/outdoor/util/LogFileNameGenerate.java b/app/src/main/java/com/navinfo/outdoor/util/LogFileNameGenerate.java
new file mode 100644
index 0000000..4b9e5bd
--- /dev/null
+++ b/app/src/main/java/com/navinfo/outdoor/util/LogFileNameGenerate.java
@@ -0,0 +1,33 @@
+package com.navinfo.outdoor.util;
+
+import com.elvishew.xlog.printer.file.naming.DateFileNameGenerator;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
+
+public class LogFileNameGenerate extends DateFileNameGenerator {
+ ThreadLocal mLocalDateFormat = new ThreadLocal() {
+
+ @Override
+ protected SimpleDateFormat initialValue() {
+ return new SimpleDateFormat("yyyy-MM-dd", Locale.US);
+ }
+ };
+
+ @Override
+ public boolean isFileNameChangeable() {
+ return true;
+ }
+
+ /**
+ * Generate a file name which represent a specific date.
+ */
+ @Override
+ public String generateFileName(int logLevel, long timestamp) {
+ SimpleDateFormat sdf = mLocalDateFormat.get();
+ sdf.setTimeZone(TimeZone.getDefault());
+ return "default-"+sdf.format(new Date(timestamp));
+ }
+}
diff --git a/app/src/main/java/com/navinfo/outdoor/util/ToastUtils.java b/app/src/main/java/com/navinfo/outdoor/util/ToastUtils.java
index 23ed5bc..03ebe4a 100644
--- a/app/src/main/java/com/navinfo/outdoor/util/ToastUtils.java
+++ b/app/src/main/java/com/navinfo/outdoor/util/ToastUtils.java
@@ -5,7 +5,7 @@ import android.widget.Toast;
public class ToastUtils {
public static void Message(Activity context, String message) {
- if (context!=null){
+ if (context!=null&&message!=null){
context.runOnUiThread(new Runnable() {
@Override
public void run() {
diff --git a/build.gradle b/build.gradle
index 3d20aa3..e86cc48 100644
--- a/build.gradle
+++ b/build.gradle
@@ -3,6 +3,10 @@ buildscript {
ext.anko_version = '0.10.1'//扩展库版本
ext.kotlin_version = '1.5.10'
repositories {
+ maven { url "https://jitpack.io" }
+ maven{
+ url "https://maven.google.com/"
+ }
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
//友盟 检测bug
maven { url 'https://repo1.maven.org/maven2/' }
@@ -10,10 +14,9 @@ buildscript {
maven{
url "https://oss.sonatype.org/content/groups/public"
}
- maven { url "https://jitpack.io" }
- google()
jcenter()
mavenCentral()
+ google()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.2'
@@ -27,16 +30,20 @@ buildscript {
allprojects {
repositories {
- maven { url 'https://jitpack.io' }
+ maven { url "https://jitpack.io" }
+ maven{
+ url "https://maven.google.com/"
+ }
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
+ //友盟 检测bug
maven { url 'https://repo1.maven.org/maven2/' }
//腾讯地图
maven{
url "https://oss.sonatype.org/content/groups/public"
}
jcenter()
- google()
mavenCentral()
+ google()
}
}