Commit ec0a04606dbc83f9694b974a8453038be5af5b54

Authored by 韩亚云
2 parents cda63833 c18828ed

Merge branch 'master' of bj.gitlab.cnlive.com:cnlive-team/ModulePedometer

Showing 45 changed files with 3554 additions and 306 deletions

Too many changes to show.

To preserve performance only 45 of 54 files are displayed.

build.gradle
@@ -100,5 +100,10 @@ ext { @@ -100,5 +100,10 @@ ext {
100 libAnalytics = '1.0.8' 100 libAnalytics = '1.0.8'
101 okhttp = '3.8.1' 101 okhttp = '3.8.1'
102 oki = '1.13.0' 102 oki = '1.13.0'
103 - 103 + //七牛
  104 + qiniuAndroidSdk = '7.3.11'
  105 + libUpload = '2.0.6'
  106 + //视频库
  107 + libVideoQiniu = '1.0.6'
  108 + libMediaPicker = '1.5.1'
104 } 109 }
moudle_pedometer/build.gradle
@@ -6,7 +6,7 @@ android { @@ -6,7 +6,7 @@ android {
6 compileSdkVersion 28 6 compileSdkVersion 28
7 buildToolsVersion "28.0.3" 7 buildToolsVersion "28.0.3"
8 8
9 - 9 + useLibrary 'org.apache.http.legacy'
10 defaultConfig { 10 defaultConfig {
11 minSdkVersion rootProject.ext.minSdkVersion 11 minSdkVersion rootProject.ext.minSdkVersion
12 targetSdkVersion rootProject.ext.targetSdkVersion 12 targetSdkVersion rootProject.ext.targetSdkVersion
@@ -112,5 +112,13 @@ dependencies { @@ -112,5 +112,13 @@ dependencies {
112 implementation project(':library_baidumap') 112 implementation project(':library_baidumap')
113 //加载动画 113 //加载动画
114 implementation 'com.wang.avi:library:2.1.3' 114 implementation 'com.wang.avi:library:2.1.3'
115 - 115 + implementation "com.cnlive.libs:video_qiniu:$rootProject.libVideoQiniu"
  116 + //七牛上传
  117 + implementation "com.qiniu:qiniu-android-sdk:$rootProject.qiniuAndroidSdk"
  118 + implementation("com.cnlive:lib_upload:$rootProject.libUpload") {
  119 + exclude group: 'com.android.support'
  120 + exclude group: 'com.cnlive'
  121 + }
  122 + implementation "com.cnlive.libs:mediapicker:$rootProject.libMediaPicker"
  123 + implementation 'org.apache.httpcomponents:httpcore:4.4.2'
116 } 124 }
moudle_pedometer/src/main/AndroidManifest.xml
@@ -123,9 +123,11 @@ @@ -123,9 +123,11 @@
123 android:process=":step" /> 123 android:process=":step" />
124 <activity 124 <activity
125 android:name="com.cnlive.moudle.pedometer.ui.activity.RunningMapActivity" 125 android:name="com.cnlive.moudle.pedometer.ui.activity.RunningMapActivity"
  126 + android:launchMode="singleTask"
126 android:process=":step" /> <!-- android:theme="@style/Theme.AppCompat.Light.NoActionBar" --> 127 android:process=":step" /> <!-- android:theme="@style/Theme.AppCompat.Light.NoActionBar" -->
127 <activity 128 <activity
128 android:name="com.cnlive.moudle.pedometer.ui.activity.RunRaceDetailActivity" 129 android:name="com.cnlive.moudle.pedometer.ui.activity.RunRaceDetailActivity"
  130 + android:launchMode="singleTask"
129 android:process=":step" /> 131 android:process=":step" />
130 <activity 132 <activity
131 android:name="com.cnlive.moudle.pedometer.ui.activity.RunningFinishActivity" 133 android:name="com.cnlive.moudle.pedometer.ui.activity.RunningFinishActivity"
moudle_pedometer/src/main/java/com/cnlive/moudle/collectionTrace/frame/view/CollRunMainFragmentView.java
@@ -269,9 +269,9 @@ public class CollRunMainFragmentView implements MvpView { @@ -269,9 +269,9 @@ public class CollRunMainFragmentView implements MvpView {
269 //隐藏两个按钮 269 //隐藏两个按钮
270 fragment.binding.flStopTip.setVisibility(View.INVISIBLE); 270 fragment.binding.flStopTip.setVisibility(View.INVISIBLE);
271 fragment.binding.llTwoBottomButton.setVisibility(View.GONE); 271 fragment.binding.llTwoBottomButton.setVisibility(View.GONE);
272 - ButtonAnimUtil.setViewShowZoomIn(fragment.binding.llPause); 272 +// ButtonAnimUtil.setViewShowZoomIn(fragment.binding.llPause);
273 //显示暂停按钮 273 //显示暂停按钮
274 - fragment.binding.llPause.setVisibility(View.VISIBLE); 274 + fragment.binding.flPause.setVisibility(View.VISIBLE);
275 // 275 //
276 } 276 }
277 }, ButtonAnimUtil.DEFAULT_ZOOM_DURATION * 2); 277 }, ButtonAnimUtil.DEFAULT_ZOOM_DURATION * 2);
@@ -401,12 +401,12 @@ public class CollRunMainFragmentView implements MvpView { @@ -401,12 +401,12 @@ public class CollRunMainFragmentView implements MvpView {
401 //将当前计时器时间戳写入数据库 401 //将当前计时器时间戳写入数据库
402 setSQLPauseTime(uid); 402 setSQLPauseTime(uid);
403 needWriteDataFlag = false; 403 needWriteDataFlag = false;
404 - ButtonAnimUtil.setViewHideZoomOut(fragment.binding.llPause); 404 +// ButtonAnimUtil.setViewHideZoomOut(fragment.binding.llPause);
405 handler.postDelayed(new Runnable() { 405 handler.postDelayed(new Runnable() {
406 @Override 406 @Override
407 public void run() { 407 public void run() {
408 //隐藏本身 408 //隐藏本身
409 - fragment.binding.llPause.setVisibility(View.GONE); 409 + fragment.binding.flPause.setVisibility(View.GONE);
410 } 410 }
411 }, ButtonAnimUtil.HIDE_VIEW_ZOOM_DURATION); 411 }, ButtonAnimUtil.HIDE_VIEW_ZOOM_DURATION);
412 //显示继续按钮 412 //显示继续按钮
moudle_pedometer/src/main/java/com/cnlive/moudle/collectionTrace/frame/view/CollRunRaceDetailFragmentView.java
@@ -119,9 +119,9 @@ public class CollRunRaceDetailFragmentView implements MvpView, SensorEventListen @@ -119,9 +119,9 @@ public class CollRunRaceDetailFragmentView implements MvpView, SensorEventListen
119 this.runRaceDetailInfo = runRaceDetailInfo; 119 this.runRaceDetailInfo = runRaceDetailInfo;
120 //初始化地图点位 120 //初始化地图点位
121 if (runRaceDetailInfo.getLatLongitude() != null) { 121 if (runRaceDetailInfo.getLatLongitude() != null) {
122 - Log.e(TAG, "initView: 长度:" + runRaceDetailInfo.getLatLongitude().length()); 122 +// Log.e(TAG, "initView: 长度:" + runRaceDetailInfo.getLatLongitude().length());
123 trackPoints = GsonUtil.jsonToList(runRaceDetailInfo.getLatLongitude(), LatLng.class); 123 trackPoints = GsonUtil.jsonToList(runRaceDetailInfo.getLatLongitude(), LatLng.class);
124 - Log.e(TAG, "initView: trackPoints" + trackPoints.size()); 124 +// Log.e(TAG, "initView: trackPoints" + trackPoints.size());
125 // MyMapUtil.drawServerLineTrack(getContext(), baiduMap, trackPoints, SortType.asc, R.color.green_round, R.drawable.icon_start, R.drawable.icon_end); 125 // MyMapUtil.drawServerLineTrack(getContext(), baiduMap, trackPoints, SortType.asc, R.color.green_round, R.drawable.icon_start, R.drawable.icon_end);
126 // //自动计算地图缩放 126 // //自动计算地图缩放
127 MapStatus.Builder builder = new MapStatus.Builder(); 127 MapStatus.Builder builder = new MapStatus.Builder();
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/commonInfo/CommonInfo.java
@@ -295,6 +295,69 @@ public class CommonInfo { @@ -295,6 +295,69 @@ public class CommonInfo {
295 return MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).getBoolean("runIsPauseState", false); 295 return MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).getBoolean("runIsPauseState", false);
296 } 296 }
297 297
  298 + /**
  299 + * 设置轨迹查询开始时间
  300 + *
  301 + * @param context
  302 + * @param startTime
  303 + */
  304 + public static void setQueryTraceStartTime(Context context, long startTime) {
  305 + MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).putLong("runQueryTraceStartTime", startTime);
  306 +
  307 + }
  308 +
  309 + /**
  310 + * 互殴轨迹查询开始时间
  311 + *
  312 + * @param context
  313 + */
  314 + public static long getQueryTraceStartTime(Context context) {
  315 + return MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).getLong("runQueryTraceStartTime", 0);
  316 +
  317 + }
  318 +
  319 + /**
  320 + * 设置轨迹查询结束时间
  321 + *
  322 + * @param context
  323 + * @param startTime
  324 + */
  325 + public static void setQueryTraceEndTime(Context context, long startTime) {
  326 + MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).putLong("runQueryTraceEndTime", startTime);
  327 +
  328 + }
  329 +
  330 + /**
  331 + * 互殴轨迹查询开始时间
  332 + *
  333 + * @param context
  334 + */
  335 + public static long getQueryTraceEndTime(Context context) {
  336 + return MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).getLong("runQueryTraceEndTime", 0);
  337 +
  338 + }
  339 +
  340 + /**
  341 + * 设置轨迹查询实体名称
  342 + *
  343 + * @param context
  344 + */
  345 + public static void setQueryEntityName(Context context, String entityName) {
  346 + MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).putString("runQueryEntityName", entityName);
  347 +
  348 + }
  349 +
  350 + /**
  351 + * 互殴轨迹查询\的实体名称
  352 + *
  353 + * @param context
  354 + */
  355 + public static String getQueryQueryEntityName(Context context) {
  356 + return MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).getString("runQueryEntityName", "");
  357 +
  358 + }
  359 +
  360 +
298 /*重置 361 /*重置
299 * @param context 362 * @param context
300 */ 363 */
@@ -309,6 +372,12 @@ public class CommonInfo { @@ -309,6 +372,12 @@ public class CommonInfo {
309 MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("FirstStepSendTraceTip"); 372 MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("FirstStepSendTraceTip");
310 MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("FenceId"); 373 MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("FenceId");
311 MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("IsFirstShowTimeTip"); 374 MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("IsFirstShowTimeTip");
  375 + MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("runIsPauseState");
  376 +// MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("runQueryTraceStartTime");
  377 +// MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("runQueryTraceEndTime");
  378 +// MySpHelper.getInstance(context, Context.MODE_MULTI_PROCESS).removeKey("runQueryEntityName");
  379 +
  380 +
312 } 381 }
313 382
314 /*重置赛事 383 /*重置赛事
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/presenter/RunRaceDetailFragmentPresenter.java
@@ -33,41 +33,6 @@ public class RunRaceDetailFragmentPresenter extends MvpBasePresenter&lt;RunRaceDeta @@ -33,41 +33,6 @@ public class RunRaceDetailFragmentPresenter extends MvpBasePresenter&lt;RunRaceDeta
33 paramsMap.put("sid", userId); 33 paramsMap.put("sid", userId);
34 // 0-用户使用 1-运营使用 34 // 0-用户使用 1-运营使用
35 paramsMap.put("state", state); 35 paramsMap.put("state", state);
36 -// Logic.create(paramsMap)  
37 -// .action(new Logic.Action<Map<String, String>, BaseInfo<RunRaceDetailInfo>>() {  
38 -// @Override  
39 -// public Disposable action(Map<String, String> paramsMap, DataCallback<BaseInfo<RunRaceDetailInfo>> dataCallback) {  
40 -// return ApiRequest.service(ApiServiceRunLin.class, api -> api.getRunRaceDetail(paramsMap)).subscribe(context, dataCallback);  
41 -// }  
42 -// }).<BaseInfo<RunRaceDetailInfo>>event()  
43 -// .setStateCallback(new StateCallback() {  
44 -// @Override  
45 -// public void onState(int i) {  
46 -// if (getView() == null) {  
47 -// return;  
48 -// }  
49 -// if (i == STATE_LOAD) {  
50 -// QMUITipDialogUtil.loadingDialog(context, "正在获取赛事详情", false);  
51 -// } else if (i == STATE_IDLE) {  
52 -// }  
53 -//  
54 -// }  
55 -// })  
56 -// .setSuccessCallback(new SuccessCallback<BaseInfo<RunRaceDetailInfo>>() {  
57 -// @Override  
58 -// public void onSuccess(BaseInfo<RunRaceDetailInfo> runRaceDetailInfoBaseInfo) {  
59 -// if (getView() == null) {  
60 -// return;  
61 -// }  
62 -// }  
63 -// }).setFailureCallback(new FailureCallback() {  
64 -// @Override  
65 -// public void onFailure(int i, String s) {  
66 -// if (getView() == null) {  
67 -// return;  
68 -// }  
69 -// }  
70 -// }).start();  
71 Logic.create(paramsMap).action(new Logic.Action<Map<String, String>, BaseInfo<RunRaceDetailInfo>>() { 36 Logic.create(paramsMap).action(new Logic.Action<Map<String, String>, BaseInfo<RunRaceDetailInfo>>() {
72 @Override 37 @Override
73 public Disposable action(Map<String, String> stringStringMap, DataCallback<BaseInfo<RunRaceDetailInfo>> dataCallback) { 38 public Disposable action(Map<String, String> stringStringMap, DataCallback<BaseInfo<RunRaceDetailInfo>> dataCallback) {
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/presenter/RunningFinishFragmetPresenter.java
1 package com.cnlive.moudle.pedometer.frame.presenter; 1 package com.cnlive.moudle.pedometer.frame.presenter;
2 2
  3 +import android.content.Context;
  4 +import android.graphics.Bitmap;
  5 +import android.os.Handler;
  6 +import android.text.TextUtils;
  7 +import android.util.Log;
  8 +import android.view.View;
  9 +import android.widget.Toast;
  10 +
  11 +import com.baidu.mapapi.map.BaiduMap;
  12 +import com.baidu.mapapi.model.LatLng;
  13 +import com.baidu.trace.LBSTraceClient;
  14 +import com.baidu.trace.model.SortType;
  15 +import com.cnlive.libs.base.logic.Event;
  16 +import com.cnlive.libs.base.logic.Logic;
  17 +import com.cnlive.libs.base.logic.callback.DataCallback;
  18 +import com.cnlive.libs.base.logic.callback.FailureCallback;
  19 +import com.cnlive.libs.base.logic.callback.StateCallback;
  20 +import com.cnlive.libs.base.logic.callback.SuccessCallback;
  21 +import com.cnlive.libs.base.util.ToastUtil;
  22 +import com.cnlive.moudle.pedometer.commonInfo.CommonInfo;
3 import com.cnlive.moudle.pedometer.frame.view.RunningFinishFragmentView; 23 import com.cnlive.moudle.pedometer.frame.view.RunningFinishFragmentView;
  24 +import com.cnlive.moudle.pedometer.model.RunningFinishBean;
  25 +import com.cnlive.moudle.pedometer.net.ApiServiceRunLin;
  26 +import com.cnlive.moudle.pedometer.net.SubscriptionRequest;
  27 +import com.cnlive.moudle.pedometer.net.bean.BaseInfo;
  28 +import com.cnlive.moudle.pedometer.net.bean.RunRaceDetailInfo;
  29 +import com.cnlive.moudle.pedometer.service.StepService;
  30 +import com.cnlive.moudle.pedometer.sql.entity.UserStepEntity;
  31 +import com.cnlive.moudle.pedometer.ui.widget.SelectDialog;
  32 +import com.cnlive.moudle.pedometer.ui.widget.TipDialog;
  33 +import com.cnlive.moudle.pedometer.upload.UploadLogic;
  34 +import com.cnlive.moudle.pedometer.utils.GsonUtil;
  35 +import com.cnlive.moudle.pedometer.utils.MyMapUtil;
  36 +import com.cnlive.moudle.pedometer.utils.QMUITipDialogUtil;
  37 +import com.cnlive.moudle.pedometer.utils.StepUtil;
  38 +import com.cnlive.moudle.pedometer.utils.TimeUtil;
  39 +import com.example.moudle_pedometer.R;
4 import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter; 40 import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
5 41
  42 +import java.io.File;
  43 +import java.io.FileOutputStream;
  44 +import java.text.SimpleDateFormat;
  45 +import java.util.ArrayList;
  46 +import java.util.Date;
  47 +import java.util.HashMap;
  48 +import java.util.List;
  49 +import java.util.Map;
  50 +
  51 +import io.reactivex.disposables.Disposable;
  52 +
  53 +import static com.cnlive.libs.base.logic.Config.STATE_IDLE;
  54 +import static com.cnlive.libs.base.logic.Config.STATE_LOAD;
  55 +
6 public class RunningFinishFragmetPresenter extends MvpBasePresenter<RunningFinishFragmentView> { 56 public class RunningFinishFragmetPresenter extends MvpBasePresenter<RunningFinishFragmentView> {
  57 + private LBSTraceClient mClient = null;
  58 + private String imports = "[{\"latitude\":39.93395837223,\"latitudeE6\":3.993395837223E7,\"longitude\":116.30855458458,\"longitudeE6\":1.1630855458457999E8},{\"latitude\":39.93396326228,\"latitudeE6\":3.993396326228E7,\"longitude\":116.30861833018,\"longitudeE6\":1.1630861833017999E8},{\"latitude\":39.934156956749995,\"latitudeE6\":3.993415695675E7,\"longitude\":116.30869672329999,\"longitudeE6\":1.163086967233E8},{\"latitude\":39.934220163784,\"latitudeE6\":3.9934220163784E7,\"longitude\":116.3087100148,\"longitudeE6\":1.163087100148E8},{\"latitude\":39.934285263072,\"latitudeE6\":3.9934285263072E7,\"longitude\":116.30866498582,\"longitudeE6\":1.1630866498582E8},{\"latitude\":39.934351994321,\"latitudeE6\":3.9934351994320996E7,\"longitude\":116.30865820422,\"longitudeE6\":1.1630865820422E8},{\"latitude\":39.934393506188,\"latitudeE6\":3.9934393506188005E7,\"longitude\":116.3087268324,\"longitudeE6\":1.163087268324E8},{\"latitude\":39.934515310648,\"latitudeE6\":3.9934515310648E7,\"longitude\":116.30877023341,\"longitudeE6\":1.1630877023341E8},{\"latitude\":39.934576888398,\"latitudeE6\":3.9934576888398E7,\"longitude\":116.30876860572,\"longitudeE6\":1.1630876860572E8},{\"latitude\":39.934641987882,\"latitudeE6\":3.9934641987882E7,\"longitude\":116.30872520428,\"longitudeE6\":1.1630872520427999E8},{\"latitude\":39.934720386354,\"latitudeE6\":3.9934720386354E7,\"longitude\":116.30874175083,\"longitudeE6\":1.1630874175083E8},{\"latitude\":39.934703845843,\"latitudeE6\":3.9934703845843E7,\"longitude\":116.30880197017,\"longitudeE6\":1.1630880197016999E8},{\"latitude\":39.934719055573,\"latitudeE6\":3.9934719055573E7,\"longitude\":116.30896553874,\"longitudeE6\":1.1630896553874E8},{\"latitude\":39.93482461107,\"latitudeE6\":3.993482461107E7,\"longitude\":116.30924466304002,\"longitudeE6\":1.1630924466304001E8},{\"latitude\":39.934804821527,\"latitudeE6\":3.9934804821527004E7,\"longitude\":116.30935804892,\"longitudeE6\":1.1630935804892E8},{\"latitude\":39.934856643274,\"latitudeE6\":3.9934856643274E7,\"longitude\":116.30943996874,\"longitudeE6\":1.1630943996874E8},{\"latitude\":39.934844987999,\"latitudeE6\":3.9934844987999E7,\"longitude\":116.30952026112,\"longitudeE6\":1.1630952026112E8},{\"latitude\":39.934722121282,\"latitudeE6\":3.9934722121282004E7,\"longitude\":116.30967542086,\"longitudeE6\":1.1630967542086E8},{\"latitude\":39.934828721701,\"latitudeE6\":3.9934828721701E7,\"longitude\":116.30960516489,\"longitudeE6\":1.1630960516489E8},{\"latitude\":39.934408798988,\"latitudeE6\":3.9934408798988E7,\"longitude\":116.30961357453,\"longitudeE6\":1.1630961357453E8},{\"latitude\":39.934345321571,\"latitudeE6\":3.9934345321571E7,\"longitude\":116.30960842073,\"longitudeE6\":1.1630960842073E8},{\"latitude\":39.93436159016,\"latitudeE6\":3.9934361590160005E7,\"longitude\":116.30954331882,\"longitudeE6\":1.1630954331882E8},{\"latitude\":39.934295133241,\"latitudeE6\":3.9934295133241E7,\"longitude\":116.30957668364,\"longitudeE6\":1.1630957668364E8},{\"latitude\":39.934188525341,\"latitudeE6\":3.9934188525341E7,\"longitude\":116.30958183769,\"longitudeE6\":1.1630958183769001E8},{\"latitude\":39.933976660469,\"latitudeE6\":3.9933976660469E7,\"longitude\":116.30954494693,\"longitudeE6\":1.1630954494693E8},{\"latitude\":39.933993190121,\"latitudeE6\":3.9933993190121E7,\"longitude\":116.30939114375,\"longitudeE6\":1.1630939114375001E8},{\"latitude\":39.933938115564,\"latitudeE6\":3.9933938115563996E7,\"longitude\":116.30932956832,\"longitudeE6\":1.1630932956831999E8},{\"latitude\":39.933916130555,\"latitudeE6\":3.9933916130555E7,\"longitude\":116.30922269279,\"longitudeE6\":1.1630922269279E8},{\"latitude\":39.933836097011,\"latitudeE6\":3.9933836097011E7,\"longitude\":116.30914077307,\"longitudeE6\":1.1630914077307E8}]\n";
  59 +
  60 + public void saveRouteData(Context context, UserStepEntity userStepEntity, RunningFinishBean runningFinishBean) {
  61 + // 赛事id
  62 + String eventId = userStepEntity.getStreetId();
  63 + //用户ID
  64 + String sid = CommonInfo.getUserId(context);
  65 + //用时
  66 + String employTime = runningFinishBean.getEmployTime();
  67 + //路线全程里数
  68 + String mileage = "";
  69 + if ("--".equals(runningFinishBean.getRunDistance())) {
  70 + mileage = "0";
  71 + } else {
  72 + mileage = runningFinishBean.getRunDistance();
  73 + }
  74 + //配速
  75 + String pace = "";
  76 + if ("--".equals(runningFinishBean.getSpeed())) {
  77 + pace = "0";
  78 + } else {
  79 + pace = runningFinishBean.getSpeed();
  80 + }
  81 + // 路线图
  82 + String roadmap = runningFinishBean.getRoadmap();
  83 + //经纬度
  84 + String latLongitude = "";
  85 + // 开始时间
  86 + String startTime = userStepEntity.getStartTimeStamp() + "";
  87 + //结束时间
  88 + String endTime = userStepEntity.getFinishTimeStamp() + "";
  89 + //暂停时间
  90 + String pauseTime = "";
  91 + String isPause = "0";//1暂停
  92 + if (userStepEntity.getPauseCount() > 0) {
  93 + pauseTime = userStepEntity.getUserPauseTimeStamp() + "";
  94 + isPause = "1";
  95 + }
  96 + //继续时间
  97 + String continueTime = "";
  98 + //是否完成
  99 + String completeStatus = runningFinishBean.getIsFinish();
  100 +
  101 + //设置请求参数
  102 + Map<String, String> paramsMap = new HashMap<>();
  103 + paramsMap.put("eventId", eventId);
  104 + paramsMap.put("sid", sid);
  105 + paramsMap.put("employTime", employTime);
  106 + paramsMap.put("mileage", mileage);
  107 + paramsMap.put("pace", pace);
  108 + paramsMap.put("latLongitude", latLongitude);
  109 + paramsMap.put("roadmap", roadmap);
  110 + paramsMap.put("startTime", startTime);
  111 + paramsMap.put("endTime", endTime);
  112 + paramsMap.put("pauseTime", pauseTime);
  113 + paramsMap.put("continueTime", continueTime);
  114 + paramsMap.put("isPause", isPause);
  115 + paramsMap.put("completeStatus", completeStatus);
  116 +
  117 +
  118 + Logic.create(paramsMap).action(new Logic.Action<Map<String, String>, BaseInfo>() {
  119 + @Override
  120 + public Disposable action(Map<String, String> stringStringMap, DataCallback<BaseInfo> dataCallback) {
  121 + return SubscriptionRequest.service(ApiServiceRunLin.class, api -> api.saveRouteData(stringStringMap)).subscribe(context, dataCallback);
  122 + }
  123 + }).<BaseInfo>event()
  124 + .setFailureCallback(new FailureCallback() {
  125 + @Override
  126 + public void onFailure(int code, String message) {
  127 + QMUITipDialogUtil.dismessDialog();
  128 + if (getView() == null) {
  129 + return;
  130 + }
  131 + Log.e("saveRouteData", "onFailure: " + message);
  132 +// getView().hideLoadingView();
  133 +// getView().showRetryView(code, new View.OnClickListener() {
  134 +// @Override
  135 +// public void onClick(View view) {
  136 +// getRunRaceDetailInfo(context, id, userId,state);
  137 +// }
  138 +// });
  139 + }
  140 + }).setSuccessCallback(new SuccessCallback<BaseInfo>() {
  141 + @Override
  142 + public void onSuccess(BaseInfo baseInfo) {
  143 + if (getView() == null) {
  144 + return;
  145 + }
  146 + Log.e("saveRouteData", "onSuccess: ");
  147 +
  148 + QMUITipDialogUtil.dismessDialog();
  149 + getView().updataIsFinish(runningFinishBean);
  150 + StepUtil.clearRunData(context, CommonInfo.getUserId(context));
  151 + CommonInfo.reset(context);
  152 +
  153 + }
  154 + }).start();
  155 + }
  156 +
  157 + /**
  158 + * 查询当前用户历史轨迹
  159 + */
  160 + public void queryHistoryTrace(Context context, UserStepEntity userStepEntity, RunningFinishBean runningFinishBean) {
  161 + //查询当前用户的历史轨迹
  162 + long startTime = userStepEntity.getStartTimeStamp();
  163 + //获取当前的时间戳(秒)
  164 + long endTime = userStepEntity.getFinishTimeStamp();
  165 + //获取当前的实体名称
  166 + String entityName = CommonInfo.getUserId(context);
  167 + //路线全程里数
  168 +
  169 + //打的重要点
  170 + List<LatLng> importPoints = GsonUtil.jsonToList(imports, LatLng.class);
  171 + if (mClient == null) {
  172 + mClient = new LBSTraceClient(context);
  173 + }
  174 + MyMapUtil.queryHistoryTrace(context, mClient, entityName, startTime, endTime, new MyMapUtil.CallBack() {
  175 + @Override
  176 + public void success(List<LatLng> resultPoints) {
  177 + if (resultPoints != null) {
  178 + if (getView() != null && resultPoints != null) {
  179 + if (importPoints != null && resultPoints != null) {
  180 + //判断是否完成
  181 + boolean isFinish = MyMapUtil.checkIsFinishTrace(importPoints, resultPoints, 0.6);
  182 + if (isFinish) {
  183 + Toast.makeText(context, "完成", Toast.LENGTH_LONG).show();
  184 + runningFinishBean.setIsFinish("1");
  185 + } else {
  186 + Toast.makeText(context, "没有完成", Toast.LENGTH_LONG).show();
  187 + runningFinishBean.setIsFinish("0");
  188 + }
  189 + MyMapUtil.drawHistoryTrack(context, getView().baiduMap, resultPoints, SortType.asc, R.color.red, R.drawable.icon_start, R.drawable.icon_end);
  190 + new Handler().postDelayed(new Runnable() {
  191 + @Override
  192 + public void run() {
  193 + //开始截图
  194 + getView().baiduMap.snapshot(new BaiduMap.SnapshotReadyCallback() {
  195 + @Override
  196 + public void onSnapshotReady(Bitmap bitmap) {
  197 + if (context == null) {
  198 + return;
  199 + }
  200 + if (null == bitmap) {
  201 + return;
  202 + }
  203 + //开始保存截屏
  204 + try {
  205 + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
  206 + File image = new File(context.getExternalCacheDir() + "/location_screenshot_" + sdf.format(new Date()) + ".jpeg");
  207 + FileOutputStream fos = new FileOutputStream(image);
  208 + boolean b = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
  209 + fos.flush();
  210 + fos.close();
  211 + String mapImagePath = image.getAbsolutePath();
  212 + if (!TextUtils.isEmpty(mapImagePath)) {
  213 + QMUITipDialogUtil.loadingDialog(context, "正在上传数据", false);
  214 + //开始上传7牛
  215 + List<String> imagePaths = new ArrayList<>();
  216 + imagePaths.add(mapImagePath);
  217 + UploadLogic.uploadAddressPicInfo(getView().getContext(), imagePaths, new Event<String>()
  218 + .setFailureCallback(new FailureCallback() {
  219 + @Override
  220 + public void onFailure(int i, String s) {
  221 + QMUITipDialogUtil.dismessDialog();
  222 + }
  223 + })
  224 + .setSuccessCallback(new SuccessCallback<String>() {
  225 + @Override
  226 + public void onSuccess(String data) {
  227 + //设置截图
  228 + runningFinishBean.setRoadmap(data);
  229 + //开始向服务器传数据
  230 + saveRouteData(context, userStepEntity, runningFinishBean);
  231 + }
  232 + })
  233 + );
  234 + }
  235 + } catch (Exception e) {
  236 + e.printStackTrace();
  237 + }
  238 + }
  239 + });
  240 +//
  241 + }
  242 + }, 2000);
  243 + //
  244 + }
  245 + }
  246 + }
  247 + //查询失败
  248 + else {
  249 + QMUITipDialogUtil.dismessDialog();
  250 + SelectDialog selectDialog = new SelectDialog(context, "获取轨迹失败,是否重试?", "重试", new SelectDialog.DialogInterface() {
  251 + @Override
  252 + public void onClick(SelectDialog dialog) {
  253 + dialog.dismiss();
  254 + queryHistoryTrace(context, userStepEntity, runningFinishBean);
  255 + }
  256 + }, "暂存", new SelectDialog.DialogInterface() {
  257 + @Override
  258 + public void onClick(SelectDialog dialog) {
  259 + dialog.dismiss();
  260 + }
  261 + });
  262 + selectDialog.setCanceledOnTouchOutside(false);
  263 + selectDialog.setCancelable(false);
  264 + selectDialog.show();
  265 + }
  266 + }
  267 + });
  268 +
  269 + }
  270 +
  271 + /**
  272 + * 查询运营人员踩得轨迹
  273 + *
  274 + * @param userStepEntity
  275 + */
  276 + public void getServerStreetTrace(Context context, UserStepEntity userStepEntity) {
  277 + if (mClient == null) {
  278 + mClient = new LBSTraceClient(context);
  279 + }
  280 + long serverStartTime = userStepEntity.getQueryTraceStartTime();
  281 + long serverEndTime = userStepEntity.getQueryTraceEndTime();
  282 + String serverEntityName = userStepEntity.getQueryEntityName();
  283 + if (serverStartTime != 0 && serverEndTime != 0 && !TextUtils.isEmpty(serverEntityName) && mClient != null) {
  284 + //查询服务赛道历史轨迹
  285 + MyMapUtil.queryHistoryTrace(context, mClient, serverEntityName, serverStartTime, serverEndTime, new MyMapUtil.CallBack() {
  286 + @Override
  287 + public void success(List<LatLng> resultPoints) {
  288 + if (resultPoints != null && resultPoints.size() > 1) {
  289 + if (getView() == null) {
  290 + return;
  291 + }
  292 + getView().drawServerStreetTrace(resultPoints);
  293 + }
  294 +
  295 +
  296 + }
  297 + });
  298 + }
  299 +
  300 + }
7 } 301 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/presenter/RunningMapFragmentPresenter.java
@@ -4,6 +4,7 @@ import android.content.Context; @@ -4,6 +4,7 @@ import android.content.Context;
4 import android.graphics.Bitmap; 4 import android.graphics.Bitmap;
5 import android.graphics.BitmapFactory; 5 import android.graphics.BitmapFactory;
6 import android.os.Handler; 6 import android.os.Handler;
  7 +import android.text.TextUtils;
7 import android.util.Log; 8 import android.util.Log;
8 import android.widget.Toast; 9 import android.widget.Toast;
9 10
@@ -60,16 +61,19 @@ import com.baidu.trace.model.SortType; @@ -60,16 +61,19 @@ import com.baidu.trace.model.SortType;
60 import com.baidu.trace.model.StatusCodes; 61 import com.baidu.trace.model.StatusCodes;
61 import com.baidu.trace.model.TraceLocation; 62 import com.baidu.trace.model.TraceLocation;
62 import com.baidu.trace.model.TransportMode; 63 import com.baidu.trace.model.TransportMode;
  64 +import com.cnlive.moudle.pedometer.commonInfo.CommonInfo;
63 import com.cnlive.moudle.pedometer.frame.view.RunningMapFragmentView; 65 import com.cnlive.moudle.pedometer.frame.view.RunningMapFragmentView;
64 import com.cnlive.moudle.pedometer.model.Constant; 66 import com.cnlive.moudle.pedometer.model.Constant;
65 import com.cnlive.moudle.pedometer.model.RoutePoint; 67 import com.cnlive.moudle.pedometer.model.RoutePoint;
66 import com.cnlive.moudle.pedometer.service.StepService; 68 import com.cnlive.moudle.pedometer.service.StepService;
  69 +import com.cnlive.moudle.pedometer.sql.entity.UserStepEntity;
67 import com.cnlive.moudle.pedometer.utils.BitmapUtil; 70 import com.cnlive.moudle.pedometer.utils.BitmapUtil;
68 import com.cnlive.moudle.pedometer.utils.CommonUtil; 71 import com.cnlive.moudle.pedometer.utils.CommonUtil;
69 import com.cnlive.moudle.pedometer.utils.GsonUtil; 72 import com.cnlive.moudle.pedometer.utils.GsonUtil;
70 import com.cnlive.moudle.pedometer.utils.MapUtil; 73 import com.cnlive.moudle.pedometer.utils.MapUtil;
71 import com.cnlive.moudle.pedometer.utils.MyMapUtil; 74 import com.cnlive.moudle.pedometer.utils.MyMapUtil;
72 import com.cnlive.moudle.pedometer.utils.StepUtil; 75 import com.cnlive.moudle.pedometer.utils.StepUtil;
  76 +import com.cnlive.moudle.pedometer.utils.TimeUtil;
73 import com.example.moudle_pedometer.R; 77 import com.example.moudle_pedometer.R;
74 import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter; 78 import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
75 79
@@ -106,11 +110,34 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter&lt;RunningMapFrag @@ -106,11 +110,34 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter&lt;RunningMapFrag
106 /** 110 /**
107 * 轨迹点集合 111 * 轨迹点集合
108 */ 112 */
109 - private List<LatLng> realTimePoints;  
110 private String imports = "[{\"latitude\":39.93395837223,\"latitudeE6\":3.993395837223E7,\"longitude\":116.30855458458,\"longitudeE6\":1.1630855458457999E8},{\"latitude\":39.93396326228,\"latitudeE6\":3.993396326228E7,\"longitude\":116.30861833018,\"longitudeE6\":1.1630861833017999E8},{\"latitude\":39.934156956749995,\"latitudeE6\":3.993415695675E7,\"longitude\":116.30869672329999,\"longitudeE6\":1.163086967233E8},{\"latitude\":39.934220163784,\"latitudeE6\":3.9934220163784E7,\"longitude\":116.3087100148,\"longitudeE6\":1.163087100148E8},{\"latitude\":39.934285263072,\"latitudeE6\":3.9934285263072E7,\"longitude\":116.30866498582,\"longitudeE6\":1.1630866498582E8},{\"latitude\":39.934351994321,\"latitudeE6\":3.9934351994320996E7,\"longitude\":116.30865820422,\"longitudeE6\":1.1630865820422E8},{\"latitude\":39.934393506188,\"latitudeE6\":3.9934393506188005E7,\"longitude\":116.3087268324,\"longitudeE6\":1.163087268324E8},{\"latitude\":39.934515310648,\"latitudeE6\":3.9934515310648E7,\"longitude\":116.30877023341,\"longitudeE6\":1.1630877023341E8},{\"latitude\":39.934576888398,\"latitudeE6\":3.9934576888398E7,\"longitude\":116.30876860572,\"longitudeE6\":1.1630876860572E8},{\"latitude\":39.934641987882,\"latitudeE6\":3.9934641987882E7,\"longitude\":116.30872520428,\"longitudeE6\":1.1630872520427999E8},{\"latitude\":39.934720386354,\"latitudeE6\":3.9934720386354E7,\"longitude\":116.30874175083,\"longitudeE6\":1.1630874175083E8},{\"latitude\":39.934703845843,\"latitudeE6\":3.9934703845843E7,\"longitude\":116.30880197017,\"longitudeE6\":1.1630880197016999E8},{\"latitude\":39.934719055573,\"latitudeE6\":3.9934719055573E7,\"longitude\":116.30896553874,\"longitudeE6\":1.1630896553874E8},{\"latitude\":39.93482461107,\"latitudeE6\":3.993482461107E7,\"longitude\":116.30924466304002,\"longitudeE6\":1.1630924466304001E8},{\"latitude\":39.934804821527,\"latitudeE6\":3.9934804821527004E7,\"longitude\":116.30935804892,\"longitudeE6\":1.1630935804892E8},{\"latitude\":39.934856643274,\"latitudeE6\":3.9934856643274E7,\"longitude\":116.30943996874,\"longitudeE6\":1.1630943996874E8},{\"latitude\":39.934844987999,\"latitudeE6\":3.9934844987999E7,\"longitude\":116.30952026112,\"longitudeE6\":1.1630952026112E8},{\"latitude\":39.934722121282,\"latitudeE6\":3.9934722121282004E7,\"longitude\":116.30967542086,\"longitudeE6\":1.1630967542086E8},{\"latitude\":39.934828721701,\"latitudeE6\":3.9934828721701E7,\"longitude\":116.30960516489,\"longitudeE6\":1.1630960516489E8},{\"latitude\":39.934408798988,\"latitudeE6\":3.9934408798988E7,\"longitude\":116.30961357453,\"longitudeE6\":1.1630961357453E8},{\"latitude\":39.934345321571,\"latitudeE6\":3.9934345321571E7,\"longitude\":116.30960842073,\"longitudeE6\":1.1630960842073E8},{\"latitude\":39.93436159016,\"latitudeE6\":3.9934361590160005E7,\"longitude\":116.30954331882,\"longitudeE6\":1.1630954331882E8},{\"latitude\":39.934295133241,\"latitudeE6\":3.9934295133241E7,\"longitude\":116.30957668364,\"longitudeE6\":1.1630957668364E8},{\"latitude\":39.934188525341,\"latitudeE6\":3.9934188525341E7,\"longitude\":116.30958183769,\"longitudeE6\":1.1630958183769001E8},{\"latitude\":39.933976660469,\"latitudeE6\":3.9933976660469E7,\"longitude\":116.30954494693,\"longitudeE6\":1.1630954494693E8},{\"latitude\":39.933993190121,\"latitudeE6\":3.9933993190121E7,\"longitude\":116.30939114375,\"longitudeE6\":1.1630939114375001E8},{\"latitude\":39.933938115564,\"latitudeE6\":3.9933938115563996E7,\"longitude\":116.30932956832,\"longitudeE6\":1.1630932956831999E8},{\"latitude\":39.933916130555,\"latitudeE6\":3.9933916130555E7,\"longitude\":116.30922269279,\"longitudeE6\":1.1630922269279E8},{\"latitude\":39.933836097011,\"latitudeE6\":3.9933836097011E7,\"longitude\":116.30914077307,\"longitudeE6\":1.1630914077307E8}]\n"; 113 private String imports = "[{\"latitude\":39.93395837223,\"latitudeE6\":3.993395837223E7,\"longitude\":116.30855458458,\"longitudeE6\":1.1630855458457999E8},{\"latitude\":39.93396326228,\"latitudeE6\":3.993396326228E7,\"longitude\":116.30861833018,\"longitudeE6\":1.1630861833017999E8},{\"latitude\":39.934156956749995,\"latitudeE6\":3.993415695675E7,\"longitude\":116.30869672329999,\"longitudeE6\":1.163086967233E8},{\"latitude\":39.934220163784,\"latitudeE6\":3.9934220163784E7,\"longitude\":116.3087100148,\"longitudeE6\":1.163087100148E8},{\"latitude\":39.934285263072,\"latitudeE6\":3.9934285263072E7,\"longitude\":116.30866498582,\"longitudeE6\":1.1630866498582E8},{\"latitude\":39.934351994321,\"latitudeE6\":3.9934351994320996E7,\"longitude\":116.30865820422,\"longitudeE6\":1.1630865820422E8},{\"latitude\":39.934393506188,\"latitudeE6\":3.9934393506188005E7,\"longitude\":116.3087268324,\"longitudeE6\":1.163087268324E8},{\"latitude\":39.934515310648,\"latitudeE6\":3.9934515310648E7,\"longitude\":116.30877023341,\"longitudeE6\":1.1630877023341E8},{\"latitude\":39.934576888398,\"latitudeE6\":3.9934576888398E7,\"longitude\":116.30876860572,\"longitudeE6\":1.1630876860572E8},{\"latitude\":39.934641987882,\"latitudeE6\":3.9934641987882E7,\"longitude\":116.30872520428,\"longitudeE6\":1.1630872520427999E8},{\"latitude\":39.934720386354,\"latitudeE6\":3.9934720386354E7,\"longitude\":116.30874175083,\"longitudeE6\":1.1630874175083E8},{\"latitude\":39.934703845843,\"latitudeE6\":3.9934703845843E7,\"longitude\":116.30880197017,\"longitudeE6\":1.1630880197016999E8},{\"latitude\":39.934719055573,\"latitudeE6\":3.9934719055573E7,\"longitude\":116.30896553874,\"longitudeE6\":1.1630896553874E8},{\"latitude\":39.93482461107,\"latitudeE6\":3.993482461107E7,\"longitude\":116.30924466304002,\"longitudeE6\":1.1630924466304001E8},{\"latitude\":39.934804821527,\"latitudeE6\":3.9934804821527004E7,\"longitude\":116.30935804892,\"longitudeE6\":1.1630935804892E8},{\"latitude\":39.934856643274,\"latitudeE6\":3.9934856643274E7,\"longitude\":116.30943996874,\"longitudeE6\":1.1630943996874E8},{\"latitude\":39.934844987999,\"latitudeE6\":3.9934844987999E7,\"longitude\":116.30952026112,\"longitudeE6\":1.1630952026112E8},{\"latitude\":39.934722121282,\"latitudeE6\":3.9934722121282004E7,\"longitude\":116.30967542086,\"longitudeE6\":1.1630967542086E8},{\"latitude\":39.934828721701,\"latitudeE6\":3.9934828721701E7,\"longitude\":116.30960516489,\"longitudeE6\":1.1630960516489E8},{\"latitude\":39.934408798988,\"latitudeE6\":3.9934408798988E7,\"longitude\":116.30961357453,\"longitudeE6\":1.1630961357453E8},{\"latitude\":39.934345321571,\"latitudeE6\":3.9934345321571E7,\"longitude\":116.30960842073,\"longitudeE6\":1.1630960842073E8},{\"latitude\":39.93436159016,\"latitudeE6\":3.9934361590160005E7,\"longitude\":116.30954331882,\"longitudeE6\":1.1630954331882E8},{\"latitude\":39.934295133241,\"latitudeE6\":3.9934295133241E7,\"longitude\":116.30957668364,\"longitudeE6\":1.1630957668364E8},{\"latitude\":39.934188525341,\"latitudeE6\":3.9934188525341E7,\"longitude\":116.30958183769,\"longitudeE6\":1.1630958183769001E8},{\"latitude\":39.933976660469,\"latitudeE6\":3.9933976660469E7,\"longitude\":116.30954494693,\"longitudeE6\":1.1630954494693E8},{\"latitude\":39.933993190121,\"latitudeE6\":3.9933993190121E7,\"longitude\":116.30939114375,\"longitudeE6\":1.1630939114375001E8},{\"latitude\":39.933938115564,\"latitudeE6\":3.9933938115563996E7,\"longitude\":116.30932956832,\"longitudeE6\":1.1630932956831999E8},{\"latitude\":39.933916130555,\"latitudeE6\":3.9933916130555E7,\"longitude\":116.30922269279,\"longitudeE6\":1.1630922269279E8},{\"latitude\":39.933836097011,\"latitudeE6\":3.9933836097011E7,\"longitude\":116.30914077307,\"longitudeE6\":1.1630914077307E8}]\n";
111 private HashMap<Integer, Boolean> importHash; 114 private HashMap<Integer, Boolean> importHash;
112 - private static int matchIndex = 0;  
113 115
  116 + /**
  117 + * 查询运营人员踩得轨迹
  118 + *
  119 + * @param userStepEntity
  120 + */
  121 + public void getServerStreetTrace(Context context, UserStepEntity userStepEntity) {
  122 + long serverStartTime = userStepEntity.getQueryTraceStartTime();
  123 + long serverEndTime = userStepEntity.getQueryTraceEndTime();
  124 + String serverEntityName = userStepEntity.getQueryEntityName();
  125 + if (serverStartTime != 0 && serverEndTime != 0 && !TextUtils.isEmpty(serverEntityName) && StepService.mClient != null) {
  126 + //查询服务赛道历史轨迹
  127 + MyMapUtil.queryHistoryTrace(context, StepService.mClient, serverEntityName, serverStartTime, serverEndTime, new MyMapUtil.CallBack() {
  128 + @Override
  129 + public void success(List<LatLng> resultPoints) {
  130 + if (resultPoints != null && resultPoints.size() > 1) {
  131 + if (getView() == null) {
  132 + return;
  133 + }
  134 + getView().drawServerStreetTrace(resultPoints);
  135 + }
  136 + }
  137 + });
  138 + }
  139 +
  140 + }
114 // /** 141 // /**
115 // * 查询历史轨迹 142 // * 查询历史轨迹
116 // * 143 // *
@@ -313,19 +340,21 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter&lt;RunningMapFrag @@ -313,19 +340,21 @@ public class RunningMapFragmentPresenter extends MvpBasePresenter&lt;RunningMapFrag
313 340
314 341
315 /** 342 /**
316 - * 查询历史轨迹  
317 - *  
318 - * @param startTime  
319 - * @param endTime 343 + * 查询当前用户历史轨迹
320 */ 344 */
321 - public void queryHistoryTrace(Context context, String entityName, long startTime, long endTime) {  
322 - Log.e(TAG, "queryHistoryTrace: 时间:" + startTime); 345 + public void queryHistoryTrace(Context context, UserStepEntity userStepEntity) {
  346 + //查询当前用户的历史轨迹
  347 + long startTime = userStepEntity.getStartTimeStamp();
  348 + //获取当前的时间戳(秒)
  349 + long endTime = TimeUtil.getNowTimeStamp();
  350 + //获取当前的实体名称
  351 + String entityName = CommonInfo.getUserId(context);
323 //打的重要点 352 //打的重要点
324 List<LatLng> importPoints = GsonUtil.jsonToList(imports, LatLng.class); 353 List<LatLng> importPoints = GsonUtil.jsonToList(imports, LatLng.class);
325 MyMapUtil.queryHistoryTrace(context, StepService.mClient, entityName, startTime, endTime, new MyMapUtil.CallBack() { 354 MyMapUtil.queryHistoryTrace(context, StepService.mClient, entityName, startTime, endTime, new MyMapUtil.CallBack() {
326 @Override 355 @Override
327 public void success(List<LatLng> resultPoints) { 356 public void success(List<LatLng> resultPoints) {
328 - if (resultPoints != null&&resultPoints.size()>1) { 357 + if (resultPoints != null && resultPoints.size() > 1) {
329 if (getView() != null && resultPoints != null) { 358 if (getView() != null && resultPoints != null) {
330 if (resultPoints.size() == 1) { 359 if (resultPoints.size() == 1) {
331 getView().setHistoryLastPoint(resultPoints.get(0)); 360 getView().setHistoryLastPoint(resultPoints.get(0));
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/view/RunMainFragmentView.java
@@ -60,6 +60,7 @@ public class RunMainFragmentView implements MvpView { @@ -60,6 +60,7 @@ public class RunMainFragmentView implements MvpView {
60 private int timeCountDown;//时间倒计时 60 private int timeCountDown;//时间倒计时
61 private String uid; 61 private String uid;
62 private boolean needWriteDataFlag = true;//是否需要将计时器基值写入到数据库 62 private boolean needWriteDataFlag = true;//是否需要将计时器基值写入到数据库
  63 + private UserStepEntity userStepEntity;
63 // 定位相关 64 // 定位相关
64 private LocationClient mLocClient; 65 private LocationClient mLocClient;
65 public MyLocationListenner myListener = new MyLocationListenner(); 66 public MyLocationListenner myListener = new MyLocationListenner();
@@ -118,6 +119,7 @@ public class RunMainFragmentView implements MvpView { @@ -118,6 +119,7 @@ public class RunMainFragmentView implements MvpView {
118 public void initView() { 119 public void initView() {
119 Log.e(TAG, "initView: +时间" + SystemClock.elapsedRealtime()); 120 Log.e(TAG, "initView: +时间" + SystemClock.elapsedRealtime());
120 uid = CommonInfo.getUserId(getContext()); 121 uid = CommonInfo.getUserId(getContext());
  122 + userStepEntity = StepUtil.getUserStepData(getContext(), uid);
121 initLocationClient(); 123 initLocationClient();
122 fragment.binding.llRunMainRoot.setVisibility(View.GONE); 124 fragment.binding.llRunMainRoot.setVisibility(View.GONE);
123 ButtonAnimUtil.startAnimation(fragment.binding.llStartTimeTip, false); 125 ButtonAnimUtil.startAnimation(fragment.binding.llStartTimeTip, false);
@@ -186,7 +188,6 @@ public class RunMainFragmentView implements MvpView { @@ -186,7 +188,6 @@ public class RunMainFragmentView implements MvpView {
186 handler.postDelayed(runnable, 1000); 188 handler.postDelayed(runnable, 1000);
187 CommonInfo.setIsFirstShowTimeTip(getContext(), false); 189 CommonInfo.setIsFirstShowTimeTip(getContext(), false);
188 } else { 190 } else {
189 - UserStepEntity userStepEntity = StepUtil.getUserStepData(getContext(), uid);  
190 //隐藏计时界面 191 //隐藏计时界面
191 fragment.binding.llStartTimeTip.setVisibility(View.GONE); 192 fragment.binding.llStartTimeTip.setVisibility(View.GONE);
192 fragment.binding.llRunMainRoot.setVisibility(View.VISIBLE); 193 fragment.binding.llRunMainRoot.setVisibility(View.VISIBLE);
@@ -208,6 +209,8 @@ public class RunMainFragmentView implements MvpView { @@ -208,6 +209,8 @@ public class RunMainFragmentView implements MvpView {
208 fragment.binding.chronometer.setFormat("00:00:01"); 209 fragment.binding.chronometer.setFormat("00:00:01");
209 fragment.binding.chronometer.setBase(SystemClock.elapsedRealtime()); 210 fragment.binding.chronometer.setBase(SystemClock.elapsedRealtime());
210 } 211 }
  212 + //设置继续运动时间
  213 + StepUtil.setContinueTime(getContext(),uid,TimeUtil.getNowTimeStamp());
211 //因为进来以后就运动了,所以需要改变状态 214 //因为进来以后就运动了,所以需要改变状态
212 CommonInfo.setIsPauseState(getContext(), false); 215 CommonInfo.setIsPauseState(getContext(), false);
213 //重新设置开始时间 216 //重新设置开始时间
@@ -259,6 +262,8 @@ public class RunMainFragmentView implements MvpView { @@ -259,6 +262,8 @@ public class RunMainFragmentView implements MvpView {
259 fragment.binding.flContinue.setOnClickListener(new View.OnClickListener() { 262 fragment.binding.flContinue.setOnClickListener(new View.OnClickListener() {
260 @Override 263 @Override
261 public void onClick(View view) { 264 public void onClick(View view) {
  265 + //设置继续运动时间
  266 + StepUtil.setContinueTime(getContext(),uid,TimeUtil.getNowTimeStamp());
262 //设置继续标志 267 //设置继续标志
263 CommonInfo.setIsPauseState(getContext(), false); 268 CommonInfo.setIsPauseState(getContext(), false);
264 //继续记录轨迹 269 //继续记录轨迹
@@ -276,10 +281,9 @@ public class RunMainFragmentView implements MvpView { @@ -276,10 +281,9 @@ public class RunMainFragmentView implements MvpView {
276 public void run() { 281 public void run() {
277 //隐藏两个按钮 282 //隐藏两个按钮
278 fragment.binding.flStopTip.setVisibility(View.INVISIBLE); 283 fragment.binding.flStopTip.setVisibility(View.INVISIBLE);
279 - fragment.binding.llTwoBottomButton.setVisibility(View.GONE);  
280 - ButtonAnimUtil.setViewShowZoomIn(fragment.binding.llPause); 284 +// ButtonAnimUtil.setViewShowZoomIn(fragment.binding.llPause);
281 //显示暂停按钮 285 //显示暂停按钮
282 - fragment.binding.llPause.setVisibility(View.VISIBLE); 286 + fragment.binding.flPause.setVisibility(View.VISIBLE);
283 } 287 }
284 }, ButtonAnimUtil.DEFAULT_ZOOM_DURATION * 2); 288 }, ButtonAnimUtil.DEFAULT_ZOOM_DURATION * 2);
285 //继续计步 289 //继续计步
@@ -335,13 +339,15 @@ public class RunMainFragmentView implements MvpView { @@ -335,13 +339,15 @@ public class RunMainFragmentView implements MvpView {
335 ButtonAnimUtil.setViewDefault(fragment.binding.flStop); 339 ButtonAnimUtil.setViewDefault(fragment.binding.flStop);
336 dialog.dismiss(); 340 dialog.dismiss();
337 RunningFinishBean runningFinishBean = new RunningFinishBean(); 341 RunningFinishBean runningFinishBean = new RunningFinishBean();
338 - runningFinishBean.setStartPoint("开始地点");  
339 - runningFinishBean.setEndPoint("结束地点"); 342 + runningFinishBean.setStartPoint(userStepEntity.getStartPoint());
  343 + runningFinishBean.setEndPoint(userStepEntity.getEndPoint());
340 runningFinishBean.setRunDistance(fragment.binding.tvRunDistance.getText().toString()); 344 runningFinishBean.setRunDistance(fragment.binding.tvRunDistance.getText().toString());
341 runningFinishBean.setSpeed(fragment.binding.tvSpeed.getText().toString()); 345 runningFinishBean.setSpeed(fragment.binding.tvSpeed.getText().toString());
342 runningFinishBean.setStep(fragment.binding.tvStepCount.getText().toString()); 346 runningFinishBean.setStep(fragment.binding.tvStepCount.getText().toString());
343 runningFinishBean.setTime(fragment.binding.chronometer.getText().toString()); 347 runningFinishBean.setTime(fragment.binding.chronometer.getText().toString());
344 runningFinishBean.setDate(TimeUtil.getFormatNowTime()); 348 runningFinishBean.setDate(TimeUtil.getFormatNowTime());
  349 + //设置用时
  350 + runningFinishBean.setEmployTime(TimeUtil.getChronometerSeconds(fragment.binding.chronometer));
345 RunningFinishActivity.startActivity(fragment.getActivity(), runningFinishBean); 351 RunningFinishActivity.startActivity(fragment.getActivity(), runningFinishBean);
346 fragment.getActivity().finish(); 352 fragment.getActivity().finish();
347 } 353 }
@@ -395,61 +401,40 @@ public class RunMainFragmentView implements MvpView { @@ -395,61 +401,40 @@ public class RunMainFragmentView implements MvpView {
395 fragment.binding.flPause.setOnClickListener(new View.OnClickListener() { 401 fragment.binding.flPause.setOnClickListener(new View.OnClickListener() {
396 @Override 402 @Override
397 public void onClick(View view) { 403 public void onClick(View view) {
398 - //将当前计时器时间戳写入数据库  
399 - setSQLPauseTime(uid);  
400 - //设置暂停标志  
401 - CommonInfo.setIsPauseState(getContext(), true);  
402 - //暂停轨迹记录  
403 - if (StepService.mClient != null && StepService.traceListener != null) {  
404 - CommonInfo.setTsRunBaiduTraceService(getContext(), false);  
405 - StepService.mClient.stopGather(StepService.traceListener);  
406 - }  
407 - needWriteDataFlag = false;  
408 - ButtonAnimUtil.setViewHideZoomOut(fragment.binding.llPause);  
409 - handler.postDelayed(new Runnable() { 404 + //进行提示
  405 + SelectDialog selectDialog = new SelectDialog(getContext(), getContext().getString(R.string.run_pause_tip), "否", new SelectDialog.DialogInterface() {
410 @Override 406 @Override
411 - public void run() {  
412 - //隐藏本身  
413 - fragment.binding.llPause.setVisibility(View.GONE); 407 + public void onClick(SelectDialog dialog) {
  408 + dialog.dismiss();
414 } 409 }
415 - }, ButtonAnimUtil.HIDE_VIEW_ZOOM_DURATION);  
416 - 410 + }, "是", new SelectDialog.DialogInterface() {
  411 + @Override
  412 + public void onClick(SelectDialog dialog) {
  413 + dialog.dismiss();
  414 + //进行暂停
  415 + onBtnPause();
  416 + }
  417 + });
  418 + selectDialog.setCancelable(false);
  419 + selectDialog.setCanceledOnTouchOutside(true);
  420 + //先获取暂停次数
417 //获取当前用户暂停次数 421 //获取当前用户暂停次数
418 int userPauseCount = StepUtil.getUserPauseCount(getContext(), uid); 422 int userPauseCount = StepUtil.getUserPauseCount(getContext(), uid);
419 - if (userPauseCount != -1) {  
420 - if (userPauseCount > 1) {  
421 - //设置停止标志位,关闭相关服务  
422 - setStopStartFlag();  
423 - //清除数据库  
424 - StepUtil.clearRunData(getContext(), CommonInfo.getUserId(getContext()));  
425 - //进行提示  
426 - TipDialog tipDialog = new TipDialog(getContext(), getContext().getString(R.string.more_than_pause_count_tip), "我知道了", R.color.green_round, new TipDialog.DialogInterface() {  
427 - @Override  
428 - public void onClick(TipDialog dialog) {  
429 - //关闭当前对话框  
430 - dialog.dismiss();  
431 - //关闭当前页面  
432 - if (getContext() == null) {  
433 - return;  
434 - }  
435 - fragment.getActivity().finish();  
436 - }  
437 - });  
438 - tipDialog.setCanceledOnTouchOutside(false);  
439 - tipDialog.setCancelable(false);  
440 - tipDialog.show();  
441 -  
442 - }  
443 - //显示继续按钮  
444 - fragment.binding.llTwoBottomButton.setVisibility(View.VISIBLE);  
445 - ButtonAnimUtil.setViewShowZoomIn(fragment.binding.flContinue);  
446 - ButtonAnimUtil.setViewShowZoomIn(fragment.binding.flStop);  
447 - //停止计时  
448 - fragment.binding.chronometer.stop();  
449 - mRecordTime = SystemClock.elapsedRealtime();  
450 - //暂停计步  
451 - EventBus.getDefault().post(new MessageEvent(Constant.SERVICE_STEP_COUNT_PAUSE, "")); 423 + if (userPauseCount < 1) {
  424 + selectDialog.show();
  425 + } else {
  426 + //只提示,不进行任何操作
  427 + TipDialog tipDialog = new TipDialog(getContext(), "当前无法暂停", "我知道了", R.color.green_round, new TipDialog.DialogInterface() {
  428 + @Override
  429 + public void onClick(TipDialog dialog) {
  430 + dialog.dismiss();
  431 + }
  432 + });
  433 + tipDialog.setCanceledOnTouchOutside(false);
  434 + tipDialog.setCancelable(false);
  435 + tipDialog.show();
452 } 436 }
  437 +
453 } 438 }
454 }); 439 });
455 //gps点击事件 440 //gps点击事件
@@ -475,7 +460,7 @@ public class RunMainFragmentView implements MvpView { @@ -475,7 +460,7 @@ public class RunMainFragmentView implements MvpView {
475 } 460 }
476 }); 461 });
477 //返回按钮点击事件 462 //返回按钮点击事件
478 - fragment.binding.ivBack.setOnClickListener(new View.OnClickListener() { 463 + fragment.binding.llBack.setOnClickListener(new View.OnClickListener() {
479 @Override 464 @Override
480 public void onClick(View view) { 465 public void onClick(View view) {
481 if (getContext() == null) { 466 if (getContext() == null) {
@@ -493,24 +478,84 @@ public class RunMainFragmentView implements MvpView { @@ -493,24 +478,84 @@ public class RunMainFragmentView implements MvpView {
493 }); 478 });
494 } 479 }
495 480
  481 + /**
  482 + * 暂停按钮
  483 + */
  484 + public void onBtnPause() {
  485 + //将当前计时器时间戳写入数据库
  486 + setSQLPauseTime(uid);
  487 + //设置暂停标志
  488 + CommonInfo.setIsPauseState(getContext(), true);
  489 + //暂停轨迹记录
  490 + if (StepService.mClient != null && StepService.traceListener != null) {
  491 + CommonInfo.setTsRunBaiduTraceService(getContext(), false);
  492 + StepService.mClient.stopGather(StepService.traceListener);
  493 + }
  494 + needWriteDataFlag = false;
  495 +// ButtonAnimUtil.setViewHideZoomOut(fragment.binding.llPause);
  496 + handler.postDelayed(new Runnable() {
  497 + @Override
  498 + public void run() {
  499 + //隐藏本身
  500 + fragment.binding.flPause.setVisibility(View.GONE);
  501 + }
  502 + }, ButtonAnimUtil.HIDE_VIEW_ZOOM_DURATION);
  503 +
  504 + //获取当前用户暂停次数
  505 + int userPauseCount = StepUtil.getUserPauseCount(getContext(), uid);
  506 + if (userPauseCount != -1) {
  507 + if (userPauseCount > 1) {
  508 + //设置停止标志位,关闭相关服务
  509 + setStopStartFlag();
  510 + //清除数据库
  511 + StepUtil.clearRunData(getContext(), CommonInfo.getUserId(getContext()));
  512 + //进行提示
  513 + TipDialog tipDialog = new TipDialog(getContext(), getContext().getString(R.string.more_than_pause_count_tip), "我知道了", R.color.green_round, new TipDialog.DialogInterface() {
  514 + @Override
  515 + public void onClick(TipDialog dialog) {
  516 + //关闭当前对话框
  517 + dialog.dismiss();
  518 + //关闭当前页面
  519 + if (getContext() == null) {
  520 + return;
  521 + }
  522 + fragment.getActivity().finish();
  523 + }
  524 + });
  525 + tipDialog.setCanceledOnTouchOutside(false);
  526 + tipDialog.setCancelable(false);
  527 + tipDialog.show();
  528 +
  529 + }
  530 + //显示继续按钮
  531 + ButtonAnimUtil.setViewShowZoomIn(fragment.binding.flContinue);
  532 + ButtonAnimUtil.setViewShowZoomIn(fragment.binding.flStop);
  533 + //停止计时
  534 + fragment.binding.chronometer.stop();
  535 + mRecordTime = SystemClock.elapsedRealtime();
  536 + //暂停计步
  537 + EventBus.getDefault().post(new MessageEvent(Constant.SERVICE_STEP_COUNT_PAUSE, ""));
  538 + }
  539 + }
  540 +
496 public void setSQLPauseTime(String id) { 541 public void setSQLPauseTime(String id) {
497 - Log.e(TAG, "setSQLPauseTime: " ); 542 + Log.e(TAG, "setSQLPauseTime: ");
498 // if (needWriteDataFlag) { 543 // if (needWriteDataFlag) {
499 - //将当前计时器时间戳写入数据库  
500 - if (!TextUtils.isEmpty(id)) {  
501 - UserStepEntity userStepEntity = StepUtil.getUserStepData(fragment.getActivity(), uid);  
502 - if (userStepEntity != null) {  
503 - userStepEntity.setPauseTimeStamp(fragment.binding.chronometer.getBase());  
504 - //设置当前暂停的时间戳  
505 - userStepEntity.setRecordTime(SystemClock.elapsedRealtime());  
506 - //设置当前用户暂停的时间戳  
507 - userStepEntity.setUserPauseTimeStamp(TimeUtil.getNowTimeStamp());  
508 - //设置暂停次数  
509 - userStepEntity.setPauseCount(userStepEntity.getPauseCount() + 1);  
510 - //更新数据  
511 - StepUtil.updateStepData(fragment.getActivity(), userStepEntity);  
512 - } 544 + //将当前计时器时间戳写入数据库
  545 + if (!TextUtils.isEmpty(id)) {
  546 + UserStepEntity userStepEntity = StepUtil.getUserStepData(fragment.getActivity(), uid);
  547 + if (userStepEntity != null) {
  548 + userStepEntity.setPauseTimeStamp(fragment.binding.chronometer.getBase());
  549 + //设置当前暂停的时间戳
  550 + userStepEntity.setRecordTime(SystemClock.elapsedRealtime());
  551 + //设置当前用户暂停的时间戳
  552 + userStepEntity.setUserPauseTimeStamp(TimeUtil.getNowTimeStamp());
  553 + //设置暂停次数
  554 + userStepEntity.setPauseCount(userStepEntity.getPauseCount() + 1);
  555 + //更新数据
  556 + StepUtil.updateStepData(fragment.getActivity(), userStepEntity);
513 } 557 }
  558 + }
514 // } 559 // }
515 } 560 }
516 561
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/view/RunRaceDetailFragmentView.java
@@ -8,6 +8,7 @@ import android.hardware.Sensor; @@ -8,6 +8,7 @@ import android.hardware.Sensor;
8 import android.hardware.SensorEvent; 8 import android.hardware.SensorEvent;
9 import android.hardware.SensorEventListener; 9 import android.hardware.SensorEventListener;
10 import android.hardware.SensorManager; 10 import android.hardware.SensorManager;
  11 +import android.os.Handler;
11 import android.os.SystemClock; 12 import android.os.SystemClock;
12 import android.support.v4.content.ContextCompat; 13 import android.support.v4.content.ContextCompat;
13 import android.text.TextUtils; 14 import android.text.TextUtils;
@@ -53,6 +54,9 @@ import com.baidu.trace.LBSTraceClient; @@ -53,6 +54,9 @@ import com.baidu.trace.LBSTraceClient;
53 import com.baidu.trace.Trace; 54 import com.baidu.trace.Trace;
54 import com.baidu.trace.model.LocationMode; 55 import com.baidu.trace.model.LocationMode;
55 import com.baidu.trace.model.SortType; 56 import com.baidu.trace.model.SortType;
  57 +import com.cnlive.libs.base.logic.Event;
  58 +import com.cnlive.libs.base.logic.callback.FailureCallback;
  59 +import com.cnlive.libs.base.logic.callback.SuccessCallback;
56 import com.cnlive.moudle.pedometer.commonInfo.CollCommonInfo; 60 import com.cnlive.moudle.pedometer.commonInfo.CollCommonInfo;
57 import com.cnlive.moudle.pedometer.commonInfo.CommonInfo; 61 import com.cnlive.moudle.pedometer.commonInfo.CommonInfo;
58 import com.cnlive.moudle.pedometer.model.Constant; 62 import com.cnlive.moudle.pedometer.model.Constant;
@@ -67,6 +71,7 @@ import com.cnlive.moudle.pedometer.ui.activity.TakePartActivity; @@ -67,6 +71,7 @@ import com.cnlive.moudle.pedometer.ui.activity.TakePartActivity;
67 import com.cnlive.moudle.pedometer.ui.fragment.RunRaceDetailFragment; 71 import com.cnlive.moudle.pedometer.ui.fragment.RunRaceDetailFragment;
68 import com.cnlive.moudle.pedometer.ui.widget.SelectDialog; 72 import com.cnlive.moudle.pedometer.ui.widget.SelectDialog;
69 import com.cnlive.moudle.pedometer.ui.widget.TipDialog; 73 import com.cnlive.moudle.pedometer.ui.widget.TipDialog;
  74 +import com.cnlive.moudle.pedometer.upload.UploadLogic;
70 import com.cnlive.moudle.pedometer.utils.BitmapUtil; 75 import com.cnlive.moudle.pedometer.utils.BitmapUtil;
71 import com.cnlive.moudle.pedometer.utils.GsonUtil; 76 import com.cnlive.moudle.pedometer.utils.GsonUtil;
72 import com.cnlive.moudle.pedometer.utils.MyMapUtil; 77 import com.cnlive.moudle.pedometer.utils.MyMapUtil;
@@ -80,8 +85,12 @@ import com.example.moudle_pedometer.R; @@ -80,8 +85,12 @@ import com.example.moudle_pedometer.R;
80 import com.hannesdorfmann.mosby3.mvp.MvpView; 85 import com.hannesdorfmann.mosby3.mvp.MvpView;
81 import com.sothree.slidinguppanel.SlidingUpPanelLayout; 86 import com.sothree.slidinguppanel.SlidingUpPanelLayout;
82 87
  88 +import java.io.File;
  89 +import java.io.FileOutputStream;
83 import java.io.LineNumberReader; 90 import java.io.LineNumberReader;
  91 +import java.text.SimpleDateFormat;
84 import java.util.ArrayList; 92 import java.util.ArrayList;
  93 +import java.util.Date;
85 import java.util.LinkedList; 94 import java.util.LinkedList;
86 import java.util.List; 95 import java.util.List;
87 96
@@ -126,6 +135,8 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener { @@ -126,6 +135,8 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
126 private UserStepEntity userStepEntity; 135 private UserStepEntity userStepEntity;
127 private boolean isDifferentStreet = false; 136 private boolean isDifferentStreet = false;
128 private LBSTraceClient mClient = null; 137 private LBSTraceClient mClient = null;
  138 + private List<LatLng> resultStreetPoints;
  139 + public List<LatLng> importStreetPoints;//运营打的重要的点
129 140
130 public RunRaceDetailFragmentView(RunRaceDetailFragment fragment) { 141 public RunRaceDetailFragmentView(RunRaceDetailFragment fragment) {
131 this.fragment = fragment; 142 this.fragment = fragment;
@@ -137,29 +148,78 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener { @@ -137,29 +148,78 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
137 148
138 149
139 public void initView(RunRaceDetailInfo runRaceDetailInfo) { 150 public void initView(RunRaceDetailInfo runRaceDetailInfo) {
  151 +
  152 +// new Handler().postDelayed(new Runnable() {
  153 +// @Override
  154 +// public void run() {
  155 +// baiduMap.snapshot(new BaiduMap.SnapshotReadyCallback() {
  156 +// @Override
  157 +// public void onSnapshotReady(Bitmap bitmap) {
  158 +// SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
  159 +// if (null == bitmap) {
  160 +// return;
  161 +// }
  162 +// QMUITipDialogUtil.loadingDialog(getContext(), "上传", false);
  163 +// //开始保存截屏
  164 +// try {
  165 +// File image = new File(getContext().getExternalCacheDir() + "/location_screenshot_" + sdf.format(new Date()) + ".jpeg");
  166 +// FileOutputStream fos = new FileOutputStream(image);
  167 +// boolean b = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
  168 +// fos.flush();
  169 +// fos.close();
  170 +// List<String> imagePaths = new ArrayList<>();
  171 +// imagePaths.add(image.getAbsolutePath());
  172 +// Log.e(TAG, "onSnapshotReady: "+image.getAbsolutePath() );
  173 +//
  174 +// UploadLogic.uploadAddressPicInfo(getContext(), imagePaths, new Event<String>()
  175 +// .setFailureCallback(new FailureCallback() {
  176 +// @Override
  177 +// public void onFailure(int i, String s) {
  178 +// QMUITipDialogUtil.dismessDialog();
  179 +// Log.e(TAG, "onFailure: " + s);
  180 +// }
  181 +// })
  182 +// .setSuccessCallback(new SuccessCallback<String>() {
  183 +// @Override
  184 +// public void onSuccess(String data) {
  185 +// QMUITipDialogUtil.dismessDialog();
  186 +// Log.e(TAG, "onSuccess: " + data);
  187 +// }
  188 +// })
  189 +// );
  190 +// } catch (Exception e) {
  191 +// e.printStackTrace();
  192 +// }
  193 +// }
  194 +// });
  195 +// //
  196 +// }
  197 +// },2000);
  198 +
140 if (fragment.getActivity() == null) { 199 if (fragment.getActivity() == null) {
141 return; 200 return;
142 } 201 }
143 this.runRaceDetailInfo = runRaceDetailInfo; 202 this.runRaceDetailInfo = runRaceDetailInfo;
144 // //初始化地图点位 203 // //初始化地图点位
145 -// if (runRaceDetailInfo.getLatLongitude() != null) {  
146 -// Log.e(TAG, "initView: 长度:" + runRaceDetailInfo.getLatLongitude().length());  
147 -// trackPoints = GsonUtil.jsonToList(runRaceDetailInfo.getLatLongitude().trim(), LatLng.class);  
148 -// Log.e(TAG, "initView: trackPoints" + trackPoints.size());  
149 -// MyMapUtil.drawServerLineTrack(getContext(), baiduMap, trackPoints, SortType.asc, R.color.green_round, R.drawable.icon_start, R.drawable.icon_end);  
150 -// //自动计算地图缩放  
151 -// MapStatus.Builder builder = new MapStatus.Builder();  
152 -// builder.target(MyMapUtil.getCenterZoomPosition(trackPoints));  
153 -// builder.zoom(MyMapUtil.getZoom(trackPoints));  
154 -// baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));  
155 -// } 204 + if (runRaceDetailInfo.getLatLongitude() != null) {
  205 + importStreetPoints = GsonUtil.jsonToList(runRaceDetailInfo.getLatLongitude().trim(), LatLng.class);
  206 + Log.e(TAG, "importStreetPoints点数量" + importStreetPoints.size());
  207 + }
156 //轨迹开始时间 208 //轨迹开始时间
157 long startTime = 0; 209 long startTime = 0;
158 //轨迹结束时间 210 //轨迹结束时间
159 long endTime = 0; 211 long endTime = 0;
160 - if (!TextUtils.isEmpty(runRaceDetailInfo.getStartTime()) && !TextUtils.isEmpty(runRaceDetailInfo.getEndTime())&&!TextUtils.isEmpty(runRaceDetailInfo.getEntityName())) { 212 + if (!TextUtils.isEmpty(runRaceDetailInfo.getStartTime()) && !TextUtils.isEmpty(runRaceDetailInfo.getEndTime()) && !TextUtils.isEmpty(runRaceDetailInfo.getEntityName())) {
161 startTime = Long.parseLong(runRaceDetailInfo.getStartTime()); 213 startTime = Long.parseLong(runRaceDetailInfo.getStartTime());
162 endTime = Long.parseLong(runRaceDetailInfo.getEndTime()); 214 endTime = Long.parseLong(runRaceDetailInfo.getEndTime());
  215 + //todo 注意后续查询历史轨迹的时候,必须查数据库中的时间,因为涉及到历史运动恢复,所以不能用这个sp文件中的,这里设置,只是为了在服务启动成功后,
  216 + //设置轨迹查询实体名称
  217 + CommonInfo.setQueryEntityName(getContext(), runRaceDetailInfo.getEntityName());
  218 + //设置轨迹查询开始时间
  219 + CommonInfo.setQueryTraceStartTime(getContext(), startTime);
  220 + //设置轨迹查询结束时间
  221 + CommonInfo.setQueryTraceEndTime(getContext(), endTime);
  222 +
163 mClient = new LBSTraceClient(getContext()); 223 mClient = new LBSTraceClient(getContext());
164 //获取轨迹 224 //获取轨迹
165 if (mClient != null) { 225 if (mClient != null) {
@@ -167,6 +227,7 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener { @@ -167,6 +227,7 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
167 @Override 227 @Override
168 public void success(List<LatLng> resultPoints) { 228 public void success(List<LatLng> resultPoints) {
169 if (resultPoints != null && resultPoints.size() > 1) { 229 if (resultPoints != null && resultPoints.size() > 1) {
  230 + resultStreetPoints = resultPoints;
170 Log.e(TAG, "resultPoints: " + resultPoints.size()); 231 Log.e(TAG, "resultPoints: " + resultPoints.size());
171 MyMapUtil.drawServerLineTrack(getContext(), baiduMap, resultPoints, SortType.asc, R.color.green_round, R.drawable.icon_start, R.drawable.icon_end); 232 MyMapUtil.drawServerLineTrack(getContext(), baiduMap, resultPoints, SortType.asc, R.color.green_round, R.drawable.icon_start, R.drawable.icon_end);
172 // //自动计算地图缩放 233 // //自动计算地图缩放
@@ -175,14 +236,8 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener { @@ -175,14 +236,8 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
175 // builder.zoom(MyMapUtil.getZoom(resultPoints)); 236 // builder.zoom(MyMapUtil.getZoom(resultPoints));
176 // baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); 237 // baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
177 238
178 - LatLngBounds.Builder builder = new LatLngBounds.Builder();  
179 - for (LatLng latLng : resultPoints) {  
180 - builder.include(latLng);  
181 - }  
182 - MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngBounds(builder.build());  
183 - baiduMap.setMapStatus(mapStatusUpdate);  
184 - MapStatusUpdate msu = MapStatusUpdateFactory.zoomBy(-0.8f);  
185 - baiduMap.setMapStatus(msu); 239 + //设置地图自动缩放
  240 + MyMapUtil.setMapAutoZoom(baiduMap, resultPoints, -1.5f);
186 241
187 } 242 }
188 } 243 }
@@ -247,9 +302,8 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener { @@ -247,9 +302,8 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
247 } 302 }
248 }); 303 });
249 /*************************设置相关页面数据***************************/ 304 /*************************设置相关页面数据***************************/
250 -  
251 - //设置围栏ID  
252 - if (!TextUtils.isEmpty(runRaceDetailInfo.getFenceId())) { 305 + if (runRaceDetailInfo.getFenceId() != null) {
  306 + //设置围栏ID
253 CommonInfo.setFenceId(getContext(), Integer.parseInt(runRaceDetailInfo.getFenceId())); 307 CommonInfo.setFenceId(getContext(), Integer.parseInt(runRaceDetailInfo.getFenceId()));
254 } 308 }
255 //设置标题 309 //设置标题
@@ -438,7 +492,12 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener { @@ -438,7 +492,12 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
438 } 492 }
439 //现在开始 493 //现在开始
440 else if ("1".equals(fragment.binding.rlScrollViewStartBtn.getTag())) { 494 else if ("1".equals(fragment.binding.rlScrollViewStartBtn.getTag())) {
441 - startStepService(getContext()); 495 + //先判断是否从百度查询到赛事轨迹
  496 + if (resultStreetPoints != null) {
  497 + startStepService(getContext());
  498 + } else {
  499 + QMUITipDialogUtil.textDialog(getContext(), "正在获取轨迹请稍后...", 1);
  500 + }
442 } 501 }
443 //继续运动 502 //继续运动
444 else if ("2".equals(fragment.binding.rlScrollViewStartBtn.getTag())) { 503 else if ("2".equals(fragment.binding.rlScrollViewStartBtn.getTag())) {
@@ -515,10 +574,10 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener { @@ -515,10 +574,10 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
515 stopStepService(); 574 stopStepService();
516 startStepService(getContext()); 575 startStepService(getContext());
517 } else { 576 } else {
518 - PedometerMainActivity.startActivity(fragment.getActivity()); 577 + PedometerMainActivity.startActivity(fragment.getActivity(), runRaceDetailInfo.getStartLocation(), runRaceDetailInfo.getEndLocation(),importStreetPoints);
519 } 578 }
520 } else { 579 } else {
521 - PedometerMainActivity.startActivity(fragment.getActivity()); 580 + PedometerMainActivity.startActivity(fragment.getActivity(), runRaceDetailInfo.getStartLocation(), runRaceDetailInfo.getEndLocation(),importStreetPoints);
522 } 581 }
523 } 582 }
524 583
@@ -540,6 +599,7 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener { @@ -540,6 +599,7 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
540 if (baiduMap == null) { 599 if (baiduMap == null) {
541 baiduMap = mMapView.getMap(); 600 baiduMap = mMapView.getMap();
542 } 601 }
  602 +
543 if (routePlanSearch == null) { 603 if (routePlanSearch == null) {
544 routePlanSearch = RoutePlanSearch.newInstance(); 604 routePlanSearch = RoutePlanSearch.newInstance();
545 } 605 }
@@ -851,6 +911,20 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener { @@ -851,6 +911,20 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
851 if (mMapView != null) { 911 if (mMapView != null) {
852 mMapView.onResume(); 912 mMapView.onResume();
853 } 913 }
  914 + //todo 防止停止后,再次开始,无法获取到赛道的轨迹
  915 + if (runRaceDetailInfo != null) {
  916 + if (!TextUtils.isEmpty(runRaceDetailInfo.getStartTime()) && !TextUtils.isEmpty(runRaceDetailInfo.getEndTime()) && !TextUtils.isEmpty(runRaceDetailInfo.getEntityName())) {
  917 + long startTime = Long.parseLong(runRaceDetailInfo.getStartTime());
  918 + long endTime = Long.parseLong(runRaceDetailInfo.getEndTime());
  919 + //todo 注意后续查询历史轨迹的时候,必须查数据库中的时间,因为涉及到历史运动恢复,所以不能用这个sp文件中的,这里设置,只是为了在服务启动成功后,
  920 + //设置轨迹查询实体名称
  921 + CommonInfo.setQueryEntityName(getContext(), runRaceDetailInfo.getEntityName());
  922 + //设置轨迹查询开始时间
  923 + CommonInfo.setQueryTraceStartTime(getContext(), startTime);
  924 + //设置轨迹查询结束时间
  925 + CommonInfo.setQueryTraceEndTime(getContext(), endTime);
  926 + }
  927 + }
854 928
855 } 929 }
856 930
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/view/RunningFinishFragmentView.java
@@ -5,17 +5,31 @@ import android.text.TextUtils; @@ -5,17 +5,31 @@ import android.text.TextUtils;
5 import android.util.Log; 5 import android.util.Log;
6 import android.view.View; 6 import android.view.View;
7 7
  8 +import com.baidu.mapapi.map.BaiduMap;
  9 +import com.baidu.mapapi.map.MapView;
  10 +import com.baidu.mapapi.map.UiSettings;
  11 +import com.baidu.mapapi.model.LatLng;
  12 +import com.baidu.trace.model.SortType;
8 import com.bumptech.glide.Glide; 13 import com.bumptech.glide.Glide;
9 import com.cnlive.moudle.pedometer.commonInfo.CommonInfo; 14 import com.cnlive.moudle.pedometer.commonInfo.CommonInfo;
10 import com.cnlive.moudle.pedometer.model.RunningFinishBean; 15 import com.cnlive.moudle.pedometer.model.RunningFinishBean;
11 import com.cnlive.moudle.pedometer.ui.fragment.RunningFinishFragment; 16 import com.cnlive.moudle.pedometer.ui.fragment.RunningFinishFragment;
12 import com.cnlive.moudle.pedometer.ui.fragment.RunningMapFragment; 17 import com.cnlive.moudle.pedometer.ui.fragment.RunningMapFragment;
  18 +import com.cnlive.moudle.pedometer.utils.MyMapUtil;
  19 +import com.cnlive.moudle.pedometer.utils.QMUITipDialogUtil;
  20 +import com.example.moudle_pedometer.R;
13 import com.hannesdorfmann.mosby3.mvp.MvpView; 21 import com.hannesdorfmann.mosby3.mvp.MvpView;
  22 +import com.sothree.slidinguppanel.SlidingUpPanelLayout;
  23 +
  24 +import java.util.List;
14 25
15 26
16 public class RunningFinishFragmentView implements MvpView { 27 public class RunningFinishFragmentView implements MvpView {
17 private final String TAG = "RunningFinishView"; 28 private final String TAG = "RunningFinishView";
18 private RunningFinishFragment fragment; 29 private RunningFinishFragment fragment;
  30 + public BaiduMap baiduMap;
  31 + private MapView mMapView;
  32 + private UiSettings mUiSettings;
19 33
20 public RunningFinishFragmentView(RunningFinishFragment fragment) { 34 public RunningFinishFragmentView(RunningFinishFragment fragment) {
21 this.fragment = fragment; 35 this.fragment = fragment;
@@ -26,6 +40,8 @@ public class RunningFinishFragmentView implements MvpView { @@ -26,6 +40,8 @@ public class RunningFinishFragmentView implements MvpView {
26 } 40 }
27 41
28 public void initView(RunningFinishBean runningFinishBean) { 42 public void initView(RunningFinishBean runningFinishBean) {
  43 + this.mMapView = fragment.binding.mapView;
  44 + initMap();
29 //设置用户头像 45 //设置用户头像
30 String faceUrl = CommonInfo.getUserIcon(getContext()); 46 String faceUrl = CommonInfo.getUserIcon(getContext());
31 if (!TextUtils.isEmpty(faceUrl)) { 47 if (!TextUtils.isEmpty(faceUrl)) {
@@ -70,5 +86,65 @@ public class RunningFinishFragmentView implements MvpView { @@ -70,5 +86,65 @@ public class RunningFinishFragmentView implements MvpView {
70 fragment.getActivity().finish(); 86 fragment.getActivity().finish();
71 } 87 }
72 }); 88 });
  89 + //完成按钮
  90 + fragment.binding.rlScrollViewStartBtn.setOnClickListener(new View.OnClickListener() {
  91 + @Override
  92 + public void onClick(View view) {
  93 + if ("1".equals(fragment.binding.rlScrollViewStartBtn.getTag())) {
  94 + if (fragment.getActivity() != null) {
  95 + fragment.getActivity().finish();
  96 + }
  97 + }
  98 + }
  99 + });
  100 + }
  101 +
  102 + public void initMap() {
  103 + if (baiduMap == null) {
  104 + baiduMap = mMapView.getMap();
  105 + }
  106 + if (mUiSettings == null) {
  107 + mUiSettings = baiduMap.getUiSettings();
  108 + }
  109 + //启动所有手势
  110 + mUiSettings.setAllGesturesEnabled(true);
  111 + //通过设置enable为true或false 选择是否显示缩放按钮
  112 + mMapView.showZoomControls(false);
  113 + mUiSettings.setEnlargeCenterWithDoubleClickEnable(true);
  114 + //隐藏自带的指南针,改用自定义指南针 杨帅
  115 + mUiSettings.setCompassEnabled(false);
  116 + //显示定位图层
  117 + baiduMap.setMyLocationEnabled(false);
  118 + }
  119 +
  120 + public void drawServerStreetTrace(List<LatLng> trackPoints) {
  121 + if (getContext() == null) {
  122 + return;
  123 + }
  124 + MyMapUtil.drawServerLineTrack(getContext(), baiduMap, trackPoints, SortType.asc, R.color.green_50, R.drawable.icon_start, R.drawable.icon_end);
  125 + //设置地图自动缩放
  126 + MyMapUtil.setMapAutoZoom(baiduMap, trackPoints, -1.5f);
  127 + }
  128 +
  129 + public void updataIsFinish(RunningFinishBean runningFinishBean) {
  130 + if (getContext() == null || runningFinishBean == null) {
  131 + return;
  132 + }
  133 + //显示提示框
  134 + QMUITipDialogUtil.messageDialog(getContext(), "成绩已上传", 2);
  135 + //改变提示文字
  136 + fragment.binding.tvRunNow.setText("完成");
  137 + fragment.binding.rlScrollViewStartBtn.setTag("1");
  138 + fragment.binding.loading.setVisibility(View.GONE);
  139 + //设置是否完成
  140 + if ("1".equals(runningFinishBean.getIsFinish())) {
  141 + fragment.binding.includeFinishRunRoute.tvFinishState.setText("路线完成");
  142 + fragment.binding.includeFinishRunRoute.tvFinishState.setTextColor(getContext().getResources().getColor(R.color.green_round));
  143 + } else {
  144 + fragment.binding.includeFinishRunRoute.tvFinishState.setText("路线未完成");
  145 + fragment.binding.includeFinishRunRoute.tvFinishState.setTextColor(getContext().getResources().getColor(R.color.red));
  146 + }
  147 + fragment.binding.slidingLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED);
  148 +
73 } 149 }
74 } 150 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/view/RunningMapFragmentView.java
@@ -23,6 +23,7 @@ import com.baidu.mapapi.map.BaiduMap; @@ -23,6 +23,7 @@ import com.baidu.mapapi.map.BaiduMap;
23 import com.baidu.mapapi.map.BitmapDescriptor; 23 import com.baidu.mapapi.map.BitmapDescriptor;
24 import com.baidu.mapapi.map.BitmapDescriptorFactory; 24 import com.baidu.mapapi.map.BitmapDescriptorFactory;
25 import com.baidu.mapapi.map.MapStatus; 25 import com.baidu.mapapi.map.MapStatus;
  26 +import com.baidu.mapapi.map.MapStatusUpdate;
26 import com.baidu.mapapi.map.MapStatusUpdateFactory; 27 import com.baidu.mapapi.map.MapStatusUpdateFactory;
27 import com.baidu.mapapi.map.MapView; 28 import com.baidu.mapapi.map.MapView;
28 import com.baidu.mapapi.map.MarkerOptions; 29 import com.baidu.mapapi.map.MarkerOptions;
@@ -31,6 +32,7 @@ import com.baidu.mapapi.map.MyLocationData; @@ -31,6 +32,7 @@ import com.baidu.mapapi.map.MyLocationData;
31 import com.baidu.mapapi.map.Overlay; 32 import com.baidu.mapapi.map.Overlay;
32 import com.baidu.mapapi.map.UiSettings; 33 import com.baidu.mapapi.map.UiSettings;
33 import com.baidu.mapapi.model.LatLng; 34 import com.baidu.mapapi.model.LatLng;
  35 +import com.baidu.mapapi.model.LatLngBounds;
34 import com.baidu.mapapi.utils.DistanceUtil; 36 import com.baidu.mapapi.utils.DistanceUtil;
35 import com.baidu.trace.model.SortType; 37 import com.baidu.trace.model.SortType;
36 import com.cnlive.moudle.pedometer.model.RunningMapBean; 38 import com.cnlive.moudle.pedometer.model.RunningMapBean;
@@ -71,7 +73,6 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener { @@ -71,7 +73,6 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener {
71 public MyLocationListenner myListener = new MyLocationListenner(); 73 public MyLocationListenner myListener = new MyLocationListenner();
72 private final int DEFULT_ZOOM = 17; 74 private final int DEFULT_ZOOM = 17;
73 private boolean isFirstLoadMap = true; 75 private boolean isFirstLoadMap = true;
74 - private List<LatLng> trackPoints;  
75 private Overlay currentLine; 76 private Overlay currentLine;
76 private List<LatLng> currentPoints; 77 private List<LatLng> currentPoints;
77 78
@@ -83,9 +84,8 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener { @@ -83,9 +84,8 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener {
83 return fragment == null ? null : fragment.getActivity(); 84 return fragment == null ? null : fragment.getActivity();
84 } 85 }
85 86
86 - public void initView(List<LatLng> trackPoints) { 87 + public void initView() {
87 currentPoints = new ArrayList<>(); 88 currentPoints = new ArrayList<>();
88 - this.trackPoints = trackPoints;  
89 this.mMapView = fragment.binding.mapView; 89 this.mMapView = fragment.binding.mapView;
90 if (baiduMap == null) { 90 if (baiduMap == null) {
91 baiduMap = mMapView.getMap(); 91 baiduMap = mMapView.getMap();
@@ -156,24 +156,6 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener { @@ -156,24 +156,6 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener {
156 baiduMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() { 156 baiduMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {
157 @Override 157 @Override
158 public void onMapLoaded() { 158 public void onMapLoaded() {
159 - //自动计算地图缩放  
160 - MapStatus.Builder builder = new MapStatus.Builder();  
161 - builder.target(MyMapUtil.getCenterZoomPosition(trackPoints));  
162 - builder.zoom(MyMapUtil.getZoom(trackPoints));  
163 - baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));  
164 - if (isFirstLoadMap) {  
165 - isFirstLoadMap = false;  
166 - new Handler().postDelayed(new Runnable() {  
167 - @Override  
168 - public void run() {  
169 - //绘制赛道轨迹  
170 - if (getContext() == null) {  
171 - return;  
172 - }  
173 - MyMapUtil.drawServerLineTrack(getContext(), baiduMap, trackPoints, SortType.asc, R.color.green_50, R.drawable.icon_start, R.drawable.icon_end);  
174 - }  
175 - }, 1500);  
176 - }  
177 } 159 }
178 }); 160 });
179 //返回键 161 //返回键
@@ -218,6 +200,15 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener { @@ -218,6 +200,15 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener {
218 200
219 } 201 }
220 202
  203 + public void drawServerStreetTrace(List<LatLng> trackPoints) {
  204 + if (getContext() == null) {
  205 + return;
  206 + }
  207 + MyMapUtil.drawServerLineTrack(getContext(), baiduMap, trackPoints, SortType.asc, R.color.green_50, R.drawable.icon_start, R.drawable.icon_end);
  208 + //设置地图自动缩放
  209 + MyMapUtil.setMapAutoZoom(baiduMap, trackPoints, -1.5f);
  210 + }
  211 +
221 212
222 /** 213 /**
223 * //设置定位监听器,获取到用户当前位置 杨帅 214 * //设置定位监听器,获取到用户当前位置 杨帅
@@ -429,7 +420,9 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener { @@ -429,7 +420,9 @@ public class RunningMapFragmentView implements MvpView, SensorEventListener {
429 // 此处设置开发者获取到的方向信息,顺时针0-360 420 // 此处设置开发者获取到的方向信息,顺时针0-360
430 .direction(mCurrentDirection).latitude(mylocation.latitude) 421 .direction(mCurrentDirection).latitude(mylocation.latitude)
431 .longitude(mylocation.longitude).build(); 422 .longitude(mylocation.longitude).build();
432 - baiduMap.setMyLocationData(mylocation); 423 + if (baiduMap != null) {
  424 + baiduMap.setMyLocationData(mylocation);
  425 + }
433 } 426 }
434 } 427 }
435 lastX = x; 428 lastX = x;
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/model/Constant.java
@@ -3,7 +3,7 @@ package com.cnlive.moudle.pedometer.model; @@ -3,7 +3,7 @@ package com.cnlive.moudle.pedometer.model;
3 public class Constant { 3 public class Constant {
4 public static final long SERVICE_ID = 213511; 4 public static final long SERVICE_ID = 213511;
5 public static final int TAG = 1; 5 public static final int TAG = 1;
6 - public static final int GATHER_INTERVAL = 3;//位置采集周期 6 + public static final int GATHER_INTERVAL =2;//位置采集周期
7 public static final int PACK_INTERVAL = 10;//位置采集周期 7 public static final int PACK_INTERVAL = 10;//位置采集周期
8 8
9 public static final int SERVICE_STEP_COUNT_UPDATE = 0;//步数更新 9 public static final int SERVICE_STEP_COUNT_UPDATE = 0;//步数更新
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/model/RunningFinishBean.java
@@ -17,8 +17,25 @@ public class RunningFinishBean implements Serializable { @@ -17,8 +17,25 @@ public class RunningFinishBean implements Serializable {
17 private String endPoint; 17 private String endPoint;
18 private String date; 18 private String date;
19 private List<String> latList; 19 private List<String> latList;
  20 + private String employTime;
  21 + private String isFinish;
  22 + private String roadmap;
20 23
  24 + public String getRoadmap() {
  25 + return roadmap;
  26 + }
  27 +
  28 + public void setRoadmap(String roadmap) {
  29 + this.roadmap = roadmap;
  30 + }
21 31
  32 + public String getIsFinish() {
  33 + return isFinish;
  34 + }
  35 +
  36 + public void setIsFinish(String isFinish) {
  37 + this.isFinish = isFinish;
  38 + }
22 39
23 public String getRunDistance() { 40 public String getRunDistance() {
24 return runDistance; 41 return runDistance;
@@ -75,4 +92,20 @@ public class RunningFinishBean implements Serializable { @@ -75,4 +92,20 @@ public class RunningFinishBean implements Serializable {
75 public void setDate(String date) { 92 public void setDate(String date) {
76 this.date = date; 93 this.date = date;
77 } 94 }
  95 +
  96 + public List<String> getLatList() {
  97 + return latList;
  98 + }
  99 +
  100 + public void setLatList(List<String> latList) {
  101 + this.latList = latList;
  102 + }
  103 +
  104 + public String getEmployTime() {
  105 + return employTime;
  106 + }
  107 +
  108 + public void setEmployTime(String employTime) {
  109 + this.employTime = employTime;
  110 + }
78 } 111 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/net/ApiServiceRunLin.java
@@ -67,6 +67,13 @@ public interface ApiServiceRunLin { @@ -67,6 +67,13 @@ public interface ApiServiceRunLin {
67 Observable<Result<BaseInfo<SelfRecordInfo>>> getSelfRecordInfo(@QueryMap() Map<String, String> maps); 67 Observable<Result<BaseInfo<SelfRecordInfo>>> getSelfRecordInfo(@QueryMap() Map<String, String> maps);
68 68
69 /** 69 /**
  70 + * 保存个人约跑路线记录
  71 + */
  72 + @POST("Daren/event/routeRecord.action")
  73 + Observable<Result<BaseInfo>> saveRouteData(@QueryMap() Map<String, String> maps);
  74 +
  75 +
  76 + /**
70 * 踩点轨迹列表 77 * 踩点轨迹列表
71 */ 78 */
72 @POST("Daren/event/getShoeLineList.action") 79 @POST("Daren/event/getShoeLineList.action")
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/net/SubscriptionRequest.java
@@ -3,6 +3,7 @@ package com.cnlive.moudle.pedometer.net; @@ -3,6 +3,7 @@ package com.cnlive.moudle.pedometer.net;
3 import android.content.Context; 3 import android.content.Context;
4 4
5 import okhttp3.Interceptor; 5 import okhttp3.Interceptor;
  6 +
6 import com.cnlive.libs.base.application.AppConfig; 7 import com.cnlive.libs.base.application.AppConfig;
7 import com.cnlive.libs.base.logic.callback.DataCallback; 8 import com.cnlive.libs.base.logic.callback.DataCallback;
8 import com.cnlive.libs.data.network.ApiBuild; 9 import com.cnlive.libs.data.network.ApiBuild;
@@ -11,6 +12,7 @@ import com.cnlive.libs.data.network.interceptor.NetPPEncryptInterceptor; @@ -11,6 +12,7 @@ import com.cnlive.libs.data.network.interceptor.NetPPEncryptInterceptor;
11 import com.cnlive.libs.data.network.interceptor.NetPPPayEncryptInterceptor; 12 import com.cnlive.libs.data.network.interceptor.NetPPPayEncryptInterceptor;
12 import com.cnlive.libs.data.network.interceptor.SignEncryptInterceptor; 13 import com.cnlive.libs.data.network.interceptor.SignEncryptInterceptor;
13 import com.cnlive.moudle.pedometer.net.bean.BaseInfo; 14 import com.cnlive.moudle.pedometer.net.bean.BaseInfo;
  15 +import com.cnlive.moudle.pedometer.net.bean.upload.api.ApiServiceOpen;
14 16
15 import io.reactivex.android.schedulers.AndroidSchedulers; 17 import io.reactivex.android.schedulers.AndroidSchedulers;
16 import io.reactivex.disposables.Disposable; 18 import io.reactivex.disposables.Disposable;
@@ -21,17 +23,19 @@ import static com.cnlive.libs.base.logic.Config.SUCCESS; @@ -21,17 +23,19 @@ import static com.cnlive.libs.base.logic.Config.SUCCESS;
21 23
22 /** 24 /**
23 * Created by Lynn on 2019/3/27. 25 * Created by Lynn on 2019/3/27.
  26 + * modify by ShinnyYang
24 */ 27 */
25 public class SubscriptionRequest<Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo> { 28 public class SubscriptionRequest<Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo> {
26 private static final String SP_CMS_URL_DEBUT = "http://cmstest.cnlive.com:8768/"; 29 private static final String SP_CMS_URL_DEBUT = "http://cmstest.cnlive.com:8768/";
27 private static final String SP_CMS_URL = "http://cms.cnlive.com:8768/"; 30 private static final String SP_CMS_URL = "http://cms.cnlive.com:8768/";
28 - 31 + private static final int OKHTTP_KEEP_ALIVE_DURATION_SECONDS = 10;
  32 + //OPEN API 接口域名
  33 + private static final String OPEN_URL = "https://api.cnlive.com/";
29 //网++ 接口域名 34 //网++ 接口域名
30 public static final String SP_BASE_URL = "https://apiwjj.cnlive.com/"; 35 public static final String SP_BASE_URL = "https://apiwjj.cnlive.com/";
31 //网++ 测试环境 接口域名 36 //网++ 测试环境 接口域名
32 public static final String SP_DEBUG_URL = "http://apiwjjtest.cnlive.com/"; 37 public static final String SP_DEBUG_URL = "http://apiwjjtest.cnlive.com/";
33 //OPEN API 接口域名 38 //OPEN API 接口域名
34 - private static final String SP_OPEN_URL = "https://api.cnlive.com/";  
35 private Observable observable; 39 private Observable observable;
36 40
37 private static <T> String baseCMSEndpoint() { 41 private static <T> String baseCMSEndpoint() {
@@ -43,7 +47,11 @@ public class SubscriptionRequest&lt;Observable extends io.reactivex.Observable&lt;Resu @@ -43,7 +47,11 @@ public class SubscriptionRequest&lt;Observable extends io.reactivex.Observable&lt;Resu
43 } 47 }
44 48
45 private static <T> String serviceEndpoint(Class<T> clazz) { 49 private static <T> String serviceEndpoint(Class<T> clazz) {
46 - return baseEndpoint(); 50 + if (clazz == ApiServiceOpen.class) {
  51 + return OPEN_URL;
  52 + } else {
  53 + return baseEndpoint();
  54 + }
47 } 55 }
48 56
49 public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo> 57 public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
@@ -51,6 +59,21 @@ public class SubscriptionRequest&lt;Observable extends io.reactivex.Observable&lt;Resu @@ -51,6 +59,21 @@ public class SubscriptionRequest&lt;Observable extends io.reactivex.Observable&lt;Resu
51 return service(clazz, api, new SignEncryptInterceptor()); 59 return service(clazz, api, new SignEncryptInterceptor());
52 } 60 }
53 61
  62 + public static <Service> Service service(Class<Service> clazz) {
  63 + return service(clazz, new SignEncryptInterceptor());
  64 + }
  65 +
  66 + private static <Service> Service service(Class<Service> clazz, Interceptor... interceptor) {
  67 + return service(clazz, false, interceptor);
  68 + }
  69 +
  70 + private static <Service> Service service(Class<Service> clazz, boolean decode, Interceptor... interceptor) {
  71 + return ApiBuild.service(clazz, null)
  72 + .setEndpoint(serviceEndpoint(clazz))
  73 + .addInterceptor(interceptor)
  74 + .service(decode, OKHTTP_KEEP_ALIVE_DURATION_SECONDS);
  75 + }
  76 +
54 public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo> 77 public static <Service, Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
55 SubscriptionRequest<Observable, BaseData> serviceEncrypt(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api) { 78 SubscriptionRequest<Observable, BaseData> serviceEncrypt(Class<Service> clazz, ApiBuild.Api<Service, Observable, BaseData> api) {
56 return service(clazz, api, new NetPPEncryptInterceptor()); 79 return service(clazz, api, new NetPPEncryptInterceptor());
@@ -78,13 +101,17 @@ public class SubscriptionRequest&lt;Observable extends io.reactivex.Observable&lt;Resu @@ -78,13 +101,17 @@ public class SubscriptionRequest&lt;Observable extends io.reactivex.Observable&lt;Resu
78 Subscriber<BaseData> subscriber = new Subscriber<BaseData>(context) { 101 Subscriber<BaseData> subscriber = new Subscriber<BaseData>(context) {
79 @Override 102 @Override
80 public void onCompleted(String s, String s1, BaseData data) { 103 public void onCompleted(String s, String s1, BaseData data) {
81 - if (callback == null) return; 104 + if (callback == null) {
  105 + return;
  106 + }
82 callback.callback(SUCCESS, "", data); 107 callback.callback(SUCCESS, "", data);
83 } 108 }
84 109
85 @Override 110 @Override
86 public void onError(String code, String message) { 111 public void onError(String code, String message) {
87 - if (callback == null) return; 112 + if (callback == null) {
  113 + return;
  114 + }
88 int errorCode = -1; 115 int errorCode = -1;
89 try { 116 try {
90 errorCode = Integer.valueOf(code); 117 errorCode = Integer.valueOf(code);
@@ -101,5 +128,12 @@ public class SubscriptionRequest&lt;Observable extends io.reactivex.Observable&lt;Resu @@ -101,5 +128,12 @@ public class SubscriptionRequest&lt;Observable extends io.reactivex.Observable&lt;Resu
101 .subscribe(subscriber.next, subscriber.error, subscriber.complete, subscriber.subscribe); 128 .subscribe(subscriber.next, subscriber.error, subscriber.complete, subscriber.subscribe);
102 } 129 }
103 130
  131 + public static <Observable extends io.reactivex.Observable<Result<BaseData>>, BaseData extends BaseInfo>
  132 + Disposable subscribe(Observable observable, Subscriber<BaseData> subscriber) {
  133 + return observable.take(1)
  134 + .subscribeOn(Schedulers.io())
  135 + .observeOn(AndroidSchedulers.mainThread())
  136 + .subscribe(subscriber.next, subscriber.error, subscriber.complete, subscriber.subscribe);
  137 + }
104 138
105 } 139 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/net/bean/upload/FeedBackInfo.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.net.bean.upload;
  2 +
  3 +/**
  4 + * Created by Lynn on 2018/9/4.
  5 + */
  6 +
  7 +public class FeedBackInfo {
  8 + private String imageUrl;
  9 + private long imageWidth;
  10 + private long imageHeight;
  11 +
  12 + public String getImageUrl() {
  13 + return imageUrl;
  14 + }
  15 +
  16 + public void setImageUrl(String imageUrl) {
  17 + this.imageUrl = imageUrl;
  18 + }
  19 +
  20 + public long getImageWidth() {
  21 + return imageWidth;
  22 + }
  23 +
  24 + public void setImageWidth(long imageWidth) {
  25 + this.imageWidth = imageWidth;
  26 + }
  27 +
  28 + public long getImageHeight() {
  29 + return imageHeight;
  30 + }
  31 +
  32 + public void setImageHeight(long imageHeight) {
  33 + this.imageHeight = imageHeight;
  34 + }
  35 +
  36 + @Override
  37 + public String toString() {
  38 + return "FeedBackInfo{" +
  39 + "imageUrl='" + imageUrl + '\'' +
  40 + ", imageWidth=" + imageWidth +
  41 + ", imageHeight=" + imageHeight +
  42 + '}';
  43 + }
  44 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/net/bean/upload/StorageInfoData.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.net.bean.upload;
  2 +
  3 +/**
  4 + * Created by cnlive201803 on 2018/5/31.
  5 + */
  6 +
  7 +public class StorageInfoData {
  8 + private int storageId;
  9 + private String storageName;
  10 + private int storageType;
  11 + private int state;
  12 + private int contentType;
  13 + private int profile;
  14 + private String domain;
  15 +
  16 +
  17 + public int getStorageId() {
  18 + return storageId;
  19 + }
  20 +
  21 + public void setStorageId(int storageId) {
  22 + this.storageId = storageId;
  23 + }
  24 +
  25 + public String getStorageName() {
  26 + return storageName;
  27 + }
  28 +
  29 + public void setStorageName(String storageName) {
  30 + this.storageName = storageName;
  31 + }
  32 +
  33 + public int getStorageType() {
  34 + return storageType;
  35 + }
  36 +
  37 + public void setStorageType(int storageType) {
  38 + this.storageType = storageType;
  39 + }
  40 +
  41 + public int getState() {
  42 + return state;
  43 + }
  44 +
  45 + public void setState(int state) {
  46 + this.state = state;
  47 + }
  48 +
  49 + public int getContentType() {
  50 + return contentType;
  51 + }
  52 +
  53 + public void setContentType(int contentType) {
  54 + this.contentType = contentType;
  55 + }
  56 +
  57 + public int getProfile() {
  58 + return profile;
  59 + }
  60 +
  61 + public void setProfile(int profile) {
  62 + this.profile = profile;
  63 + }
  64 +
  65 + public String getDomain() {
  66 + return domain;
  67 + }
  68 +
  69 + public void setDomain(String domain) {
  70 + this.domain = domain;
  71 + }
  72 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/net/bean/upload/UploadAuthData.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.net.bean.upload;
  2 +
  3 +/**
  4 + * Created by cnlive201803 on 2018/5/9.
  5 + */
  6 +
  7 +public class UploadAuthData {
  8 + private String Authorization;
  9 + private String Date;
  10 + private String token;
  11 +
  12 + public String getAuthorization() {
  13 + return Authorization;
  14 + }
  15 +
  16 + public void setAuthorization(String authorization) {
  17 + Authorization = authorization;
  18 + }
  19 +
  20 + public String getDate() {
  21 + return Date;
  22 + }
  23 +
  24 + public void setDate(String date) {
  25 + Date = date;
  26 + }
  27 +
  28 + public String getToken() {
  29 + return token;
  30 + }
  31 +
  32 + public void setToken(String token) {
  33 + this.token = token;
  34 + }
  35 +
  36 + @Override
  37 + public String toString() {
  38 + return "UploadAuthData{" +
  39 + "Authorization='" + Authorization + '\'' +
  40 + ", Date='" + Date + '\'' +
  41 + ", token='" + token + '\'' +
  42 + '}';
  43 + }
  44 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/net/bean/upload/api/ApiServiceMoment.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.net.bean.upload.api;
  2 +
  3 +
  4 +import com.cnlive.moudle.pedometer.net.bean.BaseInfo;
  5 +
  6 +import java.util.List;
  7 +import java.util.Map;
  8 +
  9 +import io.reactivex.Observable;
  10 +import okhttp3.MultipartBody;
  11 +import okhttp3.RequestBody;
  12 +import retrofit2.adapter.rxjava2.Result;
  13 +import retrofit2.http.FieldMap;
  14 +import retrofit2.http.FormUrlEncoded;
  15 +import retrofit2.http.Headers;
  16 +import retrofit2.http.Multipart;
  17 +import retrofit2.http.POST;
  18 +import retrofit2.http.Part;
  19 +import retrofit2.http.PartMap;
  20 +import retrofit2.http.Path;
  21 +import retrofit2.http.QueryMap;
  22 +
  23 +/**
  24 + * 达人有关的接口
  25 + */
  26 +public interface ApiServiceMoment {
  27 +
  28 + /**
  29 + * 上传发布内容(图片传七牛)
  30 + */
  31 + @POST("{user}")
  32 + Observable<Result<BaseInfo>> releaseMomentNe(@Path(value = "user", encoded = true) String path, @QueryMap Map<String, Object> maps);
  33 +
  34 +
  35 + /**
  36 + * 上传发布内容(不含图片)
  37 + */
  38 + @POST("{user}")
  39 + Observable<Result<BaseInfo>> releaseMomentText(@Path(value = "user", encoded = true) String path, @QueryMap() Map<String, String> maps);
  40 +
  41 +
  42 +
  43 +}
  44 +
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/net/bean/upload/api/ApiServiceOpen.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.net.bean.upload.api;
  2 +
  3 +import com.cnlive.moudle.pedometer.net.bean.BaseInfo;
  4 +import com.cnlive.moudle.pedometer.net.bean.upload.StorageInfoData;
  5 +import com.cnlive.moudle.pedometer.net.bean.upload.UploadAuthData;
  6 +import java.util.List;
  7 +import java.util.Map;
  8 +
  9 +import io.reactivex.Observable;
  10 +import retrofit2.adapter.rxjava2.Result;
  11 +import retrofit2.http.POST;
  12 +import retrofit2.http.QueryMap;
  13 +
  14 +/**
  15 + * Created by xiansong on 2018/3/22.
  16 + */
  17 +
  18 +public interface ApiServiceOpen {
  19 +
  20 +
  21 + /**
  22 + * 上传鉴权
  23 + *
  24 + * @param maps
  25 + * @return
  26 + */
  27 + @POST("open/api2/vod_epg/getUploadAuthForApp")
  28 + Observable<Result<BaseInfo<UploadAuthData>>> getUploadAuthForApp(@QueryMap Map<String, String> maps);
  29 +
  30 + /**
  31 + * 获取存储信息
  32 + *
  33 + * @param map
  34 + * @return
  35 + */
  36 + @POST("open/api2/storage/getStorageInfo")
  37 + Observable<Result<BaseInfo<List<StorageInfoData>>>> getStorageInfo(@QueryMap Map<String, String> map);
  38 +
  39 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/service/KeepLiveService.java
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint; @@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
4 import android.app.Notification; 4 import android.app.Notification;
5 import android.app.NotificationChannel; 5 import android.app.NotificationChannel;
6 import android.app.NotificationManager; 6 import android.app.NotificationManager;
  7 +import android.app.PendingIntent;
7 import android.app.Service; 8 import android.app.Service;
8 import android.content.ComponentName; 9 import android.content.ComponentName;
9 import android.content.Context; 10 import android.content.Context;
@@ -19,6 +20,7 @@ import android.util.Log; @@ -19,6 +20,7 @@ import android.util.Log;
19 20
20 import com.cnlive.moudle.pedometer.commonInfo.CommonInfo; 21 import com.cnlive.moudle.pedometer.commonInfo.CommonInfo;
21 import com.cnlive.moudle.pedometer.receivers.ServiceReceiver; 22 import com.cnlive.moudle.pedometer.receivers.ServiceReceiver;
  23 +import com.cnlive.moudle.pedometer.ui.activity.PedometerMainActivity;
22 import com.cnlive.moudle.pedometer.utils.ServiceUtils; 24 import com.cnlive.moudle.pedometer.utils.ServiceUtils;
23 import com.example.moudle_pedometer.R; 25 import com.example.moudle_pedometer.R;
24 26
@@ -209,9 +211,22 @@ public class KeepLiveService extends Service implements MediaPlayer.OnCompletion @@ -209,9 +211,22 @@ public class KeepLiveService extends Service implements MediaPlayer.OnCompletion
209 channel.setLockscreenVisibility(NotificationCompat.VISIBILITY_PRIVATE); 211 channel.setLockscreenVisibility(NotificationCompat.VISIBILITY_PRIVATE);
210 mNM.createNotificationChannel(channel); 212 mNM.createNotificationChannel(channel);
211 } 213 }
  214 +// notification = new NotificationCompat.Builder(this, CHANNEL_ONE_ID)
  215 +// .setWhen(System.currentTimeMillis())
  216 +// .setContentTitle(getApplicationContext().getString(R.string.app_name))
  217 +// .setContentText("正在计步,请勿关闭")
  218 +// .setSound(null)
  219 +// .build();
  220 + Intent notificationIntent = new Intent(this, PedometerMainActivity.class);
212 notification = new NotificationCompat.Builder(this, CHANNEL_ONE_ID) 221 notification = new NotificationCompat.Builder(this, CHANNEL_ONE_ID)
213 - .setWhen(System.currentTimeMillis()) 222 + .setContentIntent(PendingIntent.getActivity(this, 0, notificationIntent, 0))
  223 + .setSmallIcon(R.mipmap.ic_launcher)
  224 +// .setCustomContentView(remoteViews)
  225 + .setContentTitle(getResources().getString(R.string.app_name))
  226 + .setContentText("正在记录您的运动")
  227 + .setCategory(Notification.CATEGORY_SERVICE)
214 .setSound(null) 228 .setSound(null)
  229 + .setWhen(System.currentTimeMillis())
215 .build(); 230 .build();
216 // 0 隐藏前台服务通知 231 // 0 隐藏前台服务通知
217 startForeground(100, notification); 232 startForeground(100, notification);
@@ -221,11 +236,10 @@ public class KeepLiveService extends Service implements MediaPlayer.OnCompletion @@ -221,11 +236,10 @@ public class KeepLiveService extends Service implements MediaPlayer.OnCompletion
221 @Override 236 @Override
222 public void onDestroy() { 237 public void onDestroy() {
223 super.onDestroy(); 238 super.onDestroy();
224 - if (myReceiver != null) {  
225 - unregisterReceiver(myReceiver);  
226 - }  
227 try { 239 try {
228 -// stopForeground(true); 240 + if (myReceiver != null) {
  241 + unregisterReceiver(myReceiver);
  242 + }
229 } catch (Exception e) { 243 } catch (Exception e) {
230 } 244 }
231 stopPlaySong(); 245 stopPlaySong();
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/service/StepService.java
@@ -28,8 +28,22 @@ import android.widget.Toast; @@ -28,8 +28,22 @@ import android.widget.Toast;
28 28
29 import com.baidu.trace.LBSTraceClient; 29 import com.baidu.trace.LBSTraceClient;
30 import com.baidu.trace.Trace; 30 import com.baidu.trace.Trace;
  31 +import com.baidu.trace.api.fence.AddMonitoredPersonResponse;
  32 +import com.baidu.trace.api.fence.CreateFenceResponse;
  33 +import com.baidu.trace.api.fence.DeleteFenceResponse;
  34 +import com.baidu.trace.api.fence.DeleteMonitoredPersonResponse;
31 import com.baidu.trace.api.fence.FenceAlarmPushInfo; 35 import com.baidu.trace.api.fence.FenceAlarmPushInfo;
  36 +import com.baidu.trace.api.fence.FenceListResponse;
  37 +import com.baidu.trace.api.fence.HistoryAlarmResponse;
  38 +import com.baidu.trace.api.fence.ListMonitoredPersonResponse;
32 import com.baidu.trace.api.fence.MonitoredAction; 39 import com.baidu.trace.api.fence.MonitoredAction;
  40 +import com.baidu.trace.api.fence.MonitoredStatus;
  41 +import com.baidu.trace.api.fence.MonitoredStatusByLocationResponse;
  42 +import com.baidu.trace.api.fence.MonitoredStatusInfo;
  43 +import com.baidu.trace.api.fence.MonitoredStatusRequest;
  44 +import com.baidu.trace.api.fence.MonitoredStatusResponse;
  45 +import com.baidu.trace.api.fence.OnFenceListener;
  46 +import com.baidu.trace.api.fence.UpdateFenceResponse;
33 import com.baidu.trace.api.track.LatestPoint; 47 import com.baidu.trace.api.track.LatestPoint;
34 import com.baidu.trace.api.track.LatestPointResponse; 48 import com.baidu.trace.api.track.LatestPointResponse;
35 import com.baidu.trace.api.track.OnTrackListener; 49 import com.baidu.trace.api.track.OnTrackListener;
@@ -55,7 +69,9 @@ import org.greenrobot.eventbus.Subscribe; @@ -55,7 +69,9 @@ import org.greenrobot.eventbus.Subscribe;
55 import org.greenrobot.eventbus.ThreadMode; 69 import org.greenrobot.eventbus.ThreadMode;
56 70
57 import java.text.SimpleDateFormat; 71 import java.text.SimpleDateFormat;
  72 +import java.util.ArrayList;
58 import java.util.Date; 73 import java.util.Date;
  74 +import java.util.List;
59 75
60 76
61 public class StepService extends Service implements SensorEventListener { 77 public class StepService extends Service implements SensorEventListener {
@@ -234,6 +250,25 @@ public class StepService extends Service implements SensorEventListener { @@ -234,6 +250,25 @@ public class StepService extends Service implements SensorEventListener {
234 CommonInfo.setIsFirstStepSendTraceTip(getApplicationContext(), false); 250 CommonInfo.setIsFirstStepSendTraceTip(getApplicationContext(), false);
235 EventBus.getDefault().post(new MessageEvent(Constant.START_TRACE_GATHER_SUCCESS, "")); 251 EventBus.getDefault().post(new MessageEvent(Constant.START_TRACE_GATHER_SUCCESS, ""));
236 } 252 }
  253 + //设置用户开始时间以及赛事ID
  254 + UserStepEntity userStepEntity = StepUtil.getUserStepData(getApplicationContext(), CommonInfo.getUserId(getApplicationContext()));
  255 + if (userStepEntity == null) {
  256 + StepUtil.setStepStartData(getApplicationContext(), userId, TimeUtil.getNowTimeStamp(), CommonInfo.getStreetId(getApplicationContext()));
  257 + //设置从服务器获取的时间(后续查询历史轨迹的时间,要从数据库中获取,因为涉及到现有运动恢复问题)
  258 + StepUtil.setQueryTraceTime(getApplicationContext(), userId, CommonInfo.getQueryTraceStartTime(getApplicationContext()), CommonInfo.getQueryTraceEndTime(getApplicationContext()), CommonInfo.getQueryQueryEntityName(getApplicationContext()));
  259 + int fenceId = CommonInfo.getFenceId(getApplicationContext());
  260 + //设置围栏id
  261 + StepUtil.setFenceId(getApplicationContext(), CommonInfo.getUserId(getApplicationContext()), fenceId);
  262 + //清空临时保存的时间
  263 + CommonInfo.setQueryTraceEndTime(getApplicationContext(), 0);
  264 + CommonInfo.setQueryTraceStartTime(getApplicationContext(), 0);
  265 + CommonInfo.setQueryEntityName(getApplicationContext(), "");
  266 + CommonInfo.setFenceId(getApplicationContext(), -1);
  267 + }
  268 + //开始设置围栏报警
  269 + startQueryFence();
  270 +
  271 +
237 } 272 }
238 } else { 273 } else {
239 boolean isFirstSendNotification = CommonInfo.getIsFirstStepSendTraceTip(getApplicationContext()); 274 boolean isFirstSendNotification = CommonInfo.getIsFirstStepSendTraceTip(getApplicationContext());
@@ -327,16 +362,22 @@ public class StepService extends Service implements SensorEventListener { @@ -327,16 +362,22 @@ public class StepService extends Service implements SensorEventListener {
327 if (null == alarmPushInfo) { 362 if (null == alarmPushInfo) {
328 return; 363 return;
329 } 364 }
330 - //超出范围  
331 - if (alarmPushInfo.getMonitoredAction() == MonitoredAction.exit) {  
332 - EventBus.getDefault().post(new MessageEvent(Constant.EXIT_RANGE, ""));  
333 - }  
334 - //进入范围  
335 - else if (alarmPushInfo.getMonitoredAction() == MonitoredAction.enter) {  
336 - EventBus.getDefault().post(new MessageEvent(Constant.ENTER_RANGE, "")); 365 + UserStepEntity userStepEntity = StepUtil.getUserStepData(getApplicationContext(), CommonInfo.getUserId(getApplicationContext()));
  366 + if (userStepEntity == null) {
  367 + return;
337 } 368 }
338 - Toast.makeText(getApplicationContext(), "onPushCallback:" + alarmPushInfo.getMonitoredAction(), Toast.LENGTH_SHORT).show(); 369 + if (alarmPushInfo.getFenceId() == userStepEntity.getFenceId()) {
339 370
  371 + //超出范围
  372 + if (alarmPushInfo.getMonitoredAction() == MonitoredAction.exit) {
  373 + EventBus.getDefault().post(new MessageEvent(Constant.EXIT_RANGE, ""));
  374 + }
  375 + //进入范围
  376 + else if (alarmPushInfo.getMonitoredAction() == MonitoredAction.enter) {
  377 + EventBus.getDefault().post(new MessageEvent(Constant.ENTER_RANGE, ""));
  378 + }
  379 + Toast.makeText(getApplicationContext(), "onPushCallback:" + alarmPushInfo.getMonitoredAction(), Toast.LENGTH_SHORT).show();
  380 + }
340 } 381 }
341 382
342 @Override 383 @Override
@@ -347,15 +388,122 @@ public class StepService extends Service implements SensorEventListener { @@ -347,15 +388,122 @@ public class StepService extends Service implements SensorEventListener {
347 //开启轨迹服务 388 //开启轨迹服务
348 if (mClient != null) { 389 if (mClient != null) {
349 mClient.startTrace(mTrace, traceListener); 390 mClient.startTrace(mTrace, traceListener);
350 - //设置用户开始时间以及赛事ID  
351 - UserStepEntity userStepEntity = StepUtil.getUserStepData(getApplicationContext(), CommonInfo.getUserId(getApplicationContext()));  
352 - if (userStepEntity == null) {  
353 - StepUtil.setStepStartData(getApplicationContext(), userId, TimeUtil.getNowTimeStamp(), CommonInfo.getStreetId(getApplicationContext()));  
354 - }  
355 } 391 }
356 392
357 } 393 }
358 394
  395 + public void startQueryFence() {
  396 + UserStepEntity userStepEntity = StepUtil.getUserStepData(getApplicationContext(), CommonInfo.getUserId(getApplicationContext()));
  397 + // 初始化围栏监听器
  398 + OnFenceListener onFenceListener = new OnFenceListener() {
  399 + // 创建围栏回调
  400 + @Override
  401 + public void onCreateFenceCallback(CreateFenceResponse createFenceResponse) {
  402 + if ("成功".equals(createFenceResponse.getMessage())) {
  403 +// Toast.makeText(context, "创建围栏回调成功", Toast.LENGTH_SHORT).show();
  404 + Log.e(TAG, "onCreateFenceCallback: " + createFenceResponse.getFenceId());
  405 + // 查询围栏监控者状态
  406 + List<Long> list = new ArrayList<>();
  407 + list.add(createFenceResponse.getFenceId());
  408 + // 创建查询服务端围栏监控状态请求
  409 +
  410 + }
  411 + }
  412 +
  413 + // 更新围栏回调
  414 + @Override
  415 + public void onUpdateFenceCallback(UpdateFenceResponse updateFenceResponse) {
  416 +
  417 + }
  418 +
  419 + // 删除围栏回调
  420 + @Override
  421 + public void onDeleteFenceCallback(DeleteFenceResponse deleteFenceResponse) {
  422 +
  423 + }
  424 +
  425 + // 围栏列表回调
  426 + @Override
  427 + public void onFenceListCallback(FenceListResponse fenceListResponse) {
  428 + if ("成功".equals(fenceListResponse.getMessage())) {
  429 +// Toast.makeText(context, "围栏列表回调成功:" + fenceListResponse.getSize(), Toast.LENGTH_SHORT).show();
  430 + }
  431 + }
  432 +
  433 + // 监控状态回调
  434 + @Override
  435 + public void onMonitoredStatusCallback(MonitoredStatusResponse monitoredStatusResponse) {
  436 + if (monitoredStatusResponse.getMonitoredStatusInfos() != null) {
  437 + Toast.makeText(getApplicationContext(), "围栏列表回调成功:个数:" + monitoredStatusResponse.getMonitoredStatusInfos().size(), Toast.LENGTH_SHORT).show();
  438 + } //查询监控对象状态响应结果
  439 + List<MonitoredStatusInfo> monitoredStatusInfos = monitoredStatusResponse.getMonitoredStatusInfos();
  440 + if (monitoredStatusInfos == null) {
  441 + return;
  442 + }
  443 + for (MonitoredStatusInfo monitoredStatusInfo : monitoredStatusInfos) {
  444 + if (monitoredStatusInfo.getFenceId() == userStepEntity.getFenceId()) {
  445 + MonitoredStatus status = monitoredStatusInfo.getMonitoredStatus();//获取状态
  446 + switch (status) {
  447 + case in:
  448 + //监控的设备在围栏内
  449 + Toast.makeText(getApplicationContext(), "监控的设备在围栏内", Toast.LENGTH_SHORT).show();
  450 + Log.e(TAG, "监控的设备在围栏内: ");
  451 + break;
  452 + case out:
  453 + //监控的设备在围栏外
  454 + Toast.makeText(getApplicationContext(), "监控的设备在围栏外", Toast.LENGTH_SHORT).show();
  455 + Log.e(TAG, "监控的设备在围栏外: ");
  456 +
  457 + break;
  458 + case unknown:
  459 + //监控的设备状态未知
  460 + Toast.makeText(getApplicationContext(), "监控的设备状态未知", Toast.LENGTH_SHORT).show();
  461 + Log.e(TAG, "监控的设备状态未知: ");
  462 +
  463 + break;
  464 + }
  465 + }
  466 + }
  467 + }
  468 +
  469 + // 指定位置监控状态回调
  470 + @Override
  471 + public void onMonitoredStatusByLocationCallback(MonitoredStatusByLocationResponse monitoredStatusByLocationResponse) {
  472 + Log.e(TAG, "onMonitoredStatusByLocationCallback: ");
  473 + }
  474 +
  475 + // 历史报警回调
  476 + @Override
  477 + public void onHistoryAlarmCallback(HistoryAlarmResponse historyAlarmResponse) {
  478 + Log.e(TAG, "onHistoryAlarmCallback: ");
  479 + }
  480 +
  481 + @Override
  482 + public void onAddMonitoredPersonCallback(AddMonitoredPersonResponse addMonitoredPersonResponse) {
  483 + Log.e(TAG, "onAddMonitoredPersonCallback: ");
  484 + }
  485 +
  486 + @Override
  487 + public void onDeleteMonitoredPersonCallback(DeleteMonitoredPersonResponse deleteMonitoredPersonResponse) {
  488 + Log.e(TAG, "onDeleteMonitoredPersonCallback: ");
  489 + }
  490 +
  491 + @Override
  492 + public void onListMonitoredPersonCallback(ListMonitoredPersonResponse listMonitoredPersonResponse) {
  493 + Log.e(TAG, "onListMonitoredPersonCallback: ");
  494 + }
  495 + };
  496 + if (userStepEntity != null) {
  497 + List<Long> fenids = new ArrayList<>();
  498 + fenids.add(userStepEntity.getFenceId());
  499 + MonitoredStatusRequest request1 = MonitoredStatusRequest.buildServerRequest(Constant.TAG,
  500 + Constant.SERVICE_ID, userId, fenids);
  501 + if (mClient != null) {
  502 + mClient.queryMonitoredStatus(request1, onFenceListener);
  503 + }
  504 + }
  505 + }
  506 +
359 private long i = 0; 507 private long i = 0;
360 private long index = 0; 508 private long index = 0;
361 private int mJobId; 509 private int mJobId;
@@ -919,6 +1067,7 @@ public class StepService extends Service implements SensorEventListener { @@ -919,6 +1067,7 @@ public class StepService extends Service implements SensorEventListener {
919 } 1067 }
920 } 1068 }
921 1069
  1070 +
922 /** 1071 /**
923 * 保存记步数据 1072 * 保存记步数据
924 */ 1073 */
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/sql/dao/DaoMaster.java
@@ -21,14 +21,14 @@ public class DaoMaster extends AbstractDaoMaster { @@ -21,14 +21,14 @@ public class DaoMaster extends AbstractDaoMaster {
21 21
22 /** Creates underlying database table using DAOs. */ 22 /** Creates underlying database table using DAOs. */
23 public static void createAllTables(Database db, boolean ifNotExists) { 23 public static void createAllTables(Database db, boolean ifNotExists) {
24 - UserStepEntityDao.createTable(db, ifNotExists);  
25 CollUserStepEntityDao.createTable(db, ifNotExists); 24 CollUserStepEntityDao.createTable(db, ifNotExists);
  25 + UserStepEntityDao.createTable(db, ifNotExists);
26 } 26 }
27 27
28 /** Drops underlying database table using DAOs. */ 28 /** Drops underlying database table using DAOs. */
29 public static void dropAllTables(Database db, boolean ifExists) { 29 public static void dropAllTables(Database db, boolean ifExists) {
30 - UserStepEntityDao.dropTable(db, ifExists);  
31 CollUserStepEntityDao.dropTable(db, ifExists); 30 CollUserStepEntityDao.dropTable(db, ifExists);
  31 + UserStepEntityDao.dropTable(db, ifExists);
32 } 32 }
33 33
34 /** 34 /**
@@ -47,8 +47,8 @@ public class DaoMaster extends AbstractDaoMaster { @@ -47,8 +47,8 @@ public class DaoMaster extends AbstractDaoMaster {
47 47
48 public DaoMaster(Database db) { 48 public DaoMaster(Database db) {
49 super(db, SCHEMA_VERSION); 49 super(db, SCHEMA_VERSION);
50 - registerDaoClass(UserStepEntityDao.class);  
51 registerDaoClass(CollUserStepEntityDao.class); 50 registerDaoClass(CollUserStepEntityDao.class);
  51 + registerDaoClass(UserStepEntityDao.class);
52 } 52 }
53 53
54 public DaoSession newSession() { 54 public DaoSession newSession() {
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/sql/dao/DaoSession.java
@@ -8,11 +8,11 @@ import org.greenrobot.greendao.database.Database; @@ -8,11 +8,11 @@ import org.greenrobot.greendao.database.Database;
8 import org.greenrobot.greendao.identityscope.IdentityScopeType; 8 import org.greenrobot.greendao.identityscope.IdentityScopeType;
9 import org.greenrobot.greendao.internal.DaoConfig; 9 import org.greenrobot.greendao.internal.DaoConfig;
10 10
11 -import com.cnlive.moudle.pedometer.sql.entity.UserStepEntity;  
12 import com.cnlive.moudle.pedometer.sql.entity.CollUserStepEntity; 11 import com.cnlive.moudle.pedometer.sql.entity.CollUserStepEntity;
  12 +import com.cnlive.moudle.pedometer.sql.entity.UserStepEntity;
13 13
14 -import com.cnlive.moudle.pedometer.sql.dao.UserStepEntityDao;  
15 import com.cnlive.moudle.pedometer.sql.dao.CollUserStepEntityDao; 14 import com.cnlive.moudle.pedometer.sql.dao.CollUserStepEntityDao;
  15 +import com.cnlive.moudle.pedometer.sql.dao.UserStepEntityDao;
16 16
17 // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. 17 // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
18 18
@@ -23,40 +23,40 @@ import com.cnlive.moudle.pedometer.sql.dao.CollUserStepEntityDao; @@ -23,40 +23,40 @@ import com.cnlive.moudle.pedometer.sql.dao.CollUserStepEntityDao;
23 */ 23 */
24 public class DaoSession extends AbstractDaoSession { 24 public class DaoSession extends AbstractDaoSession {
25 25
26 - private final DaoConfig userStepEntityDaoConfig;  
27 private final DaoConfig collUserStepEntityDaoConfig; 26 private final DaoConfig collUserStepEntityDaoConfig;
  27 + private final DaoConfig userStepEntityDaoConfig;
28 28
29 - private final UserStepEntityDao userStepEntityDao;  
30 private final CollUserStepEntityDao collUserStepEntityDao; 29 private final CollUserStepEntityDao collUserStepEntityDao;
  30 + private final UserStepEntityDao userStepEntityDao;
31 31
32 public DaoSession(Database db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig> 32 public DaoSession(Database db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig>
33 daoConfigMap) { 33 daoConfigMap) {
34 super(db); 34 super(db);
35 35
36 - userStepEntityDaoConfig = daoConfigMap.get(UserStepEntityDao.class).clone();  
37 - userStepEntityDaoConfig.initIdentityScope(type);  
38 -  
39 collUserStepEntityDaoConfig = daoConfigMap.get(CollUserStepEntityDao.class).clone(); 36 collUserStepEntityDaoConfig = daoConfigMap.get(CollUserStepEntityDao.class).clone();
40 collUserStepEntityDaoConfig.initIdentityScope(type); 37 collUserStepEntityDaoConfig.initIdentityScope(type);
41 38
42 - userStepEntityDao = new UserStepEntityDao(userStepEntityDaoConfig, this); 39 + userStepEntityDaoConfig = daoConfigMap.get(UserStepEntityDao.class).clone();
  40 + userStepEntityDaoConfig.initIdentityScope(type);
  41 +
43 collUserStepEntityDao = new CollUserStepEntityDao(collUserStepEntityDaoConfig, this); 42 collUserStepEntityDao = new CollUserStepEntityDao(collUserStepEntityDaoConfig, this);
  43 + userStepEntityDao = new UserStepEntityDao(userStepEntityDaoConfig, this);
44 44
45 - registerDao(UserStepEntity.class, userStepEntityDao);  
46 registerDao(CollUserStepEntity.class, collUserStepEntityDao); 45 registerDao(CollUserStepEntity.class, collUserStepEntityDao);
  46 + registerDao(UserStepEntity.class, userStepEntityDao);
47 } 47 }
48 48
49 public void clear() { 49 public void clear() {
50 - userStepEntityDaoConfig.clearIdentityScope();  
51 collUserStepEntityDaoConfig.clearIdentityScope(); 50 collUserStepEntityDaoConfig.clearIdentityScope();
52 - }  
53 -  
54 - public UserStepEntityDao getUserStepEntityDao() {  
55 - return userStepEntityDao; 51 + userStepEntityDaoConfig.clearIdentityScope();
56 } 52 }
57 53
58 public CollUserStepEntityDao getCollUserStepEntityDao() { 54 public CollUserStepEntityDao getCollUserStepEntityDao() {
59 return collUserStepEntityDao; 55 return collUserStepEntityDao;
60 } 56 }
61 57
  58 + public UserStepEntityDao getUserStepEntityDao() {
  59 + return userStepEntityDao;
  60 + }
  61 +
62 } 62 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/sql/dao/UserStepEntityDao.java
@@ -39,6 +39,12 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; { @@ -39,6 +39,12 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; {
39 public final static Property PauseCount = new Property(12, int.class, "pauseCount", false, "PAUSE_COUNT"); 39 public final static Property PauseCount = new Property(12, int.class, "pauseCount", false, "PAUSE_COUNT");
40 public final static Property UserPauseTimeStamp = new Property(13, long.class, "userPauseTimeStamp", false, "USER_PAUSE_TIME_STAMP"); 40 public final static Property UserPauseTimeStamp = new Property(13, long.class, "userPauseTimeStamp", false, "USER_PAUSE_TIME_STAMP");
41 public final static Property ChronometerBase = new Property(14, long.class, "chronometerBase", false, "CHRONOMETER_BASE"); 41 public final static Property ChronometerBase = new Property(14, long.class, "chronometerBase", false, "CHRONOMETER_BASE");
  42 + public final static Property QueryTraceStartTime = new Property(15, long.class, "queryTraceStartTime", false, "QUERY_TRACE_START_TIME");
  43 + public final static Property QueryTraceEndTime = new Property(16, long.class, "queryTraceEndTime", false, "QUERY_TRACE_END_TIME");
  44 + public final static Property QueryEntityName = new Property(17, String.class, "queryEntityName", false, "QUERY_ENTITY_NAME");
  45 + public final static Property ContinueTime = new Property(18, long.class, "continueTime", false, "CONTINUE_TIME");
  46 + public final static Property FenceId = new Property(19, long.class, "fenceId", false, "FENCE_ID");
  47 + public final static Property ImportPoint = new Property(20, String.class, "importPoint", false, "IMPORT_POINT");
42 } 48 }
43 49
44 50
@@ -68,7 +74,13 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; { @@ -68,7 +74,13 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; {
68 "\"STREET_ID\" TEXT," + // 11: streetId 74 "\"STREET_ID\" TEXT," + // 11: streetId
69 "\"PAUSE_COUNT\" INTEGER NOT NULL ," + // 12: pauseCount 75 "\"PAUSE_COUNT\" INTEGER NOT NULL ," + // 12: pauseCount
70 "\"USER_PAUSE_TIME_STAMP\" INTEGER NOT NULL ," + // 13: userPauseTimeStamp 76 "\"USER_PAUSE_TIME_STAMP\" INTEGER NOT NULL ," + // 13: userPauseTimeStamp
71 - "\"CHRONOMETER_BASE\" INTEGER NOT NULL );"); // 14: chronometerBase 77 + "\"CHRONOMETER_BASE\" INTEGER NOT NULL ," + // 14: chronometerBase
  78 + "\"QUERY_TRACE_START_TIME\" INTEGER NOT NULL ," + // 15: queryTraceStartTime
  79 + "\"QUERY_TRACE_END_TIME\" INTEGER NOT NULL ," + // 16: queryTraceEndTime
  80 + "\"QUERY_ENTITY_NAME\" TEXT," + // 17: queryEntityName
  81 + "\"CONTINUE_TIME\" INTEGER NOT NULL ," + // 18: continueTime
  82 + "\"FENCE_ID\" INTEGER NOT NULL ," + // 19: fenceId
  83 + "\"IMPORT_POINT\" TEXT);"); // 20: importPoint
72 } 84 }
73 85
74 /** Drops the underlying database table. */ 86 /** Drops the underlying database table. */
@@ -123,6 +135,20 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; { @@ -123,6 +135,20 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; {
123 stmt.bindLong(13, entity.getPauseCount()); 135 stmt.bindLong(13, entity.getPauseCount());
124 stmt.bindLong(14, entity.getUserPauseTimeStamp()); 136 stmt.bindLong(14, entity.getUserPauseTimeStamp());
125 stmt.bindLong(15, entity.getChronometerBase()); 137 stmt.bindLong(15, entity.getChronometerBase());
  138 + stmt.bindLong(16, entity.getQueryTraceStartTime());
  139 + stmt.bindLong(17, entity.getQueryTraceEndTime());
  140 +
  141 + String queryEntityName = entity.getQueryEntityName();
  142 + if (queryEntityName != null) {
  143 + stmt.bindString(18, queryEntityName);
  144 + }
  145 + stmt.bindLong(19, entity.getContinueTime());
  146 + stmt.bindLong(20, entity.getFenceId());
  147 +
  148 + String importPoint = entity.getImportPoint();
  149 + if (importPoint != null) {
  150 + stmt.bindString(21, importPoint);
  151 + }
126 } 152 }
127 153
128 @Override 154 @Override
@@ -171,6 +197,20 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; { @@ -171,6 +197,20 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; {
171 stmt.bindLong(13, entity.getPauseCount()); 197 stmt.bindLong(13, entity.getPauseCount());
172 stmt.bindLong(14, entity.getUserPauseTimeStamp()); 198 stmt.bindLong(14, entity.getUserPauseTimeStamp());
173 stmt.bindLong(15, entity.getChronometerBase()); 199 stmt.bindLong(15, entity.getChronometerBase());
  200 + stmt.bindLong(16, entity.getQueryTraceStartTime());
  201 + stmt.bindLong(17, entity.getQueryTraceEndTime());
  202 +
  203 + String queryEntityName = entity.getQueryEntityName();
  204 + if (queryEntityName != null) {
  205 + stmt.bindString(18, queryEntityName);
  206 + }
  207 + stmt.bindLong(19, entity.getContinueTime());
  208 + stmt.bindLong(20, entity.getFenceId());
  209 +
  210 + String importPoint = entity.getImportPoint();
  211 + if (importPoint != null) {
  212 + stmt.bindString(21, importPoint);
  213 + }
174 } 214 }
175 215
176 @Override 216 @Override
@@ -195,7 +235,13 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; { @@ -195,7 +235,13 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; {
195 cursor.isNull(offset + 11) ? null : cursor.getString(offset + 11), // streetId 235 cursor.isNull(offset + 11) ? null : cursor.getString(offset + 11), // streetId
196 cursor.getInt(offset + 12), // pauseCount 236 cursor.getInt(offset + 12), // pauseCount
197 cursor.getLong(offset + 13), // userPauseTimeStamp 237 cursor.getLong(offset + 13), // userPauseTimeStamp
198 - cursor.getLong(offset + 14) // chronometerBase 238 + cursor.getLong(offset + 14), // chronometerBase
  239 + cursor.getLong(offset + 15), // queryTraceStartTime
  240 + cursor.getLong(offset + 16), // queryTraceEndTime
  241 + cursor.isNull(offset + 17) ? null : cursor.getString(offset + 17), // queryEntityName
  242 + cursor.getLong(offset + 18), // continueTime
  243 + cursor.getLong(offset + 19), // fenceId
  244 + cursor.isNull(offset + 20) ? null : cursor.getString(offset + 20) // importPoint
199 ); 245 );
200 return entity; 246 return entity;
201 } 247 }
@@ -217,6 +263,12 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; { @@ -217,6 +263,12 @@ public class UserStepEntityDao extends AbstractDao&lt;UserStepEntity, String&gt; {
217 entity.setPauseCount(cursor.getInt(offset + 12)); 263 entity.setPauseCount(cursor.getInt(offset + 12));
218 entity.setUserPauseTimeStamp(cursor.getLong(offset + 13)); 264 entity.setUserPauseTimeStamp(cursor.getLong(offset + 13));
219 entity.setChronometerBase(cursor.getLong(offset + 14)); 265 entity.setChronometerBase(cursor.getLong(offset + 14));
  266 + entity.setQueryTraceStartTime(cursor.getLong(offset + 15));
  267 + entity.setQueryTraceEndTime(cursor.getLong(offset + 16));
  268 + entity.setQueryEntityName(cursor.isNull(offset + 17) ? null : cursor.getString(offset + 17));
  269 + entity.setContinueTime(cursor.getLong(offset + 18));
  270 + entity.setFenceId(cursor.getLong(offset + 19));
  271 + entity.setImportPoint(cursor.isNull(offset + 20) ? null : cursor.getString(offset + 20));
220 } 272 }
221 273
222 @Override 274 @Override
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/sql/entity/FailedEntity.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.sql.entity;
  2 +
  3 +/**
  4 + * 上传失败列表
  5 + *
  6 + * @author ShinnyYang
  7 + */
  8 +public class FailedEntity {
  9 + private String uuid;//主键
  10 + private String uid;//用户id
  11 + private String streetTitle;//赛道标题
  12 + private boolean isPause;//是否暂停
  13 + private String isFinish;//是否完成
  14 + private String time;//用时
  15 + private String speed;//配速
  16 + private String step;//步数
  17 + private String startPoint;//开始地点
  18 + private String endPoint;//结束地点
  19 + private long streetTraceStartTime;//赛道开始时间
  20 + private long streetTraceEndTime;//赛道结束时间
  21 + private String entityName;//实体名称
  22 + private long userStartTime;//用户开始时间
  23 + private long userEndTime;//用户结束时间
  24 + private String importPoint;//关键点
  25 + private String streetId;//赛事id
  26 +
  27 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/sql/entity/UserStepEntity.java
@@ -22,11 +22,18 @@ public class UserStepEntity { @@ -22,11 +22,18 @@ public class UserStepEntity {
22 private int pauseCount;//暂停次数 22 private int pauseCount;//暂停次数
23 private long userPauseTimeStamp;//暂停时间戳 23 private long userPauseTimeStamp;//暂停时间戳
24 private long chronometerBase;//计时器设置基础时间 24 private long chronometerBase;//计时器设置基础时间
  25 + private long queryTraceStartTime;//从服务器获取的开始时间呢
  26 + private long queryTraceEndTime;//从服务器获取的结束时间呢
  27 + private String queryEntityName;//从服务器获取的运营人员的实体名称
  28 + private long continueTime;//继续运动时间
  29 + private long fenceId;//围栏id
  30 + private String importPoint;//关键点
25 31
26 - @Generated(hash = 562353866) 32 +
  33 + @Generated(hash = 24427970)
27 public UserStepEntity(String userId, String date, String stepCount, long pauseTimeStamp, long recordTime, double caloriesCount, String serverTraceData, 34 public UserStepEntity(String userId, String date, String stepCount, long pauseTimeStamp, long recordTime, double caloriesCount, String serverTraceData,
28 String startPoint, String endPoint, long startTimeStamp, long finishTimeStamp, String streetId, int pauseCount, long userPauseTimeStamp, 35 String startPoint, String endPoint, long startTimeStamp, long finishTimeStamp, String streetId, int pauseCount, long userPauseTimeStamp,
29 - long chronometerBase) { 36 + long chronometerBase, long queryTraceStartTime, long queryTraceEndTime, String queryEntityName, long continueTime, long fenceId, String importPoint) {
30 this.userId = userId; 37 this.userId = userId;
31 this.date = date; 38 this.date = date;
32 this.stepCount = stepCount; 39 this.stepCount = stepCount;
@@ -42,6 +49,12 @@ public class UserStepEntity { @@ -42,6 +49,12 @@ public class UserStepEntity {
42 this.pauseCount = pauseCount; 49 this.pauseCount = pauseCount;
43 this.userPauseTimeStamp = userPauseTimeStamp; 50 this.userPauseTimeStamp = userPauseTimeStamp;
44 this.chronometerBase = chronometerBase; 51 this.chronometerBase = chronometerBase;
  52 + this.queryTraceStartTime = queryTraceStartTime;
  53 + this.queryTraceEndTime = queryTraceEndTime;
  54 + this.queryEntityName = queryEntityName;
  55 + this.continueTime = continueTime;
  56 + this.fenceId = fenceId;
  57 + this.importPoint = importPoint;
45 } 58 }
46 59
47 @Generated(hash = 273857141) 60 @Generated(hash = 273857141)
@@ -168,5 +181,53 @@ public class UserStepEntity { @@ -168,5 +181,53 @@ public class UserStepEntity {
168 this.chronometerBase = chronometerBase; 181 this.chronometerBase = chronometerBase;
169 } 182 }
170 183
  184 + public long getQueryTraceStartTime() {
  185 + return this.queryTraceStartTime;
  186 + }
  187 +
  188 + public void setQueryTraceStartTime(long queryTraceStartTime) {
  189 + this.queryTraceStartTime = queryTraceStartTime;
  190 + }
  191 +
  192 + public long getQueryTraceEndTime() {
  193 + return this.queryTraceEndTime;
  194 + }
  195 +
  196 + public void setQueryTraceEndTime(long queryTraceEndTime) {
  197 + this.queryTraceEndTime = queryTraceEndTime;
  198 + }
  199 +
  200 + public String getQueryEntityName() {
  201 + return this.queryEntityName;
  202 + }
  203 +
  204 + public void setQueryEntityName(String queryEntityName) {
  205 + this.queryEntityName = queryEntityName;
  206 + }
  207 +
  208 + public long getContinueTime() {
  209 + return this.continueTime;
  210 + }
  211 +
  212 + public void setContinueTime(long continueTime) {
  213 + this.continueTime = continueTime;
  214 + }
  215 +
  216 + public long getFenceId() {
  217 + return this.fenceId;
  218 + }
  219 +
  220 + public void setFenceId(long fenceId) {
  221 + this.fenceId = fenceId;
  222 + }
  223 +
  224 + public String getImportPoint() {
  225 + return this.importPoint;
  226 + }
  227 +
  228 + public void setImportPoint(String importPoint) {
  229 + this.importPoint = importPoint;
  230 + }
  231 +
171 232
172 } 233 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/activity/PedometerMainActivity.java
@@ -13,6 +13,7 @@ import android.os.Bundle; @@ -13,6 +13,7 @@ import android.os.Bundle;
13 import android.support.annotation.NonNull; 13 import android.support.annotation.NonNull;
14 import android.support.v4.app.NotificationManagerCompat; 14 import android.support.v4.app.NotificationManagerCompat;
15 import android.support.v4.content.ContextCompat; 15 import android.support.v4.content.ContextCompat;
  16 +import android.text.TextUtils;
16 import android.util.Log; 17 import android.util.Log;
17 import android.view.KeyEvent; 18 import android.view.KeyEvent;
18 import android.widget.Toast; 19 import android.widget.Toast;
@@ -20,6 +21,7 @@ import android.widget.Toast; @@ -20,6 +21,7 @@ import android.widget.Toast;
20 import com.alibaba.android.arouter.facade.annotation.Route; 21 import com.alibaba.android.arouter.facade.annotation.Route;
21 import com.baidu.mapapi.CoordType; 22 import com.baidu.mapapi.CoordType;
22 import com.baidu.mapapi.SDKInitializer; 23 import com.baidu.mapapi.SDKInitializer;
  24 +import com.baidu.mapapi.model.LatLng;
23 import com.cnlive.libs.base.ui.QMUIFragment; 25 import com.cnlive.libs.base.ui.QMUIFragment;
24 import com.cnlive.libs.base.ui.QMUIFragmentActivity; 26 import com.cnlive.libs.base.ui.QMUIFragmentActivity;
25 import com.cnlive.libs.base.util.StatusBarUtil; 27 import com.cnlive.libs.base.util.StatusBarUtil;
@@ -32,6 +34,9 @@ import com.cnlive.moudle.pedometer.utils.lib_permisshelper.PermissionsUtils; @@ -32,6 +34,9 @@ import com.cnlive.moudle.pedometer.utils.lib_permisshelper.PermissionsUtils;
32 import com.example.moudle_pedometer.R; 34 import com.example.moudle_pedometer.R;
33 35
34 36
  37 +import java.io.Serializable;
  38 +import java.util.List;
  39 +
35 import static android.app.Notification.EXTRA_CHANNEL_ID; 40 import static android.app.Notification.EXTRA_CHANNEL_ID;
36 import static android.provider.Settings.EXTRA_APP_PACKAGE; 41 import static android.provider.Settings.EXTRA_APP_PACKAGE;
37 42
@@ -40,12 +45,15 @@ import static android.provider.Settings.EXTRA_APP_PACKAGE; @@ -40,12 +45,15 @@ import static android.provider.Settings.EXTRA_APP_PACKAGE;
40 */ 45 */
41 @Route(path = "/moudle_pedometer/InterestActivity") 46 @Route(path = "/moudle_pedometer/InterestActivity")
42 public class PedometerMainActivity extends QMUIFragmentActivity { 47 public class PedometerMainActivity extends QMUIFragmentActivity {
43 - private static final String TAG = "CollPedometerMainActivity"; 48 + private static final String TAG = "PedometerMainActivity";
44 49
45 private NotificationManagerCompat notificationManagerCompat; 50 private NotificationManagerCompat notificationManagerCompat;
46 private boolean isOpen; 51 private boolean isOpen;
47 private PermissionsUtils mPermissionsUtils = new PermissionsUtils();//权限申请 52 private PermissionsUtils mPermissionsUtils = new PermissionsUtils();//权限申请
48 private RunMainFragment fragment; 53 private RunMainFragment fragment;
  54 + private String startPointAdd;
  55 + private String endPointAdd;
  56 + private List<LatLng> importStreetPoints;
49 57
50 @Override 58 @Override
51 protected int getContextViewId() { 59 protected int getContextViewId() {
@@ -55,8 +63,9 @@ public class PedometerMainActivity extends QMUIFragmentActivity { @@ -55,8 +63,9 @@ public class PedometerMainActivity extends QMUIFragmentActivity {
55 @Override 63 @Override
56 protected void onCreate(Bundle savedInstanceState) { 64 protected void onCreate(Bundle savedInstanceState) {
57 super.onCreate(savedInstanceState); 65 super.onCreate(savedInstanceState);
58 -// setContentView(R.layout.activity_pedometer_main);  
59 - 66 + startPointAdd = getIntent().getExtras().getString("startPointAdd");
  67 + endPointAdd = getIntent().getExtras().getString("endPointAdd");
  68 + importStreetPoints = (List<LatLng>) getIntent().getExtras().getSerializable("importStreetPoints");
60 } 69 }
61 70
62 71
@@ -119,31 +128,13 @@ public class PedometerMainActivity extends QMUIFragmentActivity { @@ -119,31 +128,13 @@ public class PedometerMainActivity extends QMUIFragmentActivity {
119 128
120 @Override 129 @Override
121 protected void onResume() { 130 protected void onResume() {
122 -  
123 - boolean result = false;  
124 - if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_BOOT_COMPLETED) == PackageManager.PERMISSION_GRANTED) {  
125 - result = true;  
126 - }  
127 - Log.e("i", "" + result + "," + getPackageName());  
128 - PackageManager pm = getPackageManager();  
129 - pm.checkPermission("android.permission.RECEIVE_BOOT_COMPLETED", getPackageName());  
130 - try {  
131 - PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), PackageManager.GET_PERMISSIONS);  
132 - for (int i = 0; i < packageInfo.requestedPermissions.length; i++) {  
133 - }  
134 -// Log.e("i", "" + packageInfo.requestedPermissions[i]);  
135 - } catch (PackageManager.NameNotFoundException e) {  
136 - e.printStackTrace();  
137 - }  
138 -  
139 super.onResume(); 131 super.onResume();
140 check(); 132 check();
141 -//  
142 getPermissionsWithTip(); 133 getPermissionsWithTip();
143 } 134 }
144 135
145 - private void addFragment() {  
146 - fragment = new RunMainFragment(); 136 + private void addFragment(String startPointAdd, String endPointAdd, List<LatLng> importStreetPoints) {
  137 + fragment = RunMainFragment.newInstance(startPointAdd, endPointAdd, importStreetPoints);
147 getSupportFragmentManager().beginTransaction() 138 getSupportFragmentManager().beginTransaction()
148 .add(getContextViewId(), fragment, fragment.getClass().getSimpleName()) 139 .add(getContextViewId(), fragment, fragment.getClass().getSimpleName())
149 .addToBackStack(fragment.getClass().getSimpleName()) 140 .addToBackStack(fragment.getClass().getSimpleName())
@@ -174,7 +165,9 @@ public class PedometerMainActivity extends QMUIFragmentActivity { @@ -174,7 +165,9 @@ public class PedometerMainActivity extends QMUIFragmentActivity {
174 Toast.makeText(getApplicationContext(), getString(R.string.open_gps_tip), Toast.LENGTH_LONG).show(); 165 Toast.makeText(getApplicationContext(), getString(R.string.open_gps_tip), Toast.LENGTH_LONG).show();
175 } else { 166 } else {
176 if (getCurrentFragment() == null) { 167 if (getCurrentFragment() == null) {
177 - addFragment(); 168 + if (!TextUtils.isEmpty(startPointAdd) && !TextUtils.isEmpty(endPointAdd) && importStreetPoints != null) {
  169 + addFragment(startPointAdd, endPointAdd, importStreetPoints);
  170 + }
178 } 171 }
179 } 172 }
180 } 173 }
@@ -220,8 +213,11 @@ public class PedometerMainActivity extends QMUIFragmentActivity { @@ -220,8 +213,11 @@ public class PedometerMainActivity extends QMUIFragmentActivity {
220 return; 213 return;
221 } 214 }
222 215
223 - public static void startActivity(Activity activity) { 216 + public static void startActivity(Activity activity, String startPointAdd, String endPointAdd, List<LatLng> importStreetPoints) {
224 Intent intent = new Intent(activity, PedometerMainActivity.class); 217 Intent intent = new Intent(activity, PedometerMainActivity.class);
  218 + intent.putExtra("startPointAdd", startPointAdd);
  219 + intent.putExtra("endPointAdd", endPointAdd);
  220 + intent.putExtra("importStreetPoints", (Serializable) importStreetPoints);
225 activity.startActivity(intent); 221 activity.startActivity(intent);
226 } 222 }
227 } 223 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/activity/RunRaceDetailActivity.java
1 package com.cnlive.moudle.pedometer.ui.activity; 1 package com.cnlive.moudle.pedometer.ui.activity;
2 2
  3 +import android.Manifest;
3 import android.app.Activity; 4 import android.app.Activity;
4 import android.content.Context; 5 import android.content.Context;
5 import android.content.Intent; 6 import android.content.Intent;
6 import android.os.Bundle; 7 import android.os.Bundle;
  8 +import android.provider.Settings;
  9 +import android.support.annotation.NonNull;
7 import android.support.annotation.Nullable; 10 import android.support.annotation.Nullable;
8 import android.support.design.widget.BottomSheetDialog; 11 import android.support.design.widget.BottomSheetDialog;
  12 +import android.text.TextUtils;
  13 +import android.util.Log;
9 import android.view.View; 14 import android.view.View;
10 import android.widget.FrameLayout; 15 import android.widget.FrameLayout;
  16 +import android.widget.Toast;
11 17
12 import com.alibaba.android.arouter.facade.annotation.Route; 18 import com.alibaba.android.arouter.facade.annotation.Route;
13 import com.baidu.mapapi.CoordType; 19 import com.baidu.mapapi.CoordType;
@@ -23,7 +29,10 @@ import com.cnlive.moudle.pedometer.ui.fragment.RunMainFragment; @@ -23,7 +29,10 @@ import com.cnlive.moudle.pedometer.ui.fragment.RunMainFragment;
23 import com.cnlive.moudle.pedometer.ui.fragment.RunRaceDetailFragment; 29 import com.cnlive.moudle.pedometer.ui.fragment.RunRaceDetailFragment;
24 import com.cnlive.moudle.pedometer.ui.fragment.RunningMapFragment; 30 import com.cnlive.moudle.pedometer.ui.fragment.RunningMapFragment;
25 import com.cnlive.moudle.pedometer.ui.widget.FivePersonIconView; 31 import com.cnlive.moudle.pedometer.ui.widget.FivePersonIconView;
  32 +import com.cnlive.moudle.pedometer.utils.MyMapUtil;
26 import com.cnlive.moudle.pedometer.utils.StepUtil; 33 import com.cnlive.moudle.pedometer.utils.StepUtil;
  34 +import com.cnlive.moudle.pedometer.utils.lib_permisshelper.PermissionsListener;
  35 +import com.cnlive.moudle.pedometer.utils.lib_permisshelper.PermissionsUtils;
27 import com.example.moudle_pedometer.R; 36 import com.example.moudle_pedometer.R;
28 37
29 import java.util.ArrayList; 38 import java.util.ArrayList;
@@ -37,14 +46,15 @@ import java.util.List; @@ -37,14 +46,15 @@ import java.util.List;
37 @Route(path = "/moudle_pedometer/CollRunRaceDetailActivity") 46 @Route(path = "/moudle_pedometer/CollRunRaceDetailActivity")
38 public class RunRaceDetailActivity extends QMUIFragmentActivity { 47 public class RunRaceDetailActivity extends QMUIFragmentActivity {
39 private QMUIFragment fragment; 48 private QMUIFragment fragment;
  49 + private PermissionsUtils mPermissionsUtils = new PermissionsUtils();//权限申请
40 50
41 - public static void startActivity(Activity activity, String eventId,String userId,String userIcon,String userName,String userPhone) { 51 + public static void startActivity(Activity activity, String eventId, String userId, String userIcon, String userName, String userPhone) {
42 Intent intent = new Intent(activity, RunRaceDetailActivity.class); 52 Intent intent = new Intent(activity, RunRaceDetailActivity.class);
43 intent.putExtra("eventId", eventId); 53 intent.putExtra("eventId", eventId);
44 - intent.putExtra("userId",userId);  
45 - intent.putExtra("userIcon",userIcon);  
46 - intent.putExtra("userName",userName);  
47 - intent.putExtra("userPhone",userPhone); 54 + intent.putExtra("userId", userId);
  55 + intent.putExtra("userIcon", userIcon);
  56 + intent.putExtra("userName", userName);
  57 + intent.putExtra("userPhone", userPhone);
48 CommonInfo.setStreetId(activity, eventId); 58 CommonInfo.setStreetId(activity, eventId);
49 activity.startActivity(intent); 59 activity.startActivity(intent);
50 } 60 }
@@ -58,25 +68,29 @@ public class RunRaceDetailActivity extends QMUIFragmentActivity { @@ -58,25 +68,29 @@ public class RunRaceDetailActivity extends QMUIFragmentActivity {
58 protected void onCreate(Bundle savedInstanceState) { 68 protected void onCreate(Bundle savedInstanceState) {
59 super.onCreate(savedInstanceState); 69 super.onCreate(savedInstanceState);
60 70
61 - if(getIntent().getStringExtra("userId") != null){  
62 - CommonInfo.setUserId(this,getIntent().getStringExtra("userId"));  
63 - CommonInfo.setUserNickName(this,getIntent().getStringExtra("userName"));  
64 - CommonInfo.setUserIcon(this,getIntent().getStringExtra("userIcon"));  
65 - CommonInfo.setUserPhone(this,getIntent().getStringExtra("userPhone")); 71 + if (getIntent().getStringExtra("userId") != null) {
  72 + CommonInfo.setUserId(this, getIntent().getStringExtra("userId"));
  73 + CommonInfo.setUserNickName(this, getIntent().getStringExtra("userName"));
  74 + CommonInfo.setUserIcon(this, getIntent().getStringExtra("userIcon"));
  75 + CommonInfo.setUserPhone(this, getIntent().getStringExtra("userPhone"));
66 } 76 }
67 //判断用户是否结束运动 77 //判断用户是否结束运动
68 // boolean isRunStep = CommonInfo.getIsRunStepService(this); 78 // boolean isRunStep = CommonInfo.getIsRunStepService(this);
69 // //没有找到相关记录 79 // //没有找到相关记录
70 // if (!isRunStep) { 80 // if (!isRunStep) {
71 - fragment = new RunRaceDetailFragment(); 81 + fragment = new RunRaceDetailFragment();
72 // } 82 // }
73 // //找到记录 83 // //找到记录
74 // else { 84 // else {
75 // fragment = new RunMainFragment(); 85 // fragment = new RunMainFragment();
76 // } 86 // }
77 - if (fragment != null) {  
78 - addFragment(fragment);  
79 - } 87 +
  88 + }
  89 +
  90 + @Override
  91 + protected void onResume() {
  92 + super.onResume();
  93 + getPermissionsWithTip();
80 } 94 }
81 95
82 private void addFragment(QMUIFragment fragment) { 96 private void addFragment(QMUIFragment fragment) {
@@ -89,10 +103,72 @@ public class RunRaceDetailActivity extends QMUIFragmentActivity { @@ -89,10 +103,72 @@ public class RunRaceDetailActivity extends QMUIFragmentActivity {
89 @Override 103 @Override
90 public void onBackPressed() { 104 public void onBackPressed() {
91 super.onBackPressed(); 105 super.onBackPressed();
92 - if (getCurrentFragment()!=null) { 106 + if (getCurrentFragment() != null) {
93 if (getCurrentFragment() instanceof RunMainFragment) { 107 if (getCurrentFragment() instanceof RunMainFragment) {
94 return; 108 return;
95 } 109 }
96 } 110 }
97 } 111 }
  112 +
  113 + /**
  114 + * 一次申请一组权限(使用拒绝弹框)点击事件
  115 + */
  116 + public void getPermissionsWithTip() {
  117 + mPermissionsUtils
  118 + .setPermissionsListener(new PermissionsListener() {
  119 + @Override
  120 + public void onDenied(String[] deniedPermissions) {
  121 + getPermissionsWithTip();
  122 + }
  123 +
  124 + @Override
  125 + public void onGranted() {
  126 + //判断GPS是否开启
  127 + if (!MyMapUtil.isOPenGps(getApplicationContext())) {
  128 + //开启GPS
  129 + Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
  130 + startActivityForResult(intent, 10);
  131 + Toast.makeText(getApplicationContext(), getString(R.string.open_gps_tip), Toast.LENGTH_LONG).show();
  132 + } else {
  133 + if (getCurrentFragment() == null) {
  134 + if (fragment != null) {
  135 + addFragment(fragment);
  136 + }
  137 + }
  138 + }
  139 + }
  140 + })
  141 + .withActivity(RunRaceDetailActivity.this)
  142 + .getPermissions(RunRaceDetailActivity.this
  143 + , 100
  144 + , Manifest.permission.INTERNET
  145 + , Manifest.permission.READ_EXTERNAL_STORAGE
  146 + , Manifest.permission.WRITE_EXTERNAL_STORAGE
  147 + , Manifest.permission.ACCESS_FINE_LOCATION
  148 + , Manifest.permission.ACCESS_COARSE_LOCATION
  149 + );
  150 +// .getPermissionsWithTips(MainActivity.this
  151 +// ,100
  152 +// , new String[]{"人家要录音","我们需要读取你的信息,磨磨唧唧的","我要上网","我要读内存卡","我要看日历","我要定位"}
  153 +// , Manifest.permission.RECORD_AUDIO
  154 +// , Manifest.permission.READ_SMS
  155 +// , Manifest.permission.INTERNET
  156 +// , Manifest.permission.READ_EXTERNAL_STORAGE
  157 +// , Manifest.permission.READ_CALENDAR
  158 +// , Manifest.permission.ACCESS_FINE_LOCATION);
  159 + }
  160 +
  161 + /**
  162 + * 权限回调
  163 + *
  164 + * @param requestCode
  165 + * @param permissions
  166 + * @param grantResults
  167 + */
  168 + @Override
  169 + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
  170 + @NonNull int[] grantResults) {
  171 + super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  172 + mPermissionsUtils.dealResult(requestCode, permissions, grantResults);
  173 + }
98 } 174 }
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/fragment/RunMainFragment.java
@@ -7,6 +7,7 @@ import android.text.TextUtils; @@ -7,6 +7,7 @@ import android.text.TextUtils;
7 import android.util.Log; 7 import android.util.Log;
8 import android.view.View; 8 import android.view.View;
9 9
  10 +import com.baidu.mapapi.model.LatLng;
10 import com.cnlive.libs.base.ui.QMUIFragment; 11 import com.cnlive.libs.base.ui.QMUIFragment;
11 import com.cnlive.libs.base.util.StatusBarUtil; 12 import com.cnlive.libs.base.util.StatusBarUtil;
12 import com.cnlive.libs.base.util.StatusBarUtil2; 13 import com.cnlive.libs.base.util.StatusBarUtil2;
@@ -16,6 +17,7 @@ import com.cnlive.moudle.pedometer.frame.view.RunMainFragmentView; @@ -16,6 +17,7 @@ import com.cnlive.moudle.pedometer.frame.view.RunMainFragmentView;
16 import com.cnlive.moudle.pedometer.model.Constant; 17 import com.cnlive.moudle.pedometer.model.Constant;
17 import com.cnlive.moudle.pedometer.model.MessageEvent; 18 import com.cnlive.moudle.pedometer.model.MessageEvent;
18 import com.cnlive.moudle.pedometer.sql.entity.UserStepEntity; 19 import com.cnlive.moudle.pedometer.sql.entity.UserStepEntity;
  20 +import com.cnlive.moudle.pedometer.utils.GsonUtil;
19 import com.cnlive.moudle.pedometer.utils.StepUtil; 21 import com.cnlive.moudle.pedometer.utils.StepUtil;
20 import com.example.moudle_pedometer.R; 22 import com.example.moudle_pedometer.R;
21 import com.example.moudle_pedometer.databinding.FragmentRunMainBinding; 23 import com.example.moudle_pedometer.databinding.FragmentRunMainBinding;
@@ -25,9 +27,25 @@ import org.greenrobot.eventbus.EventBus; @@ -25,9 +27,25 @@ import org.greenrobot.eventbus.EventBus;
25 import org.greenrobot.eventbus.Subscribe; 27 import org.greenrobot.eventbus.Subscribe;
26 import org.greenrobot.eventbus.ThreadMode; 28 import org.greenrobot.eventbus.ThreadMode;
27 29
  30 +import java.io.Serializable;
  31 +import java.util.List;
  32 +
28 public class RunMainFragment extends QMUIFragment<RunMainFragmentView, RunMainFragmentPresenter, FragmentRunMainBinding> { 33 public class RunMainFragment extends QMUIFragment<RunMainFragmentView, RunMainFragmentPresenter, FragmentRunMainBinding> {
29 private final String TAG = "CollRunMainFragment"; 34 private final String TAG = "CollRunMainFragment";
30 private String userId = "yangshuai"; 35 private String userId = "yangshuai";
  36 + private String startPointAdd;
  37 + private String endPointAdd;
  38 + private List<LatLng> importStreetPoints;
  39 +
  40 + public static RunMainFragment newInstance(String startPointAdd, String endPointAdd, List<LatLng> importStreetPoints) {
  41 + Bundle bundle = new Bundle();
  42 + bundle.putString("startPointAdd", startPointAdd);
  43 + bundle.putString("endPointAdd", endPointAdd);
  44 + bundle.putSerializable("importStreetPoints", (Serializable) importStreetPoints);
  45 + RunMainFragment fragment = new RunMainFragment();
  46 + fragment.setArguments(bundle);
  47 + return fragment;
  48 + }
31 49
32 @Override 50 @Override
33 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 51 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
@@ -35,6 +53,26 @@ public class RunMainFragment extends QMUIFragment&lt;RunMainFragmentView, RunMainFr @@ -35,6 +53,26 @@ public class RunMainFragment extends QMUIFragment&lt;RunMainFragmentView, RunMainFr
35 QMUIStatusBarHelper.setStatusBarDarkMode(getActivity()); 53 QMUIStatusBarHelper.setStatusBarDarkMode(getActivity());
36 StatusBarUtil2.setColor(getActivity(), getResources().getColor(R.color.run_main_bg), 0); 54 StatusBarUtil2.setColor(getActivity(), getResources().getColor(R.color.run_main_bg), 0);
37 EventBus.getDefault().register(this); 55 EventBus.getDefault().register(this);
  56 + if (getArguments() != null) {
  57 + startPointAdd = getArguments().getString("startPointAdd");
  58 + endPointAdd = getArguments().getString("endPointAdd");
  59 + importStreetPoints = (List<LatLng>) getArguments().getSerializable("importStreetPoints");
  60 + UserStepEntity userStepEntity = StepUtil.getUserStepData(getActivity(), CommonInfo.getUserId(getActivity()));
  61 + if (userStepEntity != null) {
  62 + if (!TextUtils.isEmpty(startPointAdd) && !TextUtils.isEmpty(endPointAdd)) {
  63 + userStepEntity.setStartPoint(startPointAdd);
  64 + userStepEntity.setEndPoint(endPointAdd);
  65 + //更新数据
  66 + StepUtil.updateStepData(getActivity(), userStepEntity);
  67 + }
  68 + //获取数据库中的重要点
  69 + String importStr = userStepEntity.getImportPoint();
  70 + if (TextUtils.isEmpty(importStr) && importStreetPoints != null) {
  71 + //设置重要点
  72 + StepUtil.setImportPoints(getActivity(), CommonInfo.getUserId(getActivity()), GsonUtil.GsonString(importStreetPoints));
  73 + }
  74 + }
  75 + }
38 if (getMvpView() != null) { 76 if (getMvpView() != null) {
39 new Handler().postDelayed(new Runnable() { 77 new Handler().postDelayed(new Runnable() {
40 @Override 78 @Override
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/fragment/RunRaceDetailFragment.java
@@ -3,31 +3,20 @@ package com.cnlive.moudle.pedometer.ui.fragment; @@ -3,31 +3,20 @@ package com.cnlive.moudle.pedometer.ui.fragment;
3 import android.hardware.Sensor; 3 import android.hardware.Sensor;
4 import android.hardware.SensorManager; 4 import android.hardware.SensorManager;
5 import android.os.Bundle; 5 import android.os.Bundle;
6 -import android.support.annotation.NonNull;  
7 import android.support.annotation.Nullable; 6 import android.support.annotation.Nullable;
8 -import android.support.design.widget.BottomSheetBehavior;  
9 -import android.support.design.widget.BottomSheetDialog;  
10 import android.text.TextUtils; 7 import android.text.TextUtils;
11 import android.util.Log; 8 import android.util.Log;
12 import android.view.View; 9 import android.view.View;
13 -import android.widget.FrameLayout;  
14 -import android.widget.LinearLayout;  
15 10
16 import com.cnlive.libs.base.ui.QMUIFragment; 11 import com.cnlive.libs.base.ui.QMUIFragment;
17 import com.cnlive.libs.base.util.StatusBarUtil2; 12 import com.cnlive.libs.base.util.StatusBarUtil2;
18 -import com.cnlive.moudle.collectionTrace.ui.activity.CollPedometerMainActivity;  
19 import com.cnlive.moudle.pedometer.commonInfo.CommonInfo; 13 import com.cnlive.moudle.pedometer.commonInfo.CommonInfo;
20 import com.cnlive.moudle.pedometer.frame.presenter.RunRaceDetailFragmentPresenter; 14 import com.cnlive.moudle.pedometer.frame.presenter.RunRaceDetailFragmentPresenter;
21 import com.cnlive.moudle.pedometer.frame.view.RunRaceDetailFragmentView; 15 import com.cnlive.moudle.pedometer.frame.view.RunRaceDetailFragmentView;
22 import com.cnlive.moudle.pedometer.model.Constant; 16 import com.cnlive.moudle.pedometer.model.Constant;
23 import com.cnlive.moudle.pedometer.model.MessageEvent; 17 import com.cnlive.moudle.pedometer.model.MessageEvent;
24 -import com.cnlive.moudle.pedometer.sql.entity.UserStepEntity;  
25 import com.cnlive.moudle.pedometer.ui.activity.PedometerMainActivity; 18 import com.cnlive.moudle.pedometer.ui.activity.PedometerMainActivity;
26 -import com.cnlive.moudle.pedometer.ui.widget.FivePersonIconView;  
27 -import com.cnlive.moudle.pedometer.utils.ChineseToSpeechUtil;  
28 import com.cnlive.moudle.pedometer.utils.QMUITipDialogUtil; 19 import com.cnlive.moudle.pedometer.utils.QMUITipDialogUtil;
29 -import com.cnlive.moudle.pedometer.utils.ScreenUtil;  
30 -import com.cnlive.moudle.pedometer.utils.StepUtil;  
31 import com.example.moudle_pedometer.R; 20 import com.example.moudle_pedometer.R;
32 import com.example.moudle_pedometer.databinding.FragmentRunRaceDetailBinding; 21 import com.example.moudle_pedometer.databinding.FragmentRunRaceDetailBinding;
33 import com.qmuiteam.qmui.util.QMUIStatusBarHelper; 22 import com.qmuiteam.qmui.util.QMUIStatusBarHelper;
@@ -37,8 +26,6 @@ import org.greenrobot.eventbus.EventBus; @@ -37,8 +26,6 @@ import org.greenrobot.eventbus.EventBus;
37 import org.greenrobot.eventbus.Subscribe; 26 import org.greenrobot.eventbus.Subscribe;
38 import org.greenrobot.eventbus.ThreadMode; 27 import org.greenrobot.eventbus.ThreadMode;
39 28
40 -import java.util.ArrayList;  
41 -import java.util.List;  
42 29
43 import static android.content.Context.SENSOR_SERVICE; 30 import static android.content.Context.SENSOR_SERVICE;
44 31
@@ -48,7 +35,7 @@ import static android.content.Context.SENSOR_SERVICE; @@ -48,7 +35,7 @@ import static android.content.Context.SENSOR_SERVICE;
48 * @author ShinnyYang 35 * @author ShinnyYang
49 */ 36 */
50 public class RunRaceDetailFragment extends QMUIFragment<RunRaceDetailFragmentView, RunRaceDetailFragmentPresenter, FragmentRunRaceDetailBinding> { 37 public class RunRaceDetailFragment extends QMUIFragment<RunRaceDetailFragmentView, RunRaceDetailFragmentPresenter, FragmentRunRaceDetailBinding> {
51 - private static final String TAG = "CollRunRaceDetailFragment"; 38 + private static final String TAG = "RunRaceFragment";
52 private SensorManager mSensorManager; 39 private SensorManager mSensorManager;
53 40
54 @Override 41 @Override
@@ -78,8 +65,9 @@ public class RunRaceDetailFragment extends QMUIFragment&lt;RunRaceDetailFragmentVie @@ -78,8 +65,9 @@ public class RunRaceDetailFragment extends QMUIFragment&lt;RunRaceDetailFragmentVie
78 getMvpView().initMap(); 65 getMvpView().initMap();
79 } 66 }
80 if (getPresenter() != null) { 67 if (getPresenter() != null) {
81 - if (!TextUtils.isEmpty(CommonInfo.getStreetId(getActivity()))) 68 + if (!TextUtils.isEmpty(CommonInfo.getStreetId(getActivity()))) {
82 getPresenter().getRunRaceDetailInfo(getActivity(), CommonInfo.getStreetId(getActivity()), CommonInfo.getUserId(getActivity()), "0"); 69 getPresenter().getRunRaceDetailInfo(getActivity(), CommonInfo.getStreetId(getActivity()), CommonInfo.getUserId(getActivity()), "0");
  70 + }
83 } 71 }
84 72
85 } 73 }
@@ -189,8 +177,9 @@ public class RunRaceDetailFragment extends QMUIFragment&lt;RunRaceDetailFragmentVie @@ -189,8 +177,9 @@ public class RunRaceDetailFragment extends QMUIFragment&lt;RunRaceDetailFragmentVie
189 //启动鹰眼成功 177 //启动鹰眼成功
190 if (messageEvent.getMessageType() == Constant.START_TRACE_GATHER_SUCCESS) { 178 if (messageEvent.getMessageType() == Constant.START_TRACE_GATHER_SUCCESS) {
191 if (getMvpView() != null) { 179 if (getMvpView() != null) {
  180 + Log.e(TAG, "跳转: " + getMvpView().importStreetPoints.size());
192 QMUITipDialogUtil.dismessDialog(); 181 QMUITipDialogUtil.dismessDialog();
193 - PedometerMainActivity.startActivity(getActivity()); 182 + PedometerMainActivity.startActivity(getActivity(), binding.includeStreet.tvStartAddr.getText().toString(), binding.includeStreet.tvEndAddr.getText().toString(), getMvpView().importStreetPoints);
194 } 183 }
195 } 184 }
196 //启动鹰眼失败 185 //启动鹰眼失败
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/fragment/RunningFinishFragment.java
1 package com.cnlive.moudle.pedometer.ui.fragment; 1 package com.cnlive.moudle.pedometer.ui.fragment;
2 2
3 import android.os.Bundle; 3 import android.os.Bundle;
  4 +import android.os.Handler;
4 import android.support.annotation.Nullable; 5 import android.support.annotation.Nullable;
5 import android.view.View; 6 import android.view.View;
6 7
@@ -9,6 +10,8 @@ import com.cnlive.moudle.pedometer.commonInfo.CommonInfo; @@ -9,6 +10,8 @@ import com.cnlive.moudle.pedometer.commonInfo.CommonInfo;
9 import com.cnlive.moudle.pedometer.frame.presenter.RunningFinishFragmetPresenter; 10 import com.cnlive.moudle.pedometer.frame.presenter.RunningFinishFragmetPresenter;
10 import com.cnlive.moudle.pedometer.frame.view.RunningFinishFragmentView; 11 import com.cnlive.moudle.pedometer.frame.view.RunningFinishFragmentView;
11 import com.cnlive.moudle.pedometer.model.RunningFinishBean; 12 import com.cnlive.moudle.pedometer.model.RunningFinishBean;
  13 +import com.cnlive.moudle.pedometer.sql.entity.UserStepEntity;
  14 +import com.cnlive.moudle.pedometer.utils.QMUITipDialogUtil;
12 import com.cnlive.moudle.pedometer.utils.StepUtil; 15 import com.cnlive.moudle.pedometer.utils.StepUtil;
13 import com.example.moudle_pedometer.R; 16 import com.example.moudle_pedometer.R;
14 import com.example.moudle_pedometer.databinding.FragmentFinishRunMapBinding; 17 import com.example.moudle_pedometer.databinding.FragmentFinishRunMapBinding;
@@ -45,9 +48,6 @@ public class RunningFinishFragment extends QMUIFragment&lt;RunningFinishFragmentVie @@ -45,9 +48,6 @@ public class RunningFinishFragment extends QMUIFragment&lt;RunningFinishFragmentVie
45 @Override 48 @Override
46 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 49 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
47 super.onViewCreated(view, savedInstanceState); 50 super.onViewCreated(view, savedInstanceState);
48 - StepUtil.clearRunData(getActivity(), CommonInfo.getUserId(getActivity()));  
49 - //todo测试用  
50 - CommonInfo.reset(getActivity());  
51 if (getArguments() != null) { 51 if (getArguments() != null) {
52 runningFinishBean = (RunningFinishBean) getArguments().getSerializable("runningFinishBean"); 52 runningFinishBean = (RunningFinishBean) getArguments().getSerializable("runningFinishBean");
53 if (runningFinishBean != null) { 53 if (runningFinishBean != null) {
@@ -56,6 +56,20 @@ public class RunningFinishFragment extends QMUIFragment&lt;RunningFinishFragmentVie @@ -56,6 +56,20 @@ public class RunningFinishFragment extends QMUIFragment&lt;RunningFinishFragmentVie
56 } 56 }
57 } 57 }
58 } 58 }
  59 + UserStepEntity userStepEntity = StepUtil.getUserStepData(getActivity(), CommonInfo.getUserId(getActivity()));
  60 + if (getMvpView() != null && userStepEntity != null) {
  61 + QMUITipDialogUtil.loadingDialog(getContext(), "正在获取轨迹信息,请稍后", false);
  62 + getPresenter().getServerStreetTrace(getActivity(), userStepEntity);
  63 + new Handler().postDelayed(new Runnable() {
  64 + @Override
  65 + public void run() {
  66 + getPresenter().queryHistoryTrace(getActivity(), userStepEntity, runningFinishBean);
  67 + }
  68 + },2000);
  69 +// StepUtil.clearRunData(context, CommonInfo.getUserId(context));
  70 +// CommonInfo.reset(context);
  71 + }
  72 +
59 } 73 }
60 74
61 /** 75 /**
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/fragment/RunningMapFragment.java
@@ -23,11 +23,13 @@ import com.cnlive.moudle.pedometer.model.RunningMapBean; @@ -23,11 +23,13 @@ import com.cnlive.moudle.pedometer.model.RunningMapBean;
23 import com.cnlive.moudle.pedometer.model.Constant; 23 import com.cnlive.moudle.pedometer.model.Constant;
24 import com.cnlive.moudle.pedometer.model.MessageEvent; 24 import com.cnlive.moudle.pedometer.model.MessageEvent;
25 import com.cnlive.moudle.pedometer.service.StepService; 25 import com.cnlive.moudle.pedometer.service.StepService;
  26 +import com.cnlive.moudle.pedometer.sql.entity.UserStepEntity;
26 import com.cnlive.moudle.pedometer.ui.widget.TipDialog; 27 import com.cnlive.moudle.pedometer.ui.widget.TipDialog;
27 import com.cnlive.moudle.pedometer.utils.ChineseToSpeechUtil; 28 import com.cnlive.moudle.pedometer.utils.ChineseToSpeechUtil;
28 import com.cnlive.moudle.pedometer.utils.GsonUtil; 29 import com.cnlive.moudle.pedometer.utils.GsonUtil;
29 import com.cnlive.moudle.pedometer.utils.MyMapUtil; 30 import com.cnlive.moudle.pedometer.utils.MyMapUtil;
30 import com.cnlive.moudle.pedometer.utils.MySpHelper; 31 import com.cnlive.moudle.pedometer.utils.MySpHelper;
  32 +import com.cnlive.moudle.pedometer.utils.StepUtil;
31 import com.cnlive.moudle.pedometer.utils.TimeUtil; 33 import com.cnlive.moudle.pedometer.utils.TimeUtil;
32 import com.example.moudle_pedometer.R; 34 import com.example.moudle_pedometer.R;
33 import com.example.moudle_pedometer.databinding.FragmentRunningMapBinding; 35 import com.example.moudle_pedometer.databinding.FragmentRunningMapBinding;
@@ -47,7 +49,7 @@ import static android.content.Context.SENSOR_SERVICE; @@ -47,7 +49,7 @@ import static android.content.Context.SENSOR_SERVICE;
47 * @author ShinnyYang 49 * @author ShinnyYang
48 */ 50 */
49 public class RunningMapFragment extends QMUIFragment<RunningMapFragmentView, RunningMapFragmentPresenter, FragmentRunningMapBinding> { 51 public class RunningMapFragment extends QMUIFragment<RunningMapFragmentView, RunningMapFragmentPresenter, FragmentRunningMapBinding> {
50 - private static final String TAG = "CollRunningMapFragment"; 52 + private static final String TAG = "RunningMapFragment";
51 private RunningMapBean runningMapBean; 53 private RunningMapBean runningMapBean;
52 private SensorManager mSensorManager; 54 private SensorManager mSensorManager;
53 private String test = "[{\"latitude\":39.933889208848,\"latitudeE6\":3.9933889208848E7,\"longitude\":116.30900265517,\"longitudeE6\":1.1630900265517001E8},{\"latitude\":39.933868507347,\"latitudeE6\":3.9933868507347E7,\"longitude\":116.30865416508,\"longitudeE6\":1.1630865416508E8},{\"latitude\":39.934756505077,\"latitudeE6\":3.9934756505077E7,\"longitude\":116.30860516469,\"longitudeE6\":1.1630860516468999E8},{\"latitude\":39.934781620502,\"latitudeE6\":3.9934781620502E7,\"longitude\":116.30961013007,\"longitudeE6\":1.1630961013007E8},{\"latitude\":39.934881620374,\"latitudeE6\":3.9934881620374E7,\"longitude\":116.30960513008,\"longitudeE6\":1.1630960513008E8},{\"latitude\":39.934077623132,\"latitudeE6\":3.9934077623132E7,\"longitude\":116.30965812942,\"longitudeE6\":1.1630965812942E8},{\"latitude\":39.933972618463,\"latitudeE6\":3.9933972618463E7,\"longitude\":116.30962113087,\"longitudeE6\":1.1630962113087E8},{\"latitude\":39.933932608856,\"latitudeE6\":3.9933932608856E7,\"longitude\":116.30953913383,\"longitudeE6\":1.1630953913383E8}]"; 55 private String test = "[{\"latitude\":39.933889208848,\"latitudeE6\":3.9933889208848E7,\"longitude\":116.30900265517,\"longitudeE6\":1.1630900265517001E8},{\"latitude\":39.933868507347,\"latitudeE6\":3.9933868507347E7,\"longitude\":116.30865416508,\"longitudeE6\":1.1630865416508E8},{\"latitude\":39.934756505077,\"latitudeE6\":3.9934756505077E7,\"longitude\":116.30860516469,\"longitudeE6\":1.1630860516468999E8},{\"latitude\":39.934781620502,\"latitudeE6\":3.9934781620502E7,\"longitude\":116.30961013007,\"longitudeE6\":1.1630961013007E8},{\"latitude\":39.934881620374,\"latitudeE6\":3.9934881620374E7,\"longitude\":116.30960513008,\"longitudeE6\":1.1630960513008E8},{\"latitude\":39.934077623132,\"latitudeE6\":3.9934077623132E7,\"longitude\":116.30965812942,\"longitudeE6\":1.1630965812942E8},{\"latitude\":39.933972618463,\"latitudeE6\":3.9933972618463E7,\"longitude\":116.30962113087,\"longitudeE6\":1.1630962113087E8},{\"latitude\":39.933932608856,\"latitudeE6\":3.9933932608856E7,\"longitude\":116.30953913383,\"longitudeE6\":1.1630953913383E8}]";
@@ -96,45 +98,33 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run @@ -96,45 +98,33 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run
96 mVibrator = (Vibrator) getActivity().getSystemService(Service.VIBRATOR_SERVICE); 98 mVibrator = (Vibrator) getActivity().getSystemService(Service.VIBRATOR_SERVICE);
97 //初始化提示框 99 //初始化提示框
98 initTipDialog(); 100 initTipDialog();
99 - List<LatLng> trackPoints = GsonUtil.jsonToList(test, LatLng.class);  
100 - 101 + getMvpView().initView();
101 if (getArguments() != null) { 102 if (getArguments() != null) {
102 runningMapBean = (RunningMapBean) getArguments().getSerializable("runningMapBean"); 103 runningMapBean = (RunningMapBean) getArguments().getSerializable("runningMapBean");
103 } 104 }
104 - if (getMvpView() != null) {  
105 - getMvpView().initView(trackPoints);  
106 - if (runningMapBean != null) {  
107 - getMvpView().updateChronometer(runningMapBean);  
108 - } 105 + if (runningMapBean != null) {
  106 + getMvpView().updateChronometer(runningMapBean);
109 } 107 }
110 - //开始进行历史轨迹查询  
111 - if (getPresenter() != null && !TextUtils.isEmpty(StepService.entityName)) {  
112 - long stepStartTime = 0;  
113 -// CommonInfo.getStepStartTime(getActivity());  
114 - Log.e(TAG, "onViewCreated: 时间"+stepStartTime );  
115 - long startTime = 0;  
116 -// if (stepStartTime != 0) {  
117 -// startTime = stepStartTime;  
118 -// } else {  
119 - startTime = (int) (System.currentTimeMillis() / 1000 -12);  
120 -// }  
121 - long current = TimeUtil.getNowTimeStamp();  
122 -// long startTime = current - hour * 3600 * 1000 - minute * 60 * 1000 - second * 1000;  
123 - long endTime = current;  
124 -// Log.e(TAG, "onViewCreated: " + "hour:" + hour + ",minute" + minute + ",second:" + second);  
125 - getPresenter().queryHistoryTrace(getActivity(), StepService.entityName, startTime, endTime);  
126 108
  109 + UserStepEntity userStepEntity = StepUtil.getUserStepData(getActivity(), CommonInfo.getUserId(getActivity()));
  110 + if (getMvpView() != null && userStepEntity != null) {
  111 + //查询运营人员踩得轨迹
  112 + getPresenter().getServerStreetTrace(getActivity(), userStepEntity);
  113 +
  114 + //开始查询
  115 + getPresenter().queryHistoryTrace(getActivity(), userStepEntity);
127 } 116 }
128 117
129 118
130 - List<com.baidu.trace.model.LatLng> fenceLatLngs = new ArrayList<>();  
131 - for (LatLng latLng : trackPoints) {  
132 - com.baidu.trace.model.LatLng tempLatLng = new com.baidu.trace.model.LatLng(latLng.latitude, latLng.longitude);  
133 - fenceLatLngs.add(tempLatLng);  
134 - } 119 +// List<com.baidu.trace.model.LatLng> fenceLatLngs = new ArrayList<>();
  120 +// for (LatLng latLng : trackPoints) {
  121 +// com.baidu.trace.model.LatLng tempLatLng = new com.baidu.trace.model.LatLng(latLng.latitude, latLng.longitude);
  122 +// fenceLatLngs.add(tempLatLng);
  123 +// }
135 // getPresenter().createFence(getActivity(), fenceLatLngs); 124 // getPresenter().createFence(getActivity(), fenceLatLngs);
136 } 125 }
137 126
  127 +
138 @Override 128 @Override
139 public void onResume() { 129 public void onResume() {
140 super.onResume(); 130 super.onResume();
@@ -232,6 +222,7 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run @@ -232,6 +222,7 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run
232 tipDialog.setCanceledOnTouchOutside(false); 222 tipDialog.setCanceledOnTouchOutside(false);
233 } 223 }
234 } 224 }
  225 +
235 /** 226 /**
236 * 屏蔽边缘返回 227 * 屏蔽边缘返回
237 * 杨帅 228 * 杨帅
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/upload/UploadLogic.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.upload;
  2 +
  3 +import android.content.Context;
  4 +import android.media.MediaMetadataRetriever;
  5 +import android.os.Environment;
  6 +import android.text.TextUtils;
  7 +import android.util.Log;
  8 +
  9 +import com.cnlive.libs.base.application.AppConfig;
  10 +import com.cnlive.libs.base.logic.Config;
  11 +import com.cnlive.libs.base.logic.Event;
  12 +import com.cnlive.libs.base.logic.Logic;
  13 +import com.cnlive.libs.base.logic.callback.DataCallback;
  14 +import com.cnlive.libs.base.util.ShareReleaseInfoUtil;
  15 +import com.cnlive.libs.base.util.StringUtils;
  16 +import com.cnlive.moudle.pedometer.net.SubscriptionRequest;
  17 +import com.cnlive.moudle.pedometer.net.bean.BaseInfo;
  18 +import com.cnlive.moudle.pedometer.net.bean.upload.FeedBackInfo;
  19 +import com.cnlive.moudle.pedometer.net.bean.upload.StorageInfoData;
  20 +import com.cnlive.moudle.pedometer.net.bean.upload.UploadAuthData;
  21 +import com.cnlive.moudle.pedometer.net.bean.upload.api.ApiServiceMoment;
  22 +
  23 +import org.json.JSONArray;
  24 +import org.json.JSONException;
  25 +import org.json.JSONObject;
  26 +
  27 +import java.io.File;
  28 +import java.util.ArrayList;
  29 +import java.util.HashMap;
  30 +import java.util.List;
  31 +import java.util.Map;
  32 +
  33 +import static com.cnlive.libs.base.logic.Config.ERROR_DEF;
  34 +
  35 +/**
  36 + * Created by xiansong on 2018/2/6.
  37 + */
  38 +
  39 +public class UploadLogic {
  40 + private static final String TEST_OBJECT_KEY = "802/wjj/video/%s/%s/%s.%s";
  41 + private static final String RELEASE_OBJECT_KEY = "769/wjj/video/%s/%s/%s.%s";
  42 + private static final String TEST_OBJECT_PIC__KEY = "802/img/%s/%s.%s";
  43 + private static final String RELEASE_OBJECT_PIC__KEY = "769/img/%s/%s.%s";
  44 + private static final String TEST_SEVEN = "http://wjjtest.ys2.cnliveimg.com/";
  45 + private static final String RELEASE_SEVEN = "https://wjj.ys2.cnliveimg.com/";
  46 + private static final String SEVEN = AppConfig.isDebug() ? TEST_SEVEN : RELEASE_SEVEN;
  47 + private static final String OBJECT_KEY = AppConfig.isDebug() ? TEST_OBJECT_KEY : RELEASE_OBJECT_KEY;
  48 + private static final String OBJECT_PIC_KEY = AppConfig.isDebug() ? TEST_OBJECT_PIC__KEY : RELEASE_OBJECT_PIC__KEY;
  49 + private static final String TEST_VIDEO_NAME = "802_%s_%s_%s_%s";
  50 + private static final String RELEASE_VIDEO_NAME = "769_%s_%s_%s_%s";
  51 + private static final String VIDEO_NAME = AppConfig.isDebug() ? TEST_VIDEO_NAME : RELEASE_VIDEO_NAME;
  52 + private static final String TAG = "UploadLogic";
  53 + private static String src;
  54 +
  55 +
  56 + private static String isHorizontalScreen(String videoPath) {
  57 + if (TextUtils.isEmpty(videoPath)) {
  58 + return "0";
  59 + }
  60 + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
  61 + MediaMetadataRetriever retr = new MediaMetadataRetriever();
  62 + retr.setDataSource(videoPath);
  63 + String r = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION);
  64 + if (TextUtils.isEmpty(r)) {
  65 + return "0";
  66 + }
  67 + return (r.equals("90") || r.equals("270")) ? "0" : "1";
  68 + }
  69 + return "0";
  70 + }
  71 +
  72 + /*public static void uploadVideoInfo(Context context, String userId, String text, String address, String videoPath, Event<BaseInfo> event,int gotype) {
  73 + uploadVideoInfo(context, userId, text, address, videoPath, event,gotype);
  74 + }*/
  75 +
  76 +
  77 + public static void uploadPicInfo(Context context, String userId, String text, String address, List<String> picPath, ArrayList width, ArrayList height, Event<BaseInfo> event, String gopath, String videotype) {
  78 +
  79 + uploadPicInfo(context, userId, "moment", text, address, picPath, width, height, event, gopath, videotype);
  80 + }
  81 +
  82 + /**
  83 + * 文件上传到七牛(webview 帮助反馈在用)
  84 + *
  85 + * @param context
  86 + * @param picPath
  87 + * @param width
  88 + * @param height
  89 + * @param event
  90 + */
  91 + public static void uploadPic(Context context, boolean isZip, List<String> picPath, ArrayList width, ArrayList height, Event<List<FeedBackInfo>> event) {
  92 + Logic.create()
  93 + .action((Object data, DataCallback<BaseInfo<List<StorageInfoData>>> callback) ->
  94 + UploadProvider.getStorageInfo(context, callback))
  95 + .action((BaseInfo<List<StorageInfoData>> data, DataCallback<BaseInfo<UploadAuthData>> callback) ->
  96 + UploadProvider.uploadAuth(context, data.getData().get(0).getStorageName(), callback)
  97 + )
  98 + .action((BaseInfo<UploadAuthData> data, DataCallback<Map<String, Object>> callback) ->
  99 + isZip ? UploadProvider.zipFiles(context, picPath, (code, message, imgs) -> {
  100 + Map map = new HashMap();
  101 + map.put("image", imgs);
  102 + map.put("tocken", data.getData().getToken());
  103 + if (event.active) callback.callback(code, "", map);
  104 + }) : Logic.process(() -> {
  105 + Map map = new HashMap();
  106 + map.put("image", picPath);
  107 + map.put("tocken", data.getData().getToken());
  108 + return map;
  109 + }, callback))
  110 + .action((Map<String, Object> map, DataCallback<ArrayList<String>> callback) -> {
  111 + UploadProvider.doUploadPic(context, (List<String>) map.get("image"), (String) (map.get("tocken")), callback,
  112 + progress -> {
  113 + if (event.active) {
  114 + event.onProgress(progress);
  115 + }
  116 + });
  117 + return null;
  118 + })
  119 + .action((ArrayList<String> data, DataCallback<List<FeedBackInfo>> callback) ->
  120 + Logic.process(() -> {
  121 + List<FeedBackInfo> list = new ArrayList<>();
  122 + for (int i = 0; i < ((ArrayList) data).size(); i++) {
  123 + FeedBackInfo info = new FeedBackInfo();
  124 + info.setImageUrl(SEVEN + ((ArrayList) data).get(i));
  125 + info.setImageWidth((Long) width.get(i));
  126 + info.setImageHeight((Long) height.get(i));
  127 + list.add(info);
  128 + }
  129 + return list;
  130 + }, callback))
  131 + .start(event);
  132 + }
  133 +
  134 + public static void uploadPicInfo(Context context, String userId, String type, String text, String address, List<String> picPath, ArrayList width, ArrayList height, Event<BaseInfo> event, String gopath, String videotype) {
  135 + Logic.create()
  136 + .action((Object data, DataCallback<BaseInfo<List<StorageInfoData>>> callback) ->
  137 + UploadProvider.getStorageInfo(context, callback))
  138 + .action((BaseInfo<List<StorageInfoData>> data, DataCallback<BaseInfo<UploadAuthData>> callback) ->
  139 + UploadProvider.uploadAuth(context, data.getData().get(0).getStorageName(), callback)
  140 + )
  141 + .action((data, callback) -> UploadProvider.zipFiles(context, picPath, (code, message, imgs) -> {
  142 + Map map = new HashMap();
  143 + map.put("image", imgs);
  144 + map.put("tocken", ((BaseInfo<UploadAuthData>) data).getData().getToken());
  145 + if (event.active) {
  146 + callback.callback(code, "", map);
  147 + }
  148 + }))
  149 + .action((Map<String, Object> map, DataCallback<ArrayList<String>> callback) -> {
  150 + UploadProvider.doUploadPic(context, (List<String>) map.get("image"), (String) (map.get("tocken")), callback,
  151 + progress -> {
  152 + if (event.active) {
  153 + event.onProgress(progress);
  154 + }
  155 + });
  156 + return null;
  157 + })
  158 + .action((ArrayList<String> data, DataCallback<Map<String, Object>> callback) ->
  159 + Logic.process(() -> {
  160 + JSONArray jsonArray = new JSONArray();
  161 + for (int i = 0; i < ((ArrayList) data).size(); i++) {
  162 + JSONObject picobj = new JSONObject();
  163 + int index = Integer.parseInt(data.get(i).substring(8, 9));
  164 + try {
  165 + picobj.put("imageUrl", SEVEN + ((ArrayList) data).get(i));
  166 + picobj.put("imageWidth", width.get(i));
  167 + picobj.put("imageHeight", height.get(i));
  168 + } catch (JSONException e) {
  169 + e.printStackTrace();
  170 + }
  171 + try {
  172 + jsonArray.put(index, picobj);
  173 + } catch (JSONException e) {
  174 + e.printStackTrace();
  175 + }
  176 + }
  177 + if (jsonArray.length() == ((ArrayList) data).size()) {
  178 + Map<String, Object> requestData = new HashMap<>();
  179 + requestData.put("appId", AppConfig.getAppId());
  180 + requestData.put("sid", userId);
  181 + requestData.put("text", StringUtils.encode(text));
  182 + requestData.put("address", address);
  183 + requestData.put("type", "1");
  184 + requestData.put("picArray", jsonArray);
  185 + return requestData;
  186 + } else {
  187 + return null;
  188 + }
  189 + }, callback))
  190 + .action((Map<String, Object> data, DataCallback<BaseInfo> callback) ->
  191 + SubscriptionRequest.service(ApiServiceMoment.class, service -> service.releaseMomentNe(gopath, data))
  192 + .subscribe(context, callback))
  193 +
  194 + /* ApiRequest.service(ApiServiceMoment.class, service -> gotype == 2 ?
  195 + service.releaseMomentNew(data) : service.releaseWitness(data))
  196 + .subscribe(context, callback))*/
  197 + .start(event);
  198 + }
  199 +
  200 +
  201 + /**
  202 + * 张楠上传地图信息用
  203 + */
  204 + public static void uploadAddressPicInfo(Context context, List<String> picPath, Event<String> event) {
  205 + Logic.create()
  206 + .action((Object data, DataCallback<BaseInfo<List<StorageInfoData>>> callback) ->
  207 + UploadProvider.getStorageInfo(context, callback))
  208 + .action((BaseInfo<List<StorageInfoData>> data, DataCallback<BaseInfo<UploadAuthData>> callback) ->
  209 + UploadProvider.uploadAuth(context, data.getData().get(0).getStorageName(), callback)
  210 + )
  211 + .action((data, callback) -> UploadProvider.zipFiles(context, picPath, (code, message, imgs) -> {
  212 + Map map = new HashMap();
  213 + map.put("image", imgs);
  214 + map.put("tocken", ((BaseInfo<UploadAuthData>) data).getData().getToken());
  215 + if (event.active) {
  216 + callback.callback(code, "", map);
  217 + }
  218 + }))
  219 + .action((Map<String, Object> map, DataCallback<ArrayList<String>> callback) -> {
  220 + UploadProvider.doUploadPic(context, (List<String>) map.get("image"), (String) (map.get("tocken")), callback,
  221 + progress -> {
  222 + if (event.active) {
  223 + event.onProgress(progress);
  224 + }
  225 + });
  226 + return null;
  227 + })
  228 + .action((ArrayList<String> data, DataCallback<String> callback) ->
  229 + Logic.process(() -> {
  230 + String addressImageUrl = SEVEN + ((ArrayList) data).get(0);
  231 + return addressImageUrl;
  232 + }, callback))
  233 +
  234 + .start(event);
  235 + }
  236 +
  237 + public static void uploadSnowPicInfo(Context context, String userId, String text, String address, ArrayList picPath, ArrayList width, ArrayList height, Event<BaseInfo> event, String path, String videotype) {
  238 + //统计
  239 + //Probe.probeUploadVideo();
  240 +
  241 + Logic.create()
  242 + .action((Object data, DataCallback<BaseInfo<List<StorageInfoData>>> callback) ->
  243 + UploadProvider.getStorageInfo(context, callback))
  244 + .action((BaseInfo<List<StorageInfoData>> data, DataCallback<BaseInfo<UploadAuthData>> callback) ->
  245 + UploadProvider.uploadAuth(context, data.getData().get(0).getStorageName(), callback))
  246 + .action((BaseInfo<UploadAuthData> data, DataCallback<Map<String, Object>> callback) -> UploadProvider.zipFiles(context, (List<String>) picPath, (code, message, imgs) -> {
  247 + Map map = new HashMap();
  248 + map.put("image", imgs);
  249 + map.put("tocken", data.getData().getToken());
  250 + if (event.active) callback.callback(code, "", map);
  251 + }))
  252 + .action((Map<String, Object> map, DataCallback<ArrayList<String>> callback) -> {
  253 + UploadProvider.doUploadPic(context, (List<String>) map.get("image"), (String) (map.get("tocken")), callback,
  254 + progress -> {
  255 + if (event.active) {
  256 + event.onProgress(progress);
  257 + }
  258 + });
  259 + return null;
  260 + })
  261 + .action((ArrayList<String> data, DataCallback<Map<String, Object>> callback) ->
  262 + Logic.process(() -> {
  263 + JSONArray jsonArray = new JSONArray();
  264 + for (int i = 0; i < ((ArrayList) data).size(); i++) {
  265 + JSONObject picobj = new JSONObject();
  266 + int index = Integer.parseInt(data.get(i).substring(8, 9));
  267 + try {
  268 + picobj.put("imageUrl", SEVEN + ((ArrayList) data).get(i));
  269 + picobj.put("imageWidth", width.get(i));
  270 + picobj.put("imageHeight", height.get(i));
  271 + } catch (JSONException e) {
  272 + e.printStackTrace();
  273 + }
  274 + try {
  275 + jsonArray.put(index, picobj);
  276 + } catch (JSONException e) {
  277 + e.printStackTrace();
  278 + }
  279 + }
  280 + if (jsonArray.length() == ((ArrayList) data).size()) {
  281 + Log.e("werwwwwwwwwwwww123", jsonArray.toString() + " " + AppConfig.getAppId() + " " + userId);
  282 + Map<String, Object> requestData = new HashMap<>();
  283 + requestData.put("appId", AppConfig.getAppId());
  284 + requestData.put("sid", userId);
  285 + requestData.put("text", StringUtils.encode(text));
  286 + requestData.put("address", address);
  287 + requestData.put("type", "1");
  288 + requestData.put("picArray", jsonArray);
  289 + return requestData;
  290 + } else {
  291 + return null;
  292 + }
  293 +// return null;
  294 + }, callback))
  295 + .action((Map<String, Object> data, DataCallback<BaseInfo> callback) ->
  296 + SubscriptionRequest.service(ApiServiceMoment.class, service -> service.releaseMomentNe(path, data))
  297 + .subscribe(context, callback))
  298 + .start(event);
  299 + }
  300 +
  301 + private static class SendMoment {
  302 + private String appId = AppConfig.getAppId();
  303 + private String text;
  304 + private String sid;
  305 + private String type;
  306 + private String address;
  307 + private String debug;
  308 + private String ver;
  309 + private String plat;
  310 + private String tagId;
  311 + private String tagName;
  312 +
  313 + public SendMoment(String type, String sid, String text, String address, String ver, String plat, String tagId, String tagName) {
  314 + this.sid = sid;
  315 + this.text = StringUtils.encode(text);
  316 + this.address = address;
  317 + this.debug = AppConfig.isDebug() ? "0" : "";
  318 + this.type = type;
  319 + this.ver = ver;
  320 + this.plat = plat;
  321 + this.tagId = tagId;
  322 + this.tagName = tagName;
  323 + }
  324 + }
  325 +
  326 + private static class SendImage {
  327 + private String imageUrl;
  328 + private Long imageWidth;
  329 + private Long imageHeight;
  330 +
  331 +
  332 + public SendImage(String imageUrl, Long imageWidth, Long imageHeight) {
  333 + this.imageUrl = imageUrl;
  334 + this.imageWidth = imageWidth;
  335 + this.imageHeight = imageHeight;
  336 + }
  337 + }
  338 +
  339 + private static String getPath(String cachePath) {
  340 + String path = Environment.getExternalStorageDirectory() + cachePath;
  341 + File file = new File(path);
  342 + if (file.mkdirs()) {
  343 + return path;
  344 + }
  345 + return path;
  346 + }
  347 +
  348 + public static void uploadInfo(Context context, String sid, String text, String address,
  349 + String key, List<String> imageFiles, ShareReleaseInfoUtil.ShareConfig shareConfig,
  350 + Event<BaseInfo> event, String gopath, String videotype) {
  351 +
  352 + Logic.create(imageFiles)
  353 + .action((Object data, DataCallback<BaseInfo<List<StorageInfoData>>> callback) ->
  354 + UploadProvider.getStorageInfo(context, callback))
  355 + .action((BaseInfo<List<StorageInfoData>> data, DataCallback<BaseInfo<UploadAuthData>> callback) ->
  356 + UploadProvider.uploadAuth(context, data.getData().get(0).getStorageName(), callback)
  357 + )
  358 + .action((BaseInfo<UploadAuthData> data, DataCallback<Map<String, Object>> callback) ->
  359 + Logic.process(() -> {
  360 + Map map = new HashMap();
  361 + File file = new File(getPath("/strike/cache/") + "share.jpg");
  362 + if (file.exists()) {
  363 + src = getPath("/strike/cache/") + "share.jpg";
  364 + } else {
  365 + src = getPath("/strike/cache/") + "sharefirst.jpg";
  366 + }
  367 + map.put("image", src);
  368 + map.put("tocken", data.getData().getToken());
  369 + return map;
  370 + }, callback))
  371 + .action((Map<String, Object> map, DataCallback<ArrayList<String>> callback) -> {
  372 + ArrayList<String> objects = new ArrayList<>();
  373 + objects.add(map.get("image") + "");
  374 + UploadProvider.doUploadPic(context, objects, (String) (map.get("tocken")), callback,
  375 + progress -> {
  376 + if (event.active) {
  377 + event.onProgress(progress);
  378 + }
  379 + });
  380 + return null;
  381 + })
  382 + .action((ArrayList<String> data1, DataCallback<String> callback) ->
  383 + UploadProvider.uploadInfo(context, sid, text, address, key, null, shareConfig, gopath, SEVEN + ((ArrayList) data1).get(0),
  384 + (progress) -> {
  385 + if (!event.active) {
  386 + return;
  387 + }
  388 + event.onProgress(progress);
  389 + },
  390 + (code, message, data) -> {
  391 + if (!event.active) {
  392 + return;
  393 + }
  394 +
  395 + event.onState(Config.STATE_IDLE);
  396 + if (code == 0) {
  397 + event.onSuccess(data);
  398 + } else {
  399 + event.onFailure(code, message);
  400 + }
  401 + })
  402 + )
  403 + .start(event);
  404 + }
  405 +
  406 +
  407 + public static void uploadHomeInfo(Context context, String sid, String text, String address,
  408 + String key, List<String> imageFiles, ShareReleaseInfoUtil.ShareConfig shareConfig,
  409 + Event<BaseInfo> event, String gopath, String videotype) {
  410 + Logic.create(imageFiles)
  411 + .action((List<String> data, DataCallback<List<String>> callback) ->
  412 + UploadProvider.zipFiles(context, data, callback))
  413 + .action((List<String> list, DataCallback<String> callback) ->
  414 + UploadProvider.uploadInfo(context, sid, text, address, key, list, shareConfig, gopath, videotype,
  415 + (progress) -> {
  416 + if (!event.active) {
  417 + return;
  418 + }
  419 + event.onProgress(progress);
  420 + },
  421 + (code, message, data) -> {
  422 + if (!event.active) {
  423 + return;
  424 + }
  425 +
  426 + event.onState(Config.STATE_IDLE);
  427 + if (code == 0) {
  428 + event.onSuccess(data);
  429 + } else {
  430 + event.onFailure(code, message);
  431 + }
  432 + })
  433 + )
  434 + .start(event);
  435 + }
  436 +
  437 +
  438 + private static void onError(String tag, int stateCode, int code, String message, Event event) {
  439 + if (event.active) {
  440 + event.onState(Config.STATE_IDLE);
  441 + if (code == -3) {
  442 + event.onFailure(code, message);
  443 + } else {
  444 + event.onFailure(stateCode, message);
  445 + }
  446 + }
  447 + Log.d(TAG, String.format(ERROR_DEF, tag, stateCode, code, message));
  448 + }
  449 +
  450 + /**
  451 + * Im收藏的时候图片单张上传的方法
  452 + *
  453 + * @param context
  454 + * @param isZip
  455 + * @param picPath
  456 + * @param event
  457 + */
  458 + public static void uploadonePic(Context context, boolean isZip, List<String> picPath, Event<List<FeedBackInfo>> event) {
  459 +
  460 + Logic.create()
  461 + .action((Object data, DataCallback<BaseInfo<List<StorageInfoData>>> callback) ->
  462 + UploadProvider.getStorageInfo(context, callback))
  463 + .action((BaseInfo<List<StorageInfoData>> data, DataCallback<BaseInfo<UploadAuthData>> callback) ->
  464 + UploadProvider.uploadAuth(context, data.getData().get(0).getStorageName(), callback)
  465 + )
  466 + .action((BaseInfo<UploadAuthData> data, DataCallback<Map<String, Object>> callback) ->
  467 + isZip ? UploadProvider.zipFiles(context, picPath, (code, message, imgs) -> {
  468 + Map map = new HashMap();
  469 + map.put("image", imgs);
  470 + map.put("tocken", data.getData().getToken());
  471 + if (event.active) callback.callback(code, "", map);
  472 + }) : Logic.process(() -> {
  473 + Map map = new HashMap();
  474 + map.put("image", picPath);
  475 + map.put("tocken", data.getData().getToken());
  476 + return map;
  477 + }, callback))
  478 + .action((Map<String, Object> map, DataCallback<ArrayList<String>> callback) -> {
  479 + UploadProvider.doUploadPic(context, (List<String>) map.get("image"), (String) (map.get("tocken")), callback,
  480 + progress -> {
  481 + if (event.active) {
  482 + event.onProgress(progress);
  483 + }
  484 + });
  485 + return null;
  486 + })
  487 + .action((ArrayList<String> data, DataCallback<List<FeedBackInfo>> callback) ->
  488 + Logic.process(() -> {
  489 + List<FeedBackInfo> list = new ArrayList<>();
  490 + for (int i = 0; i < ((ArrayList) data).size(); i++) {
  491 + FeedBackInfo info = new FeedBackInfo();
  492 + info.setImageUrl(SEVEN + ((ArrayList) data).get(i));
  493 + list.add(info);
  494 + }
  495 + return list;
  496 + }, callback))
  497 + .start(event);
  498 +
  499 + }
  500 +
  501 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/upload/UploadProvider.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.upload;
  2 +
  3 +import android.app.Activity;
  4 +import android.content.Context;
  5 +import android.media.MediaMetadataRetriever;
  6 +import android.os.Build;
  7 +import android.os.Environment;
  8 +import android.text.TextUtils;
  9 +import android.util.Log;
  10 +
  11 +import com.cnlive.libs.base.application.AppConfig;
  12 +import com.cnlive.libs.base.logic.Config;
  13 +import com.cnlive.libs.base.logic.callback.DataCallback;
  14 +import com.cnlive.libs.base.logic.callback.ProgressCallback;
  15 +import com.cnlive.libs.base.util.AlertUtil;
  16 +import com.cnlive.libs.base.util.ShareReleaseInfoUtil;
  17 +import com.cnlive.libs.base.util.StringUtils;
  18 +import com.cnlive.libs.data.network.Subscriber;
  19 +import com.cnlive.libs.data.network.body.CountingRequestBody;
  20 +import com.cnlive.libs.data.network.util.SignUtil;
  21 +import com.cnlive.libs.upload.listener.CNPutObjectResponseListener;
  22 +import com.cnlive.libs.upload.model.UploadError;
  23 +import com.cnlive.libs.upload.model.acl.CNCannedAccessControlList;
  24 +import com.cnlive.libs.upload.services.CNPutObjectRequest;
  25 +import com.cnlive.libs.upload.upload.CNUpload;
  26 +import com.cnlive.libs.upload.upload.callback.OnInitListener;
  27 +import com.cnlive.media.picker.utils.FileTypeUtil;
  28 +import com.cnlive.moudle.pedometer.net.ApiSubscriber;
  29 +import com.cnlive.moudle.pedometer.net.SubscriptionRequest;
  30 +import com.cnlive.moudle.pedometer.net.bean.BaseInfo;
  31 +import com.cnlive.moudle.pedometer.net.bean.upload.StorageInfoData;
  32 +import com.cnlive.moudle.pedometer.net.bean.upload.UploadAuthData;
  33 +import com.cnlive.moudle.pedometer.net.bean.upload.api.ApiServiceMoment;
  34 +import com.cnlive.moudle.pedometer.net.bean.upload.api.ApiServiceOpen;
  35 +import com.cnlive.moudle.pedometer.utils.FileUtil;
  36 +import com.cnlive.moudle.pedometer.utils.IDUtils;
  37 +import com.cnlive.moudle.pedometer.utils.MD5;
  38 +import com.qiniu.android.http.ResponseInfo;
  39 +import com.qiniu.android.storage.UpCompletionHandler;
  40 +import com.qiniu.android.storage.UpProgressHandler;
  41 +import com.qiniu.android.storage.UploadManager;
  42 +import com.qiniu.android.storage.UploadOptions;
  43 +import com.qiniu.pili.droid.shortvideo.PLShortVideoTranscoder;
  44 +import com.qiniu.pili.droid.shortvideo.PLVideoSaveListener;
  45 +
  46 +import org.apache.http.Header;
  47 +import org.json.JSONException;
  48 +import org.json.JSONObject;
  49 +
  50 +import java.io.File;
  51 +import java.util.ArrayList;
  52 +import java.util.Date;
  53 +import java.util.HashMap;
  54 +import java.util.List;
  55 +import java.util.Map;
  56 +
  57 +import io.reactivex.Observable;
  58 +import io.reactivex.disposables.Disposable;
  59 +import okhttp3.MediaType;
  60 +import okhttp3.MultipartBody;
  61 +import okhttp3.RequestBody;
  62 +import retrofit2.adapter.rxjava2.Result;
  63 +import top.zibin.luban.CompressionPredicate;
  64 +import top.zibin.luban.Luban;
  65 +import top.zibin.luban.OnCompressListener;
  66 +//import org.apache.http.Header;
  67 +import static com.cnlive.libs.base.logic.Config.ERROR_UPLOAD;
  68 +import static com.cnlive.libs.base.logic.Config.SUCCESS;
  69 +
  70 +
  71 +/**
  72 + * Created by xiansong on 2018/2/1.
  73 + */
  74 +
  75 +public class UploadProvider {
  76 +
  77 + private static final String TAG = "UploadProvider";
  78 + private static final String TEST_OBJECT_PIC__KEY = "802/img/%s/%s/%s.%s";
  79 + private static final String RELEASE_OBJECT_PIC__KEY = "769/img/%s/%s/%s.%s";
  80 + private static final String OBJECT_PIC_KEY = AppConfig.isDebug() ? TEST_OBJECT_PIC__KEY : RELEASE_OBJECT_PIC__KEY;
  81 + private static final String TYPE_IMAGE_PATH = "/strike/image/";
  82 + private static final String TYPE_VIDEO_PATH = "/strike/cache/";
  83 +
  84 +
  85 + public static void initUpload(Context context, DataCallback<CNUpload> callback) {
  86 + if (callback == null) return;
  87 + //实例化上传
  88 + CNUpload cnUpload = new CNUpload(context);
  89 + //初始化上传
  90 + cnUpload.initCNUpload(new OnInitListener() {
  91 + @Override
  92 + public void onError(String s, String s1) {
  93 + int errorCode = -1;
  94 + try {
  95 + errorCode = Integer.valueOf(s);
  96 + } catch (Exception e) {
  97 + Log.e(TAG, "initUpload error code is string. ");
  98 + } finally {
  99 + callback.callback(errorCode, s1, null);
  100 + }
  101 + }
  102 +
  103 + @Override
  104 + public void onSuccess(String s) {
  105 + callback.callback(0, s, cnUpload);
  106 + }
  107 + });
  108 + }
  109 +
  110 + /**
  111 + * @param context
  112 + * @param callback
  113 + * @return
  114 + */
  115 + public static Disposable uploadAuth(Context context, String bucketName, DataCallback<BaseInfo<UploadAuthData>> callback) {
  116 + Map<String, String> map = new HashMap<>();
  117 + map.put("appId", AppConfig.getAppId());
  118 + map.put("verb", "POST");
  119 + map.put("md5", "");
  120 + map.put("bucket", bucketName);
  121 + map.put("type", "");
  122 + map.put("res", "");
  123 + map.put("headers", "");
  124 + map.put("date", "");
  125 + map.put("storageType", "2");
  126 + Subscriber<BaseInfo<UploadAuthData>> subscriber = new Subscriber<BaseInfo<UploadAuthData>>(context, ApiSubscriber.subscriberBuild) {
  127 + @Override
  128 + public void onCompleted(String s, String s1, BaseInfo<UploadAuthData> uploadAuthDataBaseInfo) {
  129 + if (callback == null) {
  130 + return;
  131 + }
  132 + callback.callback(SUCCESS, "", uploadAuthDataBaseInfo);
  133 + }
  134 +
  135 + @Override
  136 + public void onError(String s, String s1) {
  137 + if (callback == null) {
  138 + return;
  139 + }
  140 + int errorCode = -1;
  141 + try {
  142 + errorCode = Integer.valueOf(s);
  143 + } catch (Exception ignored) {
  144 + } finally {
  145 + callback.callback(errorCode, s1, null);
  146 + }
  147 + }
  148 + };
  149 + Observable<Result<BaseInfo<UploadAuthData>>> observable = SubscriptionRequest.service(ApiServiceOpen.class).getUploadAuthForApp(map);
  150 + return SubscriptionRequest.subscribe(observable, subscriber);
  151 + }
  152 +
  153 + /**
  154 + * 获取存储信息
  155 + *
  156 + * @param context
  157 + * @param callback
  158 + * @return
  159 + */
  160 + public static Disposable getStorageInfo(Context context, DataCallback<BaseInfo<List<StorageInfoData>>> callback) {
  161 + Map<String, String> map = new HashMap<>();
  162 + map.put("appId", AppConfig.getAppId());
  163 + map.put("storageType", "2");
  164 + map.put("state", "1");
  165 + map.put("contentType", "1");
  166 +// map.put("profile", AppConfig.isDebug() ? "2" : "1");//暂时不传这个参数
  167 + Subscriber<BaseInfo<List<StorageInfoData>>> subscriber = new Subscriber<BaseInfo<List<StorageInfoData>>>(context, ApiSubscriber.subscriberBuild) {
  168 + @Override
  169 + public void onCompleted(String code, String message, BaseInfo<List<StorageInfoData>> data) {
  170 + if (callback == null) {
  171 + return;
  172 + }
  173 + if (data.getData().size() > 0 || data.getData() != null) {
  174 + callback.callback(SUCCESS, "", data);
  175 + } else {
  176 + callback.callback(-1, "storage info null", null);
  177 + }
  178 + }
  179 +
  180 + @Override
  181 + public void onError(String code, String message) {
  182 + if (callback == null) {
  183 + return;
  184 + }
  185 + int errorCode = -1;
  186 + try {
  187 + errorCode = Integer.valueOf(code);
  188 + } catch (Exception ignored) {
  189 + } finally {
  190 + callback.callback(errorCode, message, null);
  191 + }
  192 + }
  193 + };
  194 + Observable<Result<BaseInfo<List<StorageInfoData>>>> observable = SubscriptionRequest.service(ApiServiceOpen.class).getStorageInfo(map);
  195 + return SubscriptionRequest.subscribe(observable, subscriber);
  196 + }
  197 +
  198 + // /**
  199 +// * 视频发布 - 视讯云数据同步接口
  200 +// *
  201 +// * @param context
  202 +// * @param sid
  203 +// * @param text
  204 +// * @param address
  205 +// * @param key
  206 +// * @param callback
  207 +// * @return
  208 +// */
  209 +// public static Disposable uploadInfo(Context context, String sid, String text, String address, String key, DataCallback<BaseInfo> callback) {
  210 +// svInputMamForAPP
  211 +// }
  212 + public static Disposable zipFiles(Context context, List<String> imageFiles, DataCallback<List<String>> callback) {
  213 + if (imageFiles == null || imageFiles.size() == 0) {
  214 + callback.callback(0, "", imageFiles);
  215 + } else {
  216 + List<String> files = new ArrayList<>();
  217 + for (int i = 0; i < imageFiles.size(); i++) {
  218 + if ("gif".equals(FileTypeUtil.getFileType(imageFiles.get(i)))) {
  219 + files.add(imageFiles.get(i));
  220 + if (files.size() == imageFiles.size()) {
  221 + callback.callback(0, "", files);
  222 + }
  223 + } else {
  224 + Luban.with(context)
  225 + .load(imageFiles.get(i))
  226 + .ignoreBy(500)
  227 + .setTargetDir(getPath(TYPE_IMAGE_PATH))
  228 + .filter(new CompressionPredicate() {
  229 + @Override
  230 + public boolean apply(String path) {
  231 + return !(TextUtils.isEmpty(path) || path.toLowerCase().endsWith(".gif"));
  232 + }
  233 + })
  234 + .setCompressListener(new OnCompressListener() {
  235 + @Override
  236 + public void onStart() {
  237 + // TODO 压缩开始前调用,可以在方法内启动 loading UI
  238 + }
  239 +
  240 + @Override
  241 + public void onSuccess(File file) {
  242 + // TODO 压缩成功后调用,返回压缩后的图片文件
  243 + files.add(file.getPath());
  244 + if (files.size() == imageFiles.size()) {
  245 + callback.callback(0, "", files);
  246 + }
  247 + }
  248 +
  249 + @Override
  250 + public void onError(Throwable e) {
  251 + Log.e(TAG, "onError: 失败"+e.getMessage() );
  252 + // TODO 当压缩过程出现问题时调用
  253 + AlertUtil.showDeftToast(context, "图片压缩失败,请重新上传");
  254 + }
  255 + }).launch();
  256 + }
  257 + }
  258 + }
  259 + return null;
  260 + }
  261 +
  262 + public static boolean isHUAWEI() {
  263 + String manufacturer = Build.MANUFACTURER;
  264 + if ("huawei".equalsIgnoreCase(manufacturer)) {
  265 + return true;
  266 + }
  267 + return false;
  268 + }
  269 +
  270 +
  271 + public static Disposable zipVideo(Context context, String path, boolean compressed, DataCallback<String> callback) {
  272 + boolean huawei = isHUAWEI();
  273 + if (TextUtils.isEmpty(path) || compressed) {
  274 + callback.callback(Config.FAIL, "", path);
  275 + } else {
  276 + try {
  277 + // String outPath = getPath(TYPE_VIDEO_PATH) + MD5Utils.getFileMD5(new File(path)) + ".mp4";
  278 + // String outPath = getPath(TYPE_VIDEO_PATH) + MD5.getFileMD5(new File(path)) + ".mp4";
  279 + compressVideoResouce(context, path, callback);
  280 + // TranscoderUtil.doTranscode(context, path, outPath, callback);
  281 + } catch (Exception e) {
  282 + callback.callback(0, "", path);
  283 + }
  284 + }
  285 + return null;
  286 + }
  287 +
  288 +
  289 + /**
  290 + * 压缩视频
  291 + *
  292 + * @param mContext
  293 + * @param filepath
  294 + */
  295 + public static void compressVideoResouce(Context mContext, String filepath, DataCallback<String> callback) {
  296 + if (TextUtils.isEmpty(filepath)) {
  297 + AlertUtil.showDeftToast(mContext, "请先选择转码文件!");
  298 + return;
  299 + }
  300 + //PLShortVideoTranscoder初始化,三个参数,第一个context,第二个要压缩文件的路径,第三个视频压缩后输出的路径
  301 + PLShortVideoTranscoder mShortVideoTranscoder = new PLShortVideoTranscoder(mContext, filepath, getPath(TYPE_VIDEO_PATH) + MD5.getFileMD5(new File(filepath)) + ".mp4");
  302 + MediaMetadataRetriever retr = new MediaMetadataRetriever();
  303 + retr.setDataSource(filepath);
  304 + String height = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); // 视频高度
  305 + String width = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); // 视频宽度
  306 + String rotation = retr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION); // 视频旋转方向
  307 + int transcodingBitrateLevel = 7;//我这里选择的4000*1000压缩,这里可以自己选择合适的压缩比例
  308 + mShortVideoTranscoder.transcode(Integer.parseInt(width), Integer.parseInt(height), getEncodingBitrateLevel(transcodingBitrateLevel), new PLVideoSaveListener() {
  309 + @Override
  310 + public void onSaveVideoSuccess(String s) {
  311 + if (callback != null) {
  312 + callback.callback(Config.SUCCESS, "success", s);
  313 + }
  314 + }
  315 +
  316 + @Override
  317 + public void onSaveVideoFailed(final int errorCode) {
  318 + if (callback != null) {
  319 + callback.callback(Config.FAIL, "", filepath);
  320 + }
  321 + }
  322 +
  323 + @Override
  324 + public void onSaveVideoCanceled() {
  325 +// LogUtil.e("onSaveVideoCanceled");
  326 + }
  327 +
  328 + @Override
  329 + public void onProgressUpdate(float percentage) {
  330 +// LogUtil.e("onProgressUpdate==========" + percentage);
  331 + }
  332 + });
  333 + }
  334 +
  335 + /**
  336 + * 设置压缩质量
  337 + *
  338 + * @param position
  339 + * @return
  340 + */
  341 + private static int getEncodingBitrateLevel(int position) {
  342 + return ENCODING_BITRATE_LEVEL_ARRAY[position];
  343 + }
  344 +
  345 + /**
  346 + * 选的越高文件质量越大,质量越好
  347 + */
  348 + public static final int[] ENCODING_BITRATE_LEVEL_ARRAY = {
  349 + 500 * 1000,
  350 + 800 * 1000,
  351 + 1000 * 1000,
  352 + 1200 * 1000,
  353 + 1600 * 1000,
  354 + 2000 * 1000,
  355 + 2500 * 1000,
  356 + 4000 * 1000,
  357 + 8000 * 1000,
  358 + };
  359 +
  360 +
  361 + private static String getPath(String cachePath) {
  362 + String path = Environment.getExternalStorageDirectory() + cachePath;
  363 + File file = new File(path);
  364 + if (file.mkdirs()) {
  365 + return path;
  366 + }
  367 + return path;
  368 + }
  369 +
  370 + public static Disposable uploadInfo(Context context, String sid, String text, String address,
  371 + String key, List<String> imageFiles, ShareReleaseInfoUtil.ShareConfig shareConfig, String gopath, String videotype,
  372 + ProgressCallback progressCallback, DataCallback<BaseInfo> callback) {
  373 + Map<String, String> map = new HashMap<>();
  374 +
  375 + // if (imageFiles != null && imageFiles.size() > 0) map.put("type", "1");
  376 + if (!TextUtils.isEmpty(key)) {
  377 + map.put("type", "2");
  378 + } else if (shareConfig != null) {
  379 + map.put("type", "3");
  380 + } else {
  381 + map.put("type", "0");
  382 + }
  383 + map.put("appId", AppConfig.getAppId());
  384 + map.put("sid", sid);
  385 + map.put("text", StringUtils.encode(text));
  386 + if (!TextUtils.isEmpty(key)) {
  387 + map.put("key", key);
  388 + }
  389 + //if (!TextUtils.isEmpty(address)) map.put("address", StringUtils.encode(address));
  390 + if (!TextUtils.isEmpty(address)) {
  391 + map.put("address", address);
  392 + }
  393 + if (shareConfig != null) {
  394 + map.put("title", shareConfig.getTitle() == null ? "" : StringUtils.encode(shareConfig.getTitle()));
  395 + map.put("icon", videotype.startsWith("http") ? videotype : shareConfig.getImage());
  396 + // map.put("icon",shareConfig.getImage().contains("/favicon.ico") || shareConfig.getImage().contains("toutiao") ? shareConfig.getImage() : videotype.startsWith("http") ? videotype : shareConfig.getImage());
  397 + map.put("url", shareConfig.getUrl());
  398 + map.put("desc", shareConfig.getSubTitle() == null ? "" : StringUtils.encode(shareConfig.getSubTitle()));
  399 + map.put("shareType", "3");
  400 + map.put("shareExtInfo", "");
  401 + }
  402 +
  403 + Subscriber<BaseInfo> subscriber = new Subscriber<BaseInfo>(context, ApiSubscriber.subscriberBuild) {
  404 + @Override
  405 + public void onCompleted(String s, String s1, BaseInfo darenApplyModel) {
  406 + if (callback == null) {
  407 + return;
  408 + }
  409 + callback.callback(SUCCESS, "", darenApplyModel);
  410 + }
  411 +
  412 + @Override
  413 + public void onError(String code, String message) {
  414 + if (callback == null) {
  415 + return;
  416 + }
  417 + int errorCode = -1;
  418 + try {
  419 + errorCode = Integer.valueOf(code);
  420 + } catch (Exception ignored) {
  421 + } finally {
  422 + callback.callback(errorCode, message, null);
  423 + }
  424 + }
  425 +
  426 + };
  427 +
  428 + return SignUtil.getRequestBodySignMapObservable(map).subscribe(requestBodyMap -> {
  429 + ApiServiceMoment service = SubscriptionRequest.service(ApiServiceMoment.class);
  430 + SubscriptionRequest.subscribe(service.releaseMomentText(gopath, map), subscriber);
  431 + });
  432 + }
  433 +
  434 +
  435 +
  436 + private static List<MultipartBody.Part> getImageParams(List<String> imageFiles, ProgressCallback callback) {
  437 + List<MultipartBody.Part> imageParams = new ArrayList<>();
  438 +
  439 + if (imageFiles != null) {
  440 + for (String path : imageFiles) {
  441 + File file = new File(path);
  442 + RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
  443 + int index = imageFiles.indexOf(path);
  444 + int size = imageFiles.size();
  445 + CountingRequestBody countingRequestBody = new CountingRequestBody(requestBody, (byteWrited, contentLength, done) -> {
  446 + float p = (float) index / (float) size + (float) byteWrited / (float) contentLength / (float) size;
  447 + if (callback != null) {
  448 + callback.onProgress((int) (p * 100));
  449 + }
  450 + });
  451 + imageParams.add(MultipartBody.Part.createFormData("Image" + (imageFiles.indexOf(path) + 1), file.getName(), countingRequestBody));
  452 + }
  453 + }
  454 + return imageParams;
  455 + }
  456 +
  457 + /**
  458 + * 单块上传
  459 + *
  460 + * @param file 自定义文件
  461 + */
  462 + public static void doUpload(CNUpload cnUpload, File file, String objectKey, DataCallback<Integer> callback, ProgressCallback progressCallback) {
  463 + CNPutObjectRequest request = new CNPutObjectRequest(objectKey, file);
  464 + //Bucket权限管理
  465 + request.setCannedACL(CNCannedAccessControlList.PublicRead);
  466 + //设置上传的文件的内容类型
  467 + request.setContentType("video/mp4");
  468 +
  469 + cnUpload.putObject(request, new CNPutObjectResponseListener() {
  470 + /**
  471 + * 上传失败
  472 + * @param code Http请求返回的状态码,200表示请求成功,400表示客户端请求错误,403表示签名错误或本地日期时间错误
  473 + * @param uploadError 失败时返回的实体类,包含errorCode、errorMessage、serverError
  474 + * @param headers Http请求响应报头
  475 + * @param message 失败时返回的响应正文
  476 + * @param throwable 出错时抛出的异常
  477 + */
  478 + @Override
  479 + public void onTaskFailure(int code, UploadError uploadError, Header[] headers, String message, Throwable throwable) {
  480 + callback.callback(code, message, ERROR_UPLOAD);
  481 + }
  482 +
  483 + /**
  484 + * 上传成功
  485 + * @param code Http请求返回的状态码
  486 + * @param headers Http请求响应报头
  487 + */
  488 + @Override
  489 + public void onTaskSuccess(int code, Header[] headers) {
  490 + callback.callback(0, "", SUCCESS);
  491 + }
  492 +
  493 + /**
  494 + * 上传开始
  495 + */
  496 + @Override
  497 + public void onTaskStart() {
  498 + }
  499 +
  500 + /**
  501 + * 上传结束 包括上传成功结束与上传失败结束
  502 + */
  503 + @Override
  504 + public void onTaskFinish() {
  505 + }
  506 +
  507 + /**
  508 + * 上传取消
  509 + * 目前无法取消上传操作~!!!
  510 + */
  511 + @Override
  512 + public void onTaskCancel() {
  513 + }
  514 +
  515 + /**
  516 + * 上传进度
  517 + * @param progress 返回上传进度
  518 + */
  519 + @Override
  520 + public void onTaskProgress(double progress) {
  521 + progressCallback.onProgress(progress);
  522 + }
  523 + });
  524 + }
  525 +
  526 + public static void doUpload(Context context, File file, String objectKey, String uploadToken, DataCallback<Integer> callback, ProgressCallback progressCallback) {
  527 + UploadManager uploadManager = new UploadManager();
  528 + uploadManager.put(file, objectKey, uploadToken, new UpCompletionHandler() {
  529 + @Override
  530 + public void complete(String key, ResponseInfo info, JSONObject response) {
  531 + ((Activity) context).runOnUiThread(() -> {
  532 + if (info.isOK()) {
  533 + callback.callback(0, "", SUCCESS);
  534 + } else {
  535 + callback.callback(info.statusCode, info.error, ERROR_UPLOAD);
  536 + }
  537 + });
  538 + }
  539 + }, new UploadOptions(null, null, false, new UpProgressHandler() {
  540 + @Override
  541 + public void progress(String key, double percent) {
  542 + progressCallback.onProgress(percent);
  543 + }
  544 + }, null));
  545 + }
  546 +
  547 +
  548 + public static void doUploadPic(Context context, List<String> file, String uploadToken, DataCallback<ArrayList<String>> callback, ProgressCallback progressCallback) {
  549 + ArrayList<String> netpiclist = new ArrayList<>();
  550 + UploadManager uploadManager = new UploadManager();
  551 + //正式环境:769/img/2018/01/29/"时间戳".jpg
  552 + //测试环境:802/img/2018/01/29/"时间戳".jpg
  553 + for (int i = 0; i < file.size(); i++) {
  554 + Date date = new Date();
  555 + String date1 = StringUtils.formatDate(date, "yyyy/MM/dd");
  556 + String id = IDUtils.createID();
  557 + String extName = FileUtil.getExtensionName((String) file.get(0));
  558 + String objectKey = String.format(OBJECT_PIC_KEY, i, date1, id, extName);
  559 + uploadManager.put(new File(file.get(i)), objectKey, uploadToken, new UpCompletionHandler() {
  560 + @Override
  561 + public void complete(String key, ResponseInfo info, JSONObject response) {
  562 + ((Activity) context).runOnUiThread(() -> {
  563 +
  564 + if (info.isOK()) {
  565 + try {
  566 + netpiclist.add((String) info.response.get("key"));
  567 + } catch (JSONException e) {
  568 + e.printStackTrace();
  569 + }
  570 + if (netpiclist.size() == file.size()) {
  571 + callback.callback(0, "", netpiclist);
  572 + }
  573 + } else {
  574 + callback.callback(info.statusCode, info.error, null);
  575 + }
  576 + });
  577 + }
  578 + }, new UploadOptions(null, null, false, new UpProgressHandler() {
  579 + @Override
  580 + public void progress(String key, double percent) {
  581 + progressCallback.onProgress(percent);
  582 + }
  583 + }, null));
  584 + }
  585 + }
  586 +
  587 +
  588 +
  589 + private static RequestBody getRequestString(String value) {
  590 + RequestBody requestString = RequestBody.create(MediaType.parse("text/plain"), value);
  591 + return requestString;
  592 + }
  593 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/upload/utils/FileUtil.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.upload.utils;
  2 +
  3 +import android.content.ContentValues;
  4 +import android.content.Context;
  5 +import android.database.Cursor;
  6 +import android.graphics.Bitmap;
  7 +import android.net.Uri;
  8 +import android.os.Environment;
  9 +import android.provider.MediaStore;
  10 +import android.util.Log;
  11 +
  12 +import java.io.File;
  13 +import java.io.FileInputStream;
  14 +import java.io.FileOutputStream;
  15 +import java.io.IOException;
  16 +import java.io.InputStream;
  17 +import java.io.OutputStream;
  18 +import java.util.UUID;
  19 +
  20 +/**
  21 + * Created by xiansong on 2017/9/20.
  22 + */
  23 +
  24 +public class FileUtil {
  25 + /**
  26 + * Java文件操作 获取文件扩展名
  27 + */
  28 + public static String getExtensionName(String filename) {
  29 + if ((filename != null) && (filename.length() > 0)) {
  30 + int dot = filename.lastIndexOf('.');
  31 + if ((dot > -1) && (dot < (filename.length() - 1))) {
  32 + return filename.substring(dot + 1);
  33 + }
  34 + }
  35 + return "";
  36 + }
  37 +
  38 +
  39 + public static String getExternalStorageDirctory(Context context, String folderName) {
  40 + File storageDir = new File(Environment.getExternalStorageDirectory() + File.separator + context.getPackageName() + File.separator);
  41 + File folderDir = new File(Environment.getExternalStorageDirectory() + File.separator + context.getPackageName() + File.separator + folderName + File.separator);
  42 + if (!storageDir.exists()) storageDir.mkdirs();
  43 + if (!folderDir.exists()) folderDir.mkdirs();
  44 + return Environment.getExternalStorageDirectory() + File.separator +
  45 + context.getPackageName() + File.separator +
  46 + folderName + File.separator;
  47 + }
  48 +
  49 + /**
  50 + * 拷贝Logo 到 SD卡
  51 + *
  52 + * @param context
  53 + * @param filename
  54 + */
  55 + public static String copyAssetsFile(Context context, String folderName, String filename) {
  56 + String uri = getExternalStorageDirctory(context, folderName) + filename;
  57 + if (!new File(uri).exists()) {
  58 + try {
  59 + InputStream in = context.getAssets().open(filename);
  60 + OutputStream out = new FileOutputStream(uri);
  61 + byte[] buffer = new byte[1024];
  62 + int read;
  63 + while ((read = in.read(buffer)) != -1) out.write(buffer, 0, read);
  64 + in.close();
  65 + out.flush();
  66 + out.close();
  67 + } catch (Exception e) {
  68 + Log.e("tag", e.getMessage());
  69 + }
  70 + }
  71 + return uri;
  72 + }
  73 +
  74 + /**
  75 + * 转换 content:// uri
  76 + *
  77 + * @param imageFile
  78 + * @return
  79 + */
  80 + public static Uri getImageContentUri(Context context, File imageFile) {
  81 + String filePath = imageFile.getAbsolutePath();
  82 + Cursor cursor = context.getContentResolver().query(
  83 + MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
  84 + new String[]{MediaStore.Images.Media._ID},
  85 + MediaStore.Images.Media.DATA + "=? ",
  86 + new String[]{filePath}, null);
  87 +
  88 + if (cursor != null && cursor.moveToFirst()) {
  89 + int id = cursor.getInt(cursor
  90 + .getColumnIndex(MediaStore.MediaColumns._ID));
  91 + Uri baseUri = Uri.parse("content://media/external/images/media");
  92 + return Uri.withAppendedPath(baseUri, "" + id);
  93 + } else {
  94 + if (imageFile.exists()) {
  95 + ContentValues values = new ContentValues();
  96 + values.put(MediaStore.Images.Media.DATA, filePath);
  97 + return context.getContentResolver().insert(
  98 + MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
  99 + } else {
  100 + return null;
  101 + }
  102 + }
  103 + }
  104 +
  105 + /**
  106 + * 复制单个文件
  107 + * @param oldPath String 原文件路径 如:c:/fqf.txt
  108 + * @param newPath String 复制后路径 如:f:/fqf.txt
  109 + * @return boolean
  110 + */
  111 + public static void copyFile(String oldPath, String newPath) {
  112 + try {
  113 + int bytesum = 0;
  114 + int byteread = 0;
  115 + File oldfile = new File(oldPath);
  116 + if (oldfile.exists()) { //文件存在时
  117 + InputStream inStream = new FileInputStream(oldPath); //读入原文件
  118 + FileOutputStream fs = new FileOutputStream(newPath);
  119 + byte[] buffer = new byte[1444];
  120 + int length;
  121 + while ( (byteread = inStream.read(buffer)) != -1) {
  122 + bytesum += byteread; //字节数 文件大小
  123 + System.out.println(bytesum);
  124 + fs.write(buffer, 0, byteread);
  125 + }
  126 + inStream.close();
  127 + }
  128 + }
  129 + catch (Exception e) {
  130 + System.out.println("复制单个文件操作出错");
  131 + e.printStackTrace();
  132 +
  133 + }
  134 +
  135 + }
  136 +
  137 + public static String isExistDir(String saveDir) throws IOException {
  138 + File downloadFile = new File(saveDir);
  139 + if (!downloadFile.mkdirs()) {
  140 + downloadFile.createNewFile();
  141 + }
  142 + String savePath = downloadFile.getAbsolutePath();
  143 + return savePath;
  144 + }
  145 +
  146 + public static String getRootPath(Context context,String filePath) {
  147 + File cacheRootFile = !isExternalStorageWritable() ? context.getFilesDir() : context.getExternalCacheDir();
  148 + return cacheRootFile.getAbsolutePath()+ File.separator+filePath+File.separator;
  149 + }
  150 +
  151 +
  152 + public static boolean isExternalStorageWritable() {
  153 + String state = Environment.getExternalStorageState();
  154 + if (Environment.MEDIA_MOUNTED.equals(state)) {
  155 + return true;
  156 + }
  157 + return false;
  158 + }
  159 +
  160 + /*
  161 + * 保存bitmap到本地
  162 + * */
  163 + public static String saveBitmap(Context context, Bitmap mBitmap) {
  164 + String savePath;
  165 + File filePic;
  166 + savePath = context.getCacheDir().getAbsolutePath();
  167 + try {
  168 + filePic = new File(savePath + UUID.randomUUID().toString() + ".jpg");
  169 + if (!filePic.exists()) {
  170 + filePic.getParentFile().mkdirs();
  171 + filePic.createNewFile();
  172 + }
  173 + FileOutputStream fos = new FileOutputStream(filePic);
  174 + mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
  175 + fos.flush();
  176 + fos.close();
  177 + } catch (IOException e) {
  178 + // TODO Auto-generated catch block
  179 + e.printStackTrace();
  180 + return null;
  181 + }
  182 +
  183 + return filePic.getAbsolutePath();
  184 + }
  185 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/upload/utils/IDUtils.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.upload.utils;
  2 +
  3 +public class IDUtils {
  4 + private static byte[] lock = new byte[0];
  5 +
  6 + // 位数,默认是8位
  7 + private final static long w = 100000000;
  8 +
  9 + public static String createID() {
  10 + long r = 0;
  11 + synchronized (lock) {
  12 + r = (long) ((Math.random() + 1) * w);
  13 + }
  14 +
  15 + return System.currentTimeMillis() + String.valueOf(r).substring(1);
  16 + }
  17 +}
0 \ No newline at end of file 18 \ No newline at end of file
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/upload/utils/MD5.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.upload.utils;
  2 +
  3 +import android.app.Activity;
  4 +import android.os.Bundle;
  5 +import android.util.Log;
  6 +
  7 +import java.io.File;
  8 +import java.io.FileInputStream;
  9 +import java.math.BigInteger;
  10 +import java.security.MessageDigest;
  11 +import java.util.HashMap;
  12 +import java.util.Map;
  13 +
  14 +/**
  15 + * Author by Yuansiwen.com, Date on 2018/11/29.
  16 + * PS: Not easy to write code, please indicate.
  17 + */
  18 +public class MD5 extends Activity {
  19 +
  20 + @Override
  21 + protected void onCreate(Bundle savedInstanceState) {
  22 + // TODO Auto-generated method stub
  23 + super.onCreate(savedInstanceState);
  24 + File file = new File("/mnt/sdcard/123.txt");
  25 + Log.e("MD5", getFileMD5(file));
  26 + }
  27 +
  28 + /**
  29 + * 获取单个文件的MD5值!
  30 +
  31 + * @param file
  32 + * @return
  33 + */
  34 +
  35 + public static String getFileMD5(File file) {
  36 + if (!file.isFile()) {
  37 + return null;
  38 + }
  39 + MessageDigest digest = null;
  40 + FileInputStream in = null;
  41 + byte buffer[] = new byte[1024];
  42 + int len;
  43 + try {
  44 + digest = MessageDigest.getInstance("MD5");
  45 + in = new FileInputStream(file);
  46 + while ((len = in.read(buffer, 0, 1024)) != -1) {
  47 + digest.update(buffer, 0, len);
  48 + }
  49 + in.close();
  50 + } catch (Exception e) {
  51 + e.printStackTrace();
  52 + return null;
  53 + }
  54 + BigInteger bigInt = new BigInteger(1, digest.digest());
  55 + return bigInt.toString(16);
  56 + }
  57 +
  58 + /**
  59 + * 获取文件夹中文件的MD5值
  60 + *
  61 + * @param file
  62 + * @param listChild
  63 + * ;true递归子目录中的文件
  64 + * @return
  65 + */
  66 + public static Map<String, String> getDirMD5(File file, boolean listChild) {
  67 + if (!file.isDirectory()) {
  68 + return null;
  69 + }
  70 + Map<String, String> map = new HashMap<String, String>();
  71 + String md5;
  72 + File files[] = file.listFiles();
  73 + for (int i = 0; i < files.length; i++) {
  74 + File f = files[i];
  75 + if (f.isDirectory() && listChild) {
  76 + map.putAll(getDirMD5(f, listChild));
  77 + } else {
  78 + md5 = getFileMD5(f);
  79 + if (md5 != null) {
  80 + map.put(f.getPath(), md5);
  81 + }
  82 + }
  83 + }
  84 + return map;
  85 + }
  86 +
  87 +}
  88 +
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/upload/utils/MD5Utils.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.upload.utils;
  2 +
  3 +/**
  4 + * Created by xiansong on 2018/3/28.
  5 + */
  6 +
  7 +import android.support.annotation.NonNull;
  8 +
  9 +import java.io.File;
  10 +import java.io.FileInputStream;
  11 +import java.io.FileNotFoundException;
  12 +import java.io.IOException;
  13 +import java.nio.ByteBuffer;
  14 +import java.nio.channels.FileChannel;
  15 +import java.security.MessageDigest;
  16 +import java.security.NoSuchAlgorithmException;
  17 +import java.util.Arrays;
  18 +
  19 +/**
  20 + * Created by Lynn on 6/28/2017.
  21 + */
  22 +
  23 +public class MD5Utils {
  24 +
  25 + private static final char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  26 + 'a', 'b', 'c', 'd', 'e', 'f'};
  27 +
  28 + /**
  29 + * Get MD5 of a file (lower case)
  30 + *
  31 + * @return empty string if I/O error when get MD5
  32 + */
  33 + @NonNull
  34 + public static String getFileMD5(@NonNull File file) {
  35 +
  36 + FileInputStream in = null;
  37 + try {
  38 + in = new FileInputStream(file);
  39 + FileChannel ch = in.getChannel();
  40 + return MD5(ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length()));
  41 + } catch (FileNotFoundException e) {
  42 + return "";
  43 + } catch (IOException e) {
  44 + return "";
  45 + } finally {
  46 + if (in != null) {
  47 + try {
  48 + in.close();
  49 + } catch (IOException e) {
  50 + // 关闭流产生的错误一般都可以忽略
  51 + }
  52 + }
  53 + }
  54 +
  55 + }
  56 +
  57 + /**
  58 + * MD5校验字符串
  59 + *
  60 + * @param s String to be MD5
  61 + * @return 'null' if cannot get MessageDigest
  62 + */
  63 + @NonNull
  64 + public static String getStringMD5(@NonNull String s) {
  65 + MessageDigest mdInst;
  66 + try {
  67 + // 获得MD5摘要算法的 MessageDigest 对象
  68 + mdInst = MessageDigest.getInstance("MD5");
  69 + } catch (NoSuchAlgorithmException e) {
  70 + e.printStackTrace();
  71 + return "";
  72 + }
  73 +
  74 + byte[] btInput = s.getBytes();
  75 + // 使用指定的字节更新摘要
  76 + mdInst.update(btInput);
  77 + // 获得密文
  78 + byte[] md = mdInst.digest();
  79 + // 把密文转换成十六进制的字符串形式
  80 + int length = md.length;
  81 + char str[] = new char[length * 2];
  82 + int k = 0;
  83 + for (byte b : md) {
  84 + str[k++] = hexDigits[b >>> 4 & 0xf];
  85 + str[k++] = hexDigits[b & 0xf];
  86 + }
  87 + return new String(str);
  88 + }
  89 +
  90 + @NonNull
  91 + private static String getSubStr(@NonNull String str, int subNu, char replace) {
  92 + int length = str.length();
  93 + if (length > subNu) {
  94 + str = str.substring(length - subNu, length);
  95 + } else if (length < subNu) {
  96 + // NOTE: padding字符填充在字符串的右侧,和服务器的算法是一致的
  97 + str += createPaddingString(subNu - length, replace);
  98 + }
  99 + return str;
  100 + }
  101 +
  102 + @NonNull
  103 + private static String createPaddingString(int n, char pad) {
  104 + if (n <= 0) {
  105 + return "";
  106 + }
  107 +
  108 + char[] paddingArray = new char[n];
  109 + Arrays.fill(paddingArray, pad);
  110 + return new String(paddingArray);
  111 + }
  112 +
  113 + /**
  114 + * 计算MD5校验
  115 + *
  116 + * @param buffer
  117 + * @return 空串,如果无法获得 MessageDigest实例
  118 + */
  119 + @NonNull
  120 + private static String MD5(ByteBuffer buffer) {
  121 + String s = "";
  122 + try {
  123 + MessageDigest md = MessageDigest.getInstance("MD5");
  124 + md.update(buffer);
  125 + byte tmp[] = md.digest(); // MD5 的计算结果是一个 128 位的长整数,
  126 + // 用字节表示就是 16 个字节
  127 + char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
  128 + // 所以表示成 16 进制需要 32 个字符
  129 + int k = 0; // 表示转换结果中对应的字符位置
  130 + for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
  131 + // 转换成 16 进制字符的转换
  132 + byte byte0 = tmp[i]; // 取第 i 个字节
  133 + str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换, >>>,
  134 + // 逻辑右移,将符号位一起右移
  135 + str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
  136 + }
  137 + s = new String(str); // 换后的结果转换为字符串
  138 +
  139 + } catch (NoSuchAlgorithmException e) {
  140 + e.printStackTrace();
  141 + }
  142 + return s;
  143 + }
  144 +}
  145 +
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/FileUtil.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.utils;
  2 +
  3 +import android.content.ContentValues;
  4 +import android.content.Context;
  5 +import android.database.Cursor;
  6 +import android.graphics.Bitmap;
  7 +import android.net.Uri;
  8 +import android.os.Environment;
  9 +import android.provider.MediaStore;
  10 +import android.util.Log;
  11 +
  12 +import java.io.File;
  13 +import java.io.FileInputStream;
  14 +import java.io.FileOutputStream;
  15 +import java.io.IOException;
  16 +import java.io.InputStream;
  17 +import java.io.OutputStream;
  18 +import java.util.UUID;
  19 +
  20 +/**
  21 + * Created by xiansong on 2017/9/20.
  22 + */
  23 +
  24 +public class FileUtil {
  25 + /**
  26 + * Java文件操作 获取文件扩展名
  27 + */
  28 + public static String getExtensionName(String filename) {
  29 + if ((filename != null) && (filename.length() > 0)) {
  30 + int dot = filename.lastIndexOf('.');
  31 + if ((dot > -1) && (dot < (filename.length() - 1))) {
  32 + return filename.substring(dot + 1);
  33 + }
  34 + }
  35 + return "";
  36 + }
  37 +
  38 +
  39 + public static String getExternalStorageDirctory(Context context, String folderName) {
  40 + File storageDir = new File(Environment.getExternalStorageDirectory() + File.separator + context.getPackageName() + File.separator);
  41 + File folderDir = new File(Environment.getExternalStorageDirectory() + File.separator + context.getPackageName() + File.separator + folderName + File.separator);
  42 + if (!storageDir.exists()) storageDir.mkdirs();
  43 + if (!folderDir.exists()) folderDir.mkdirs();
  44 + return Environment.getExternalStorageDirectory() + File.separator +
  45 + context.getPackageName() + File.separator +
  46 + folderName + File.separator;
  47 + }
  48 +
  49 + /**
  50 + * 拷贝Logo 到 SD卡
  51 + *
  52 + * @param context
  53 + * @param filename
  54 + */
  55 + public static String copyAssetsFile(Context context, String folderName, String filename) {
  56 + String uri = getExternalStorageDirctory(context, folderName) + filename;
  57 + if (!new File(uri).exists()) {
  58 + try {
  59 + InputStream in = context.getAssets().open(filename);
  60 + OutputStream out = new FileOutputStream(uri);
  61 + byte[] buffer = new byte[1024];
  62 + int read;
  63 + while ((read = in.read(buffer)) != -1) out.write(buffer, 0, read);
  64 + in.close();
  65 + out.flush();
  66 + out.close();
  67 + } catch (Exception e) {
  68 + Log.e("tag", e.getMessage());
  69 + }
  70 + }
  71 + return uri;
  72 + }
  73 +
  74 + /**
  75 + * 转换 content:// uri
  76 + *
  77 + * @param imageFile
  78 + * @return
  79 + */
  80 + public static Uri getImageContentUri(Context context, File imageFile) {
  81 + String filePath = imageFile.getAbsolutePath();
  82 + Cursor cursor = context.getContentResolver().query(
  83 + MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
  84 + new String[]{MediaStore.Images.Media._ID},
  85 + MediaStore.Images.Media.DATA + "=? ",
  86 + new String[]{filePath}, null);
  87 +
  88 + if (cursor != null && cursor.moveToFirst()) {
  89 + int id = cursor.getInt(cursor
  90 + .getColumnIndex(MediaStore.MediaColumns._ID));
  91 + Uri baseUri = Uri.parse("content://media/external/images/media");
  92 + return Uri.withAppendedPath(baseUri, "" + id);
  93 + } else {
  94 + if (imageFile.exists()) {
  95 + ContentValues values = new ContentValues();
  96 + values.put(MediaStore.Images.Media.DATA, filePath);
  97 + return context.getContentResolver().insert(
  98 + MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
  99 + } else {
  100 + return null;
  101 + }
  102 + }
  103 + }
  104 +
  105 + /**
  106 + * 复制单个文件
  107 + * @param oldPath String 原文件路径 如:c:/fqf.txt
  108 + * @param newPath String 复制后路径 如:f:/fqf.txt
  109 + * @return boolean
  110 + */
  111 + public static void copyFile(String oldPath, String newPath) {
  112 + try {
  113 + int bytesum = 0;
  114 + int byteread = 0;
  115 + File oldfile = new File(oldPath);
  116 + if (oldfile.exists()) { //文件存在时
  117 + InputStream inStream = new FileInputStream(oldPath); //读入原文件
  118 + FileOutputStream fs = new FileOutputStream(newPath);
  119 + byte[] buffer = new byte[1444];
  120 + int length;
  121 + while ( (byteread = inStream.read(buffer)) != -1) {
  122 + bytesum += byteread; //字节数 文件大小
  123 + System.out.println(bytesum);
  124 + fs.write(buffer, 0, byteread);
  125 + }
  126 + inStream.close();
  127 + }
  128 + }
  129 + catch (Exception e) {
  130 + System.out.println("复制单个文件操作出错");
  131 + e.printStackTrace();
  132 +
  133 + }
  134 +
  135 + }
  136 +
  137 + public static String isExistDir(String saveDir) throws IOException {
  138 + File downloadFile = new File(saveDir);
  139 + if (!downloadFile.mkdirs()) {
  140 + downloadFile.createNewFile();
  141 + }
  142 + String savePath = downloadFile.getAbsolutePath();
  143 + return savePath;
  144 + }
  145 +
  146 + public static String getRootPath(Context context,String filePath) {
  147 + File cacheRootFile = !isExternalStorageWritable() ? context.getFilesDir() : context.getExternalCacheDir();
  148 + return cacheRootFile.getAbsolutePath()+ File.separator+filePath+File.separator;
  149 + }
  150 +
  151 +
  152 + public static boolean isExternalStorageWritable() {
  153 + String state = Environment.getExternalStorageState();
  154 + if (Environment.MEDIA_MOUNTED.equals(state)) {
  155 + return true;
  156 + }
  157 + return false;
  158 + }
  159 +
  160 + /*
  161 + * 保存bitmap到本地
  162 + * */
  163 + public static String saveBitmap(Context context, Bitmap mBitmap) {
  164 + String savePath;
  165 + File filePic;
  166 + savePath = context.getCacheDir().getAbsolutePath();
  167 + try {
  168 + filePic = new File(savePath + UUID.randomUUID().toString() + ".jpg");
  169 + if (!filePic.exists()) {
  170 + filePic.getParentFile().mkdirs();
  171 + filePic.createNewFile();
  172 + }
  173 + FileOutputStream fos = new FileOutputStream(filePic);
  174 + mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
  175 + fos.flush();
  176 + fos.close();
  177 + } catch (IOException e) {
  178 + // TODO Auto-generated catch block
  179 + e.printStackTrace();
  180 + return null;
  181 + }
  182 +
  183 + return filePic.getAbsolutePath();
  184 + }
  185 +}
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/IDUtils.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.utils;
  2 +
  3 +public class IDUtils {
  4 + private static byte[] lock = new byte[0];
  5 +
  6 + // 位数,默认是8位
  7 + private final static long w = 100000000;
  8 +
  9 + public static String createID() {
  10 + long r = 0;
  11 + synchronized (lock) {
  12 + r = (long) ((Math.random() + 1) * w);
  13 + }
  14 +
  15 + return System.currentTimeMillis() + String.valueOf(r).substring(1);
  16 + }
  17 +}
0 \ No newline at end of file 18 \ No newline at end of file
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/MD5.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.utils;
  2 +
  3 +import android.app.Activity;
  4 +import android.os.Bundle;
  5 +import android.util.Log;
  6 +
  7 +import java.io.File;
  8 +import java.io.FileInputStream;
  9 +import java.math.BigInteger;
  10 +import java.security.MessageDigest;
  11 +import java.util.HashMap;
  12 +import java.util.Map;
  13 +
  14 +/**
  15 + * Author by Yuansiwen.com, Date on 2018/11/29.
  16 + * PS: Not easy to write code, please indicate.
  17 + */
  18 +public class MD5 extends Activity {
  19 +
  20 + @Override
  21 + protected void onCreate(Bundle savedInstanceState) {
  22 + // TODO Auto-generated method stub
  23 + super.onCreate(savedInstanceState);
  24 + File file = new File("/mnt/sdcard/123.txt");
  25 + Log.e("MD5", getFileMD5(file));
  26 + }
  27 +
  28 + /**
  29 + * 获取单个文件的MD5值!
  30 +
  31 + * @param file
  32 + * @return
  33 + */
  34 +
  35 + public static String getFileMD5(File file) {
  36 + if (!file.isFile()) {
  37 + return null;
  38 + }
  39 + MessageDigest digest = null;
  40 + FileInputStream in = null;
  41 + byte buffer[] = new byte[1024];
  42 + int len;
  43 + try {
  44 + digest = MessageDigest.getInstance("MD5");
  45 + in = new FileInputStream(file);
  46 + while ((len = in.read(buffer, 0, 1024)) != -1) {
  47 + digest.update(buffer, 0, len);
  48 + }
  49 + in.close();
  50 + } catch (Exception e) {
  51 + e.printStackTrace();
  52 + return null;
  53 + }
  54 + BigInteger bigInt = new BigInteger(1, digest.digest());
  55 + return bigInt.toString(16);
  56 + }
  57 +
  58 + /**
  59 + * 获取文件夹中文件的MD5值
  60 + *
  61 + * @param file
  62 + * @param listChild
  63 + * ;true递归子目录中的文件
  64 + * @return
  65 + */
  66 + public static Map<String, String> getDirMD5(File file, boolean listChild) {
  67 + if (!file.isDirectory()) {
  68 + return null;
  69 + }
  70 + Map<String, String> map = new HashMap<String, String>();
  71 + String md5;
  72 + File files[] = file.listFiles();
  73 + for (int i = 0; i < files.length; i++) {
  74 + File f = files[i];
  75 + if (f.isDirectory() && listChild) {
  76 + map.putAll(getDirMD5(f, listChild));
  77 + } else {
  78 + md5 = getFileMD5(f);
  79 + if (md5 != null) {
  80 + map.put(f.getPath(), md5);
  81 + }
  82 + }
  83 + }
  84 + return map;
  85 + }
  86 +
  87 +}
  88 +
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/MD5Utils.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.utils;
  2 +
  3 +/**
  4 + * Created by xiansong on 2018/3/28.
  5 + */
  6 +
  7 +import android.support.annotation.NonNull;
  8 +
  9 +import java.io.File;
  10 +import java.io.FileInputStream;
  11 +import java.io.FileNotFoundException;
  12 +import java.io.IOException;
  13 +import java.nio.ByteBuffer;
  14 +import java.nio.channels.FileChannel;
  15 +import java.security.MessageDigest;
  16 +import java.security.NoSuchAlgorithmException;
  17 +import java.util.Arrays;
  18 +
  19 +/**
  20 + * Created by Lynn on 6/28/2017.
  21 + */
  22 +
  23 +public class MD5Utils {
  24 +
  25 + private static final char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  26 + 'a', 'b', 'c', 'd', 'e', 'f'};
  27 +
  28 + /**
  29 + * Get MD5 of a file (lower case)
  30 + *
  31 + * @return empty string if I/O error when get MD5
  32 + */
  33 + @NonNull
  34 + public static String getFileMD5(@NonNull File file) {
  35 +
  36 + FileInputStream in = null;
  37 + try {
  38 + in = new FileInputStream(file);
  39 + FileChannel ch = in.getChannel();
  40 + return MD5(ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length()));
  41 + } catch (FileNotFoundException e) {
  42 + return "";
  43 + } catch (IOException e) {
  44 + return "";
  45 + } finally {
  46 + if (in != null) {
  47 + try {
  48 + in.close();
  49 + } catch (IOException e) {
  50 + // 关闭流产生的错误一般都可以忽略
  51 + }
  52 + }
  53 + }
  54 +
  55 + }
  56 +
  57 + /**
  58 + * MD5校验字符串
  59 + *
  60 + * @param s String to be MD5
  61 + * @return 'null' if cannot get MessageDigest
  62 + */
  63 + @NonNull
  64 + public static String getStringMD5(@NonNull String s) {
  65 + MessageDigest mdInst;
  66 + try {
  67 + // 获得MD5摘要算法的 MessageDigest 对象
  68 + mdInst = MessageDigest.getInstance("MD5");
  69 + } catch (NoSuchAlgorithmException e) {
  70 + e.printStackTrace();
  71 + return "";
  72 + }
  73 +
  74 + byte[] btInput = s.getBytes();
  75 + // 使用指定的字节更新摘要
  76 + mdInst.update(btInput);
  77 + // 获得密文
  78 + byte[] md = mdInst.digest();
  79 + // 把密文转换成十六进制的字符串形式
  80 + int length = md.length;
  81 + char str[] = new char[length * 2];
  82 + int k = 0;
  83 + for (byte b : md) {
  84 + str[k++] = hexDigits[b >>> 4 & 0xf];
  85 + str[k++] = hexDigits[b & 0xf];
  86 + }
  87 + return new String(str);
  88 + }
  89 +
  90 + @NonNull
  91 + private static String getSubStr(@NonNull String str, int subNu, char replace) {
  92 + int length = str.length();
  93 + if (length > subNu) {
  94 + str = str.substring(length - subNu, length);
  95 + } else if (length < subNu) {
  96 + // NOTE: padding字符填充在字符串的右侧,和服务器的算法是一致的
  97 + str += createPaddingString(subNu - length, replace);
  98 + }
  99 + return str;
  100 + }
  101 +
  102 + @NonNull
  103 + private static String createPaddingString(int n, char pad) {
  104 + if (n <= 0) {
  105 + return "";
  106 + }
  107 +
  108 + char[] paddingArray = new char[n];
  109 + Arrays.fill(paddingArray, pad);
  110 + return new String(paddingArray);
  111 + }
  112 +
  113 + /**
  114 + * 计算MD5校验
  115 + *
  116 + * @param buffer
  117 + * @return 空串,如果无法获得 MessageDigest实例
  118 + */
  119 + @NonNull
  120 + private static String MD5(ByteBuffer buffer) {
  121 + String s = "";
  122 + try {
  123 + MessageDigest md = MessageDigest.getInstance("MD5");
  124 + md.update(buffer);
  125 + byte tmp[] = md.digest(); // MD5 的计算结果是一个 128 位的长整数,
  126 + // 用字节表示就是 16 个字节
  127 + char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
  128 + // 所以表示成 16 进制需要 32 个字符
  129 + int k = 0; // 表示转换结果中对应的字符位置
  130 + for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
  131 + // 转换成 16 进制字符的转换
  132 + byte byte0 = tmp[i]; // 取第 i 个字节
  133 + str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换, >>>,
  134 + // 逻辑右移,将符号位一起右移
  135 + str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
  136 + }
  137 + s = new String(str); // 换后的结果转换为字符串
  138 +
  139 + } catch (NoSuchAlgorithmException e) {
  140 + e.printStackTrace();
  141 + }
  142 + return s;
  143 + }
  144 +}
  145 +