Commit 761995aa3da713ce305f4314d7ccb067d89e06f7

Authored by 杨帅
1 parent f4aa2c68

1.赛事详情

Showing 27 changed files with 1051 additions and 60 deletions
library_baidumap/build.gradle
... ... @@ -43,4 +43,11 @@ dependencies {
43 43 implementation "com.alibaba:arouter-api:$rootProject.arouterApiVersion"
44 44 annotationProcessor "com.alibaba:arouter-compiler:$rootProject.arouterCompilerVersion"
45 45 api files('libs/BaiduLBS_Android.jar')
  46 + api files('libs/BaiduTraceSDK_v3_1_0.jar')
  47 + api files('libs/bos-android-sdk-1.0.3.jar')
  48 +// api files('libs/okhttp-3.8.1.jar')
  49 +// api files('libs/okio-1.13.0.jar')
  50 +
46 51 }
  52 +
  53 +
... ...
library_baidumap/libs/BaiduTraceSDK_v3_1_0.jar 0 → 100644
No preview for this file type
library_baidumap/libs/bos-android-sdk-1.0.3.jar 0 → 100644
No preview for this file type
library_baidumap/libs/okhttp-3.8.1.jar 0 → 100644
No preview for this file type
library_baidumap/libs/okio-1.13.0.jar 0 → 100644
No preview for this file type
library_baidumap/src/main/AndroidManifest.xml
... ... @@ -24,6 +24,12 @@
24 24 android:name="com.baidu.location.f"
25 25 android:enabled="true"
26 26 android:process=":remote" />
  27 +
  28 + <service
  29 + android:name="com.baidu.trace.LBSTraceService"
  30 + android:enabled="true"
  31 + android:process=":remote"></service>
  32 +
27 33 <activity android:name="com.cnlive.baidumap.BaiduMapMainActivity"></activity>
28 34 </application>
29 35  
... ...
library_baidumap/src/main/java/com/cnlive/baidumap/InitBaidu.java deleted 100644 → 0
1   -package com.cnlive.baidumap;
2   -
3   -import android.content.Context;
4   -
5   -import com.baidu.mapapi.CoordType;
6   -import com.baidu.mapapi.SDKInitializer;
7   -
8   -public class InitBaidu {
9   - public static void init(Context context) {
10   - //在使用SDK各组件之前初始化context信息,传入ApplicationContext
11   - SDKInitializer.initialize(context);
12   - //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
13   - //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
14   - SDKInitializer.setCoordType(CoordType.GCJ02);
15   - }
16   -}
library_baidumap/src/main/jniLibs/arm64-v8a/libBaiduTraceSDK_v3_1_0.so 0 → 100644
No preview for this file type
library_baidumap/src/main/jniLibs/armeabi-v7a/libBaiduTraceSDK_v3_1_0.so 0 → 100644
No preview for this file type
library_baidumap/src/main/jniLibs/armeabi/libBaiduTraceSDK_v3_1_0.so 0 → 100644
No preview for this file type
library_baidumap/src/main/jniLibs/x86/libBaiduTraceSDK_v3_1_0.so 0 → 100644
No preview for this file type
library_baidumap/src/main/jniLibs/x86_64/libBaiduTraceSDK_v3_1_0.so 0 → 100644
No preview for this file type
moudle_pedometer/build.gradle
... ... @@ -110,3 +110,9 @@ dependencies {
110 110 implementation project(':library_baidumap')
111 111  
112 112 }
  113 +
  114 +configurations {
  115 + all*.exclude group: 'com.squareup.okhttp3', module: 'okhttp'
  116 + all*.exclude group: 'com.squareup.okio'
  117 +
  118 +}
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/presenter/RunningMapFragmentPresenter.java
1 1 package com.cnlive.moudle.pedometer.frame.presenter;
2 2  
  3 +import android.content.Context;
  4 +import android.graphics.Bitmap;
  5 +import android.graphics.BitmapFactory;
  6 +import android.widget.Toast;
  7 +
  8 +import com.baidu.mapapi.map.BitmapDescriptorFactory;
  9 +import com.baidu.mapapi.map.MarkerOptions;
  10 +import com.baidu.mapapi.map.OverlayOptions;
  11 +import com.baidu.mapapi.model.LatLng;
  12 +import com.baidu.trace.api.entity.EntityListResponse;
  13 +import com.baidu.trace.api.entity.OnEntityListener;
  14 +import com.baidu.trace.api.entity.UpdateEntityResponse;
  15 +import com.baidu.trace.api.track.HistoryTrackRequest;
  16 +import com.baidu.trace.api.track.HistoryTrackResponse;
  17 +import com.baidu.trace.api.track.LatestPointResponse;
  18 +import com.baidu.trace.api.track.OnTrackListener;
  19 +import com.baidu.trace.api.track.SupplementMode;
  20 +import com.baidu.trace.api.track.TrackPoint;
  21 +import com.baidu.trace.model.ProcessOption;
  22 +import com.baidu.trace.model.SortType;
  23 +import com.baidu.trace.model.StatusCodes;
  24 +import com.baidu.trace.model.TraceLocation;
  25 +import com.baidu.trace.model.TransportMode;
3 26 import com.cnlive.moudle.pedometer.frame.view.RunningMapFragmentView;
  27 +import com.cnlive.moudle.pedometer.model.Constant;
  28 +import com.cnlive.moudle.pedometer.service.StepService;
  29 +import com.cnlive.moudle.pedometer.utils.BitmapUtil;
  30 +import com.cnlive.moudle.pedometer.utils.CommonUtil;
  31 +import com.cnlive.moudle.pedometer.utils.MapUtil;
  32 +import com.cnlive.moudle.pedometer.utils.MyMapUtil;
  33 +import com.example.moudle_pedometer.R;
4 34 import com.hannesdorfmann.mosby3.mvp.MvpBasePresenter;
5 35  
  36 +import java.util.ArrayList;
  37 +import java.util.List;
  38 +
6 39 public class RunningMapFragmentPresenter extends MvpBasePresenter<RunningMapFragmentView> {
  40 + /******轨迹查询相关******/
  41 + //分页大小
  42 + private int pageSize = 1000;
  43 + //分页索引
  44 + private int pageIndex = 1;
  45 + /**
  46 + * 历史轨迹请求
  47 + */
  48 + private HistoryTrackRequest historyTrackRequest;
  49 + /**
  50 + * 轨迹点集合
  51 + */
  52 + private List<LatLng> trackPoints;
  53 +
  54 + /**
  55 + * 查询历史轨迹
  56 + *
  57 + * @param startTime
  58 + * @param endTime
  59 + */
  60 + public void queryHistoryTrace(Context context, String entityName, long startTime, long endTime) {
  61 + if (historyTrackRequest == null) {
  62 + historyTrackRequest = new HistoryTrackRequest();
  63 + //设置查询设备名称
  64 + historyTrackRequest.setEntityName(entityName);
  65 + //历史轨迹开始时间
  66 + historyTrackRequest.setStartTime(startTime);
  67 + //历史轨迹结束时间
  68 + historyTrackRequest.setEndTime(endTime);
  69 + //分页索引
  70 + historyTrackRequest.setPageIndex(pageIndex);
  71 + //分页大小
  72 + historyTrackRequest.setPageSize(pageSize);
  73 + //设置是否进行纠偏
  74 + historyTrackRequest.setProcessed(true);
  75 + //其他设置
  76 + ProcessOption processOption = new ProcessOption();
  77 + //去噪:可设置是否需要去除角度、速度和方向异常的轨迹点
  78 + processOption.setNeedDenoise(true);
  79 + //绑路:设置是否将轨迹点绑定至路网道路
  80 + processOption.setNeedMapMatch(false);
  81 + //抽稀:设置是否进行抽稀处理,对冗余的轨迹点进行抽稀去除处理,如一条直线上除起终点外的多个轨迹点
  82 + processOption.setNeedVacuate(true);
  83 + //自动判断交通方式
  84 + processOption.setTransportMode(TransportMode.auto);
  85 + // 设置精度过滤值(定位精度大于100米的过滤掉)
  86 + processOption.setRadiusThreshold(100);
  87 + // 设置纠偏选项
  88 + historyTrackRequest.setProcessOption(processOption);
  89 + // 设置里程填充方式为驾车
  90 + historyTrackRequest.setSupplementMode(SupplementMode.walking);
  91 +
  92 + }
  93 + if (trackPoints == null) {
  94 + trackPoints = new ArrayList<>();
  95 + }
  96 + //轨迹查询监听器
  97 + OnTrackListener historyTrackListener = new OnTrackListener() {
  98 + @Override
  99 + public void onHistoryTrackCallback(HistoryTrackResponse response) {
  100 + super.onHistoryTrackCallback(response);
  101 + int total = response.getTotal();
  102 + if (StatusCodes.SUCCESS != response.getStatus()) {
  103 + } else if (0 == total) {
  104 + Toast.makeText(context, "暂未查到您的轨迹,请稍后重试!", Toast.LENGTH_SHORT).show();
  105 + } else {
  106 + //查询到轨迹
  107 + List<TrackPoint> points = response.getTrackPoints();
  108 + if (null != points) {
  109 + for (TrackPoint trackPoint : points) {
  110 + if (!CommonUtil.isZeroPoint(trackPoint.getLocation().getLatitude(),
  111 + trackPoint.getLocation().getLongitude())) {
  112 + //将轨迹点转换为地图坐标点
  113 + trackPoints.add(MyMapUtil.convertTrace2Map(trackPoint.getLocation()));
  114 + }
  115 + }
  116 + }
  117 + }
  118 + if (total > pageSize * pageIndex) {
  119 + historyTrackRequest.setPageIndex(++pageIndex);
  120 + queryHistoryTrace(context, entityName, startTime, endTime);
  121 + } else {
  122 + if (getView() != null) {
  123 + MyMapUtil.drawHistoryTrack(context, getView().baiduMap, trackPoints, SortType.asc, R.color.red, R.drawable.icon_start, R.drawable.run_map_icon_end);
  124 + }
  125 + }
  126 + }
  127 +
  128 + @Override
  129 + public void onLatestPointCallback(LatestPointResponse latestPointResponse) {
  130 + super.onLatestPointCallback(latestPointResponse);
  131 + if (StatusCodes.SUCCESS != latestPointResponse.getStatus()) {
  132 + } else {
  133 + Bitmap startPointBitmap = BitmapUtil.getBitmapFromDp(context, BitmapFactory.decodeResource(context.getResources(), R.drawable.run_map_icon_start), 40, 40);
  134 + OverlayOptions startOptions = new MarkerOptions()
  135 + .position(MyMapUtil.convertTrace2Map(latestPointResponse.getLatestPoint().getLocation())).icon(BitmapDescriptorFactory.fromBitmap(startPointBitmap));
  136 + if (getView() != null) {
  137 + getView().baiduMap.addOverlay(startOptions);
  138 + }
  139 + }
  140 + }
  141 + };
  142 + //开始查询历史轨迹
  143 + if (StepService.mClient != null) {
  144 + StepService.mClient.queryHistoryTrack(historyTrackRequest, historyTrackListener);
  145 +
  146 + }
  147 +
  148 + }
  149 +
7 150 }
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/view/RunMainFragmentView.java
... ... @@ -34,6 +34,7 @@ public class RunMainFragmentView implements MvpView {
34 34 private int stopIndex = 0;//停止按钮,计数
35 35 private Handler handler;
36 36 private Runnable runnable;
  37 + private Runnable animRunnable;
37 38  
38 39 private long mRecordTime;//计时时间
39 40 private boolean firstTimeFlag;//是否是首次计时
... ... @@ -217,31 +218,39 @@ public class RunMainFragmentView implements MvpView {
217 218  
218 219 ButtonAnimUtil.setViewZoomIn(fragment.binding.flStop);
219 220 stopStartFlag = true;
220   - runnable = new Runnable() {
  221 + animRunnable = new Runnable() {
221 222 @Override
222 223 public void run() {
223 224 if (stopStartFlag) {
224 225 stopIndex += 5;
225 226 if (stopIndex <= 100) {
226   - handler.postDelayed(runnable, 20);
  227 + handler.postDelayed(animRunnable, 20);
227 228 fragment.binding.cpCurrent.setProgress(stopIndex);
228 229 fragment.binding.flStopTip.setVisibility(View.VISIBLE);
229 230 if (stopIndex == 100) {
230 231 //
231 232 fragment.binding.flStopTip.setVisibility(View.INVISIBLE);
232 233  
  234 +
233 235 SelectDialog selectDialog = new SelectDialog(fragment.getActivity(), "确定结束运动吗?", "确定", new SelectDialog.DialogInterface() {
234 236 @Override
235 237 public void onClick(SelectDialog dialog) {
  238 + fragment.binding.cpCurrent.setVisibility(View.GONE);
  239 + ButtonAnimUtil.setViewDefault(fragment.binding.flStop);
236 240 fragment.getActivity().stopService(new Intent(fragment.getActivity(), StepService.class));
237 241 //清空数据
238 242 StepUtil.clearRunData(getContext(), uid);
239 243 dialog.dismiss();
  244 + if (StepService.mClient != null) {
  245 + StepService.mClient.stopGather(StepService.traceListener);
  246 + }
240 247 // fragment.getActivity().finish();
241 248 }
242 249 }, "取消", new SelectDialog.DialogInterface() {
243 250 @Override
244 251 public void onClick(SelectDialog dialog) {
  252 + fragment.binding.cpCurrent.setVisibility(View.GONE);
  253 + ButtonAnimUtil.setViewDefault(fragment.binding.flStop);
245 254 dialog.cancel();
246 255 }
247 256 });
... ... @@ -254,7 +263,7 @@ public class RunMainFragmentView implements MvpView {
254 263 }
255 264 }
256 265 };
257   - handler.postDelayed(runnable, 20);
  266 + handler.postDelayed(animRunnable, 20);
258 267  
259 268 }
260 269 } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/view/RunRaceDetailFragmentView.java
... ... @@ -44,8 +44,6 @@ import com.baidu.mapapi.search.route.WalkingRouteResult;
44 44 import com.cnlive.moudle.pedometer.ui.activity.PedometerMainActivity;
45 45 import com.cnlive.moudle.pedometer.ui.activity.RaceRecordActivity;
46 46 import com.cnlive.moudle.pedometer.ui.activity.RegistrationInfoActivity;
47   -import com.cnlive.moudle.pedometer.ui.activity.RunningMapActivity;
48   -import com.cnlive.moudle.pedometer.ui.fragment.RunMainFragment;
49 47 import com.cnlive.moudle.pedometer.ui.fragment.RunRaceDetailFragment;
50 48 import com.cnlive.moudle.pedometer.utils.BitmapUtil;
51 49 import com.cnlive.moudle.pedometer.utils.ScreenUtil;
... ... @@ -53,8 +51,8 @@ import com.example.moudle_pedometer.R;
53 51 import com.hannesdorfmann.mosby3.mvp.MvpView;
54 52 import com.sothree.slidinguppanel.SlidingUpPanelLayout;
55 53  
56   -import java.io.LineNumberReader;
57 54 import java.util.ArrayList;
  55 +import java.util.LinkedList;
58 56 import java.util.List;
59 57  
60 58 public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
... ... @@ -68,7 +66,7 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
68 66 private BitmapDescriptor mCurrentMarker;//定位图标
69 67 private static int accuracyCircleFillColor;
70 68 private static int accuracyCircleStrokeColor;
71   - private static MyLocationData mylocation;
  69 + private static MyLocationData followMyLocation;
72 70 boolean isFirstLoc = true; // 是否首次定位
73 71 private MarkerOptions currentMark;
74 72 private MarkerOptions endMark;
... ... @@ -77,8 +75,8 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
77 75 private LatLng firstLatLng;
78 76 private Double lastX = 0.0;
79 77 private int mCurrentDirection = 0;
80   - private double mCurrentLat = 0.0;
81   - private double mCurrentLon = 0.0;
  78 + // private double mCurrentLat = 0.0;
  79 +// private double mCurrentLon = 0.0;
82 80 private float mCurrentAccracy;
83 81 // 定位相关
84 82 private LocationClient mLocClient;
... ... @@ -92,8 +90,8 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
92 90 private String startPoint = "首都师范大学南门";
93 91 private String endPoint = "首都师范大学篮球场";
94 92  
95   - private List<LatLng> importLatLngs;//关键点
96   - private LatLng startLatLng = new LatLng(39.934266, 116.309228);//起始点
  93 + private LinkedList<LatLng> importLatLngs;//关键点
  94 + private LatLng startLatLng = new LatLng(39.934733, 116.308646);//起始点
97 95  
98 96 public RunRaceDetailFragmentView(RunRaceDetailFragment fragment) {
99 97 this.fragment = fragment;
... ... @@ -109,17 +107,20 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
109 107 }
110 108 initMap();
111 109 //初始化运营人员所选的关键点
112   - importLatLngs = new ArrayList<>();
113   - //北轨山区社区
114   -// importLatLngs.add(new LatLng(39.933295, 116.308663));
115   - //中国体育彩票
116   - importLatLngs.add(new LatLng(39.933065, 116.309838));
117   - //花园桥招待所
118   - importLatLngs.add(new LatLng(39.933094, 116.310927));
119   -// //砂锅时代问题
120   -// importLatLngs.add(new LatLng(39.933481, 116.311834));
121   -// //好邻居便利店
122   - importLatLngs.add(new LatLng(39.933736, 116.312365));
  110 + importLatLngs = new LinkedList<>();
  111 +// importLatLngs.add(new LatLng(39.935861,116.308621));
  112 +// importLatLngs.add(new LatLng( 39.934948,116.308605));
  113 +// importLatLngs.add(new LatLng( 39.934516,116.3086));
  114 +// importLatLngs.add(new LatLng( 39.934121,116.30861));
  115 +// importLatLngs.add(new LatLng( 39.934105,116.308605));
  116 +//
  117 +//
  118 +// importLatLngs.add(new LatLng( 39.933702,116.3086));
  119 + importLatLngs.add(new LatLng(39.933890, 116.308726));
  120 + importLatLngs.add(new LatLng(39.933943, 116.309627));
  121 + importLatLngs.add(new LatLng(39.934733, 116.309515));
  122 + importLatLngs.add(new LatLng(39.934733, 116.308742));
  123 +
123 124  
124 125 // searchRouteResult(new LatLng(39.934266, 116.309228), new LatLng(39.939756, 116.319766), 0);
125 126  
... ... @@ -269,7 +270,7 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
269 270 /**
270 271 * 开始路线规划
271 272 */
272   - public void searchRouteResult(LatLng StartPoint, LatLng EndPoint, int index) {
  273 + public void searchRouteResult(LatLng StartPoint, LatLng EndPoint, int index, int listSize) {
273 274 Log.e(TAG, "searchRouteResult: ");
274 275 float currentZoom = baiduMap.getMapStatus().zoom;
275 276 // 设置起终点信息,对于tranist search 来说,城市名无意义
... ... @@ -278,7 +279,6 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
278 279 routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {
279 280 @Override
280 281 public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
281   - Log.e(TAG, "onGetWalkingRouteResult: ");
282 282 if (fragment.getActivity() == null) {
283 283 return;
284 284 }
... ... @@ -293,7 +293,9 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
293 293 if (walkingRouteResult.getRouteLines() != null) {
294 294 if (walkingRouteResult.getRouteLines().get(0).getAllStep().get(0).getWayPoints().size() > 0) {
295 295 //添加起点坐标
296   -// points.add(StartPoint);
  296 + if (index == 0) {
  297 + points.add(StartPoint);
  298 + }
297 299 for (int i = 0; i < walkingRouteResult.getRouteLines().get(0).getAllStep().size(); i++) {
298 300 for (int j = 0; j < walkingRouteResult.getRouteLines().get(0).getAllStep().get(i).getWayPoints().size(); j++) {
299 301 points.add(walkingRouteResult.getRouteLines().get(0).getAllStep().get(i).getWayPoints().get(j));
... ... @@ -301,9 +303,9 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
301 303 }
302 304 }
303 305 //添加终点坐标
304   -// if (endLatLng != null) {
  306 + if (endLatLng != null) {
305 307 // points.add(endLatLng);
306   -// }
  308 + }
307 309  
308 310 ArrayList<Integer> traffics = new ArrayList<Integer>();
309 311 for (int i = 0; i < points.size(); i++) {
... ... @@ -333,7 +335,26 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
333 335 .points(points)
334 336 .customTextureList(getCustomTextureList())
335 337 .textureIndex(traffics);//设置纹理列表
336   - //在地图上绘制折线
  338 + //在地图上绘制起点
  339 + if (index == 0) {
  340 + //显示当前位置图标
  341 + Bitmap pointBitmap = BitmapUtil.getBitmapFromDp(getContext(), BitmapFactory.decodeResource(getContext().getResources(), R.drawable.icon_start), 30, 30);
  342 + startMark = new MarkerOptions()
  343 + .position(StartPoint)
  344 + .icon(BitmapDescriptorFactory.fromBitmap(pointBitmap));
  345 +// startMark.anchor(0.5f, 0.55f);
  346 + baiduMap.addOverlay(startMark);
  347 + } else if (index == listSize - 1) {
  348 + //显示当前位置图标
  349 + Bitmap pointBitmap = BitmapUtil.getBitmapFromDp(getContext(), BitmapFactory.decodeResource(getContext().getResources(), R.drawable.icon_end), 30, 30);
  350 + endMark = new MarkerOptions()
  351 + .position(points.get(points.size()-1))
  352 + .icon(BitmapDescriptorFactory.fromBitmap(pointBitmap))
  353 + .perspective(true)
  354 +// endMark.anchor(0.5f, 0.5f)
  355 + .perspective(true);
  356 + baiduMap.addOverlay(endMark);
  357 + }
337 358 //mPloyline 折线对象
338 359 Overlay mPolyline = baiduMap.addOverlay(mOverlayOptions);
339 360 MapStatus.Builder builder = new MapStatus.Builder();
... ... @@ -371,8 +392,8 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
371 392 if (drivingRouteResult.getRouteLines() != null) {
372 393 if (drivingRouteResult.getRouteLines().get(0).getAllStep().get(0).getWayPoints().size() > 0) {
373 394 //添加起点坐标
374   - if (mylocation != null) {
375   - points.add(new LatLng(mylocation.latitude, mylocation.longitude));
  395 + if (followMyLocation != null) {
  396 + points.add(new LatLng(followMyLocation.latitude, followMyLocation.longitude));
376 397 }
377 398 for (int i = 0; i < drivingRouteResult.getRouteLines().get(0).getAllStep().size(); i++) {
378 399 for (int j = 0; j < drivingRouteResult.getRouteLines().get(0).getAllStep().get(i).getWayPoints().size(); j++) {
... ... @@ -459,12 +480,12 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
459 480 if (Math.abs(x - lastX) > 1.0) {
460 481 mCurrentDirection = (int) x;
461 482 if (firstLatLng != null) {
462   - mylocation = new MyLocationData.Builder()
  483 + followMyLocation = new MyLocationData.Builder()
463 484 .accuracy(mCurrentAccracy)
464 485 // 此处设置开发者获取到的方向信息,顺时针0-360
465 486 .direction(mCurrentDirection).latitude(firstLatLng.latitude)
466 487 .longitude(firstLatLng.longitude).build();
467   - baiduMap.setMyLocationData(mylocation);
  488 + baiduMap.setMyLocationData(followMyLocation);
468 489 }
469 490 }
470 491 lastX = x;
... ... @@ -527,12 +548,12 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
527 548 // mCurrentLat = location.getLatitude();
528 549 // mCurrentLon = location.getLongitude();
529 550 mCurrentAccracy = location.getRadius();
530   - mylocation = new MyLocationData.Builder()
  551 + followMyLocation = new MyLocationData.Builder()
531 552 .accuracy(location.getRadius())
532 553 // 此处设置开发者获取到的方向信息,顺时针0-360
533 554 .direction(location.getDirection()).latitude(location.getLatitude())
534 555 .longitude(location.getLongitude()).build();
535   - if (mylocation == null) {
  556 + if (followMyLocation == null) {
536 557 return;
537 558 }
538 559  
... ... @@ -542,7 +563,7 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
542 563 isFirstLoc = false;
543 564 firstLatLng = new LatLng(location.getLatitude(),
544 565 location.getLongitude());
545   - baiduMap.setMyLocationData(mylocation);
  566 + baiduMap.setMyLocationData(followMyLocation);
546 567 builder.target(firstLatLng).zoom(DEFULT_ZOOM);
547 568 baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
548 569  
... ... @@ -558,13 +579,13 @@ public class RunRaceDetailFragmentView implements MvpView, SensorEventListener {
558 579 //开始分段规划路径
559 580 //第一个点
560 581 if (index == 0) {
561   - searchRouteResult(startLatLng, importLatLngs.get(index), 0);
  582 + searchRouteResult(startLatLng, importLatLngs.get(index), 0, importLatLngs.size());
562 583 } else {
563   - searchRouteResult(importLatLngs.get(index - 1), importLatLngs.get(index), index);
  584 + searchRouteResult(importLatLngs.get(index - 1), importLatLngs.get(index), index, importLatLngs.size());
564 585 }
565 586 }
566 587 } else {
567   - searchRouteResult(startLatLng, endLatLng, 0);
  588 + searchRouteResult(startLatLng, endLatLng, 0, importLatLngs.size());
568 589 }
569 590 }
570 591  
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/frame/view/RunningMapFragmentView.java
... ... @@ -42,7 +42,7 @@ import org.greenrobot.eventbus.EventBus;
42 42 public class RunningMapFragmentView implements MvpView, SensorEventListener {
43 43 private static final String TAG = "RunningMapFragmentView";
44 44 private RunningMapFragment fragment;
45   - private BaiduMap baiduMap;
  45 + public BaiduMap baiduMap;
46 46 private MapView mMapView;
47 47 private UiSettings mUiSettings;
48 48 private MyLocationConfiguration.LocationMode mCurrentMode;//定位模式
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/model/Constant.java
... ... @@ -7,5 +7,4 @@ public class Constant {
7 7 public static final int SERVICE_STEP_COUNT_RESET_SPEED = 3;//重置速度
8 8 public static final int FRAGMENT_RUN_CHRONOMETER = 4;//同步计时器
9 9  
10   -
11 10 }
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/service/StepService.java
... ... @@ -11,6 +11,7 @@ import android.content.ComponentName;
11 11 import android.content.Context;
12 12 import android.content.Intent;
13 13 import android.content.IntentFilter;
  14 +import android.content.SharedPreferences;
14 15 import android.hardware.Sensor;
15 16 import android.hardware.SensorEvent;
16 17 import android.hardware.SensorEventListener;
... ... @@ -23,7 +24,21 @@ import android.os.IBinder;
23 24 import android.support.v4.app.NotificationCompat;
24 25 import android.util.Log;
25 26 import android.widget.RemoteViews;
26   -
  27 +import android.widget.Toast;
  28 +
  29 +import com.baidu.mapapi.model.LatLng;
  30 +import com.baidu.trace.LBSTraceClient;
  31 +import com.baidu.trace.Trace;
  32 +import com.baidu.trace.api.entity.OnEntityListener;
  33 +import com.baidu.trace.api.fence.FenceAlarmPushInfo;
  34 +import com.baidu.trace.api.fence.MonitoredAction;
  35 +import com.baidu.trace.api.track.LatestPoint;
  36 +import com.baidu.trace.api.track.LatestPointResponse;
  37 +import com.baidu.trace.api.track.OnTrackListener;
  38 +import com.baidu.trace.model.OnTraceListener;
  39 +import com.baidu.trace.model.PushMessage;
  40 +import com.baidu.trace.model.StatusCodes;
  41 +import com.baidu.trace.model.TraceLocation;
27 42 import com.cnlive.moudle.pedometer.model.Constant;
28 43 import com.cnlive.moudle.pedometer.model.MessageEvent;
29 44 import com.cnlive.moudle.pedometer.model.step.StepCount;
... ... @@ -115,6 +130,33 @@ public class StepService extends Service implements SensorEventListener {
115 130 private static int speedCurrentStep;//用于检测速度步数
116 131 private boolean updateSpeedStepFlag;//是否是已经更新速度
117 132  
  133 + /****************************************************鹰眼轨迹相关************************************************/
  134 + /**
  135 + * 轨迹服务监听器
  136 + */
  137 + public static OnTraceListener traceListener = null;
  138 + /**
  139 + * 轨迹监听器(用于接收纠偏后实时位置回调)
  140 + */
  141 + private OnTrackListener realTimeTraceListener = null;
  142 + //位置采集周期
  143 + private int gatherInterval = 5;
  144 + //打包周期
  145 + private int packInterval = 30;
  146 + // 轨迹服务ID
  147 + public static final long serviceId = 213511;
  148 + // 设备标识
  149 + public static String entityName = "";
  150 + /**
  151 + * 轨迹客户端
  152 + */
  153 + public static LBSTraceClient mClient = null;
  154 +
  155 + /**
  156 + * 轨迹服务
  157 + */
  158 + public Trace mTrace = null;
  159 +
118 160 public StepService() {
119 161  
120 162 }
... ... @@ -125,12 +167,173 @@ public class StepService extends Service implements SensorEventListener {
125 167 Log.e("执行onCreate", "onCreate");
126 168 super.onCreate();
127 169 init();
  170 + if (mClient == null) {
  171 + mClient = new LBSTraceClient(getApplicationContext());
  172 + }
  173 + if (mTrace == null) {
  174 + mTrace = new Trace(serviceId, entityName);
  175 + }
128 176 showStartForegroundNotification();
129   - userId = "123";
130   - initTodayData(userId);
  177 +
131 178 initBroadcastReceiver();
132 179 }
133 180  
  181 + private void initTrace() {
  182 + if (mClient == null) {
  183 + mClient = new LBSTraceClient(getApplicationContext());
  184 + }
  185 + if (mTrace == null) {
  186 + mTrace = new Trace(serviceId, entityName);
  187 + }
  188 + //初始化实时轨迹监听器
  189 + realTimeTraceListener = new OnTrackListener() {
  190 +
  191 + @Override
  192 + public void onLatestPointCallback(LatestPointResponse response) {
  193 + if (StatusCodes.SUCCESS != response.getStatus()) {
  194 + return;
  195 + }
  196 +
  197 + LatestPoint point = response.getLatestPoint();
  198 +
  199 + }
  200 + };
  201 +
  202 + //轨迹监听
  203 + traceListener = new OnTraceListener() {
  204 +
  205 + /**
  206 + * 绑定服务回调接口
  207 + * @param errorNo 状态码
  208 + * @param message 消息
  209 + * <p>
  210 + * <pre>0:成功 </pre>
  211 + * <pre>1:失败</pre>
  212 + */
  213 + @Override
  214 + public void onBindServiceCallback(int errorNo, String message) {
  215 + }
  216 +
  217 + /**
  218 + * 开启服务回调接口
  219 + * @param errorNo 状态码
  220 + * @param message 消息
  221 + * <p>
  222 + * <pre>0:成功 </pre>
  223 + * <pre>10000:请求发送失败</pre>
  224 + * <pre>10001:服务开启失败</pre>
  225 + * <pre>10002:参数错误</pre>
  226 + * <pre>10003:网络连接失败</pre>
  227 + * <pre>10004:网络未开启</pre>
  228 + * <pre>10005:服务正在开启</pre>
  229 + * <pre>10006:服务已开启</pre>
  230 + */
  231 + @Override
  232 + public void onStartTraceCallback(int errorNo, String message) {
  233 + if (StatusCodes.SUCCESS == errorNo || StatusCodes.START_TRACE_NETWORK_CONNECT_FAILED <= errorNo) {
  234 + //开始进行采集
  235 + if (mClient != null) {
  236 + mClient.startGather(traceListener);
  237 + Toast.makeText(getApplicationContext(), "开启轨迹服务", Toast.LENGTH_LONG).show();
  238 +
  239 + }
  240 + }
  241 + }
  242 +
  243 + /**
  244 + * 停止服务回调接口
  245 + * @param errorNo 状态码
  246 + * @param message 消息
  247 + * <p>
  248 + * <pre>0:成功</pre>
  249 + * <pre>11000:请求发送失败</pre>
  250 + * <pre>11001:服务停止失败</pre>
  251 + * <pre>11002:服务未开启</pre>
  252 + * <pre>11003:服务正在停止</pre>
  253 + */
  254 + @Override
  255 + public void onStopTraceCallback(int errorNo, String message) {
  256 + if (StatusCodes.SUCCESS == errorNo || StatusCodes.CACHE_TRACK_NOT_UPLOAD == errorNo) {
  257 + if (mClient != null) {
  258 + mClient.stopTrace(mTrace, traceListener);
  259 + Toast.makeText(getApplicationContext(), "停止轨迹服务", Toast.LENGTH_LONG).show();
  260 +
  261 + }
  262 + }
  263 + }
  264 +
  265 + /**
  266 + * 开启采集回调接口
  267 + * @param errorNo 状态码
  268 + * @param message 消息
  269 + * <p>
  270 + * <pre>0:成功</pre>
  271 + * <pre>12000:请求发送失败</pre>
  272 + * <pre>12001:采集开启失败</pre>
  273 + * <pre>12002:服务未开启</pre>
  274 + */
  275 + @Override
  276 + public void onStartGatherCallback(int errorNo, String message) {
  277 + if (StatusCodes.SUCCESS == errorNo || StatusCodes.GATHER_STARTED == errorNo) {
  278 + Toast.makeText(getApplicationContext(), "开始采集", Toast.LENGTH_LONG).show();
  279 + }
  280 + }
  281 +
  282 + /**
  283 + * 停止采集回调接口
  284 + * @param errorNo 状态码
  285 + * @param message 消息
  286 + * <p>
  287 + * <pre>0:成功</pre>
  288 + * <pre>13000:请求发送失败</pre>
  289 + * <pre>13001:采集停止失败</pre>
  290 + * <pre>13002:服务未开启</pre>
  291 + */
  292 + @Override
  293 + public void onStopGatherCallback(int errorNo, String message) {
  294 + if (StatusCodes.SUCCESS == errorNo || StatusCodes.GATHER_STOPPED == errorNo) {
  295 + Toast.makeText(getApplicationContext(), "停止采集", Toast.LENGTH_LONG).show();
  296 + if (mClient != null) {
  297 + mClient.stopTrace(mTrace, traceListener);
  298 + }
  299 + }
  300 + }
  301 +
  302 + /**
  303 + * 推送消息回调接口
  304 + *
  305 + * @param messageType 状态码
  306 + * @param pushMessage 消息
  307 + * <p>
  308 + * <pre>0x01:配置下发</pre>
  309 + * <pre>0x02:语音消息</pre>
  310 + * <pre>0x03:服务端围栏报警消息</pre>
  311 + * <pre>0x04:本地围栏报警消息</pre>
  312 + * <pre>0x05~0x40:系统预留</pre>
  313 + * <pre>0x41~0xFF:开发者自定义</pre>
  314 + */
  315 + @Override
  316 + public void onPushCallback(byte messageType, PushMessage pushMessage) {
  317 + if (messageType < 0x03 || messageType > 0x04) {
  318 + return;
  319 + }
  320 + FenceAlarmPushInfo alarmPushInfo = pushMessage.getFenceAlarmPushInfo();
  321 + if (null == alarmPushInfo) {
  322 + return;
  323 + }
  324 + }
  325 +
  326 + @Override
  327 + public void onInitBOSCallback(int errorNo, String message) {
  328 + }
  329 + };
  330 +
  331 + //开启轨迹服务
  332 + if (mClient != null) {
  333 + mClient.startTrace(mTrace, traceListener);
  334 + }
  335 +
  336 + }
134 337  
135 338 private long i = 0;
136 339 private long index = 0;
... ... @@ -142,6 +345,9 @@ public class StepService extends Service implements SensorEventListener {
142 345 public int onStartCommand(Intent intent, int flags, int startId) {
143 346 if (intent.getExtras().getString("userId") != null) {
144 347 userId = intent.getExtras().getString("userId");
  348 + entityName = userId;
  349 + initTodayData(userId);
  350 + initTrace();
145 351 if (!EventBus.getDefault().isRegistered(this)) {
146 352 EventBus.getDefault().register(this);
147 353 }
... ... @@ -308,9 +514,14 @@ public class StepService extends Service implements SensorEventListener {
308 514 */
309 515 private void initTodayData(String userId) {
310 516 CURRENT_DATE = getTodayDate();
311   -
  517 + if (userId == null || CURRENT_DATE == null) {
  518 + return;
  519 + }
312 520 // //获取当天的数据,用于展示 CURRENT_DATE
313 521 List<UserStepEntity> list = DbCore.getDaoSession().getUserStepEntityDao().queryBuilder().where(UserStepEntityDao.Properties.UserId.eq(userId), UserStepEntityDao.Properties.Date.eq(CURRENT_DATE)).list();
  522 + if (list == null) {
  523 + return;
  524 + }
314 525 if (list.size() == 0 || list.isEmpty()) {
315 526 CURRENT_STEP = 0;
316 527 } else if (list.size() == 1) {
... ... @@ -765,4 +976,6 @@ public class StepService extends Service implements SensorEventListener {
765 976 int h = (int) (time / 3600) % 60;//小时
766 977 return String.format("%02d:%02d:%02d", h, m, s);
767 978 }
  979 +
  980 +
768 981 }
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/ui/fragment/RunningMapFragment.java
... ... @@ -4,6 +4,7 @@ import android.hardware.Sensor;
4 4 import android.hardware.SensorManager;
5 5 import android.os.Bundle;
6 6 import android.support.annotation.Nullable;
  7 +import android.text.TextUtils;
7 8 import android.util.Log;
8 9 import android.view.View;
9 10  
... ... @@ -14,6 +15,8 @@ import com.cnlive.moudle.pedometer.frame.view.RunningMapFragmentView;
14 15 import com.cnlive.moudle.pedometer.model.RunningMapBean;
15 16 import com.cnlive.moudle.pedometer.model.Constant;
16 17 import com.cnlive.moudle.pedometer.model.MessageEvent;
  18 +import com.cnlive.moudle.pedometer.service.StepService;
  19 +import com.cnlive.moudle.pedometer.utils.TimeUtil;
17 20 import com.example.moudle_pedometer.R;
18 21 import com.example.moudle_pedometer.databinding.FragmentRunningMapBinding;
19 22  
... ... @@ -78,6 +81,12 @@ public class RunningMapFragment extends QMUIFragment&lt;RunningMapFragmentView, Run
78 81 getMvpView().updateChronometer(runningMapBean);
79 82 }
80 83 }
  84 + //开始进行历史轨迹查询
  85 + if (getPresenter() != null && !TextUtils.isEmpty(StepService.entityName)) {
  86 + long startTime = runningMapBean.getTimeBase();
  87 + long endTime = TimeUtil.getCurrentTime();
  88 + getPresenter().queryHistoryTrace(getActivity(), StepService.entityName, startTime, endTime);
  89 + }
81 90 }
82 91  
83 92 @Override
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/ButtonAnimUtil.java
... ... @@ -41,6 +41,17 @@ public class ButtonAnimUtil {
41 41 animatorSetsuofang.start();
42 42 }
43 43  
  44 + //设置控件缩小动画
  45 + public static void setViewDefault(View view) {
  46 + AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画
  47 + ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1f, 1);
  48 + ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1f, 1);
  49 + animatorSetsuofang.setDuration(DEFAULT_ZOOM_DURATION);
  50 + animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
  51 + animatorSetsuofang.play(scaleX).with(scaleY);//两个动画同时开始
  52 + animatorSetsuofang.start();
  53 + }
  54 +
44 55 //设置控件显示放大动画
45 56 public static void setViewShowZoomIn(View view) {
46 57 AnimatorSet animatorSetsuofang = new AnimatorSet();//组合动画
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/CommonUtil.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.utils;
  2 +
  3 +import android.app.ActivityManager;
  4 +import android.content.Context;
  5 +import android.content.SharedPreferences;
  6 +import android.telephony.TelephonyManager;
  7 +
  8 +import com.baidu.mapapi.model.LatLng;
  9 +
  10 +import java.sql.Timestamp;
  11 +import java.text.DecimalFormat;
  12 +import java.text.ParseException;
  13 +import java.text.SimpleDateFormat;
  14 +import java.util.Date;
  15 +import java.util.Locale;
  16 +
  17 +/**
  18 + * Created by baidu on 17/1/23.
  19 + */
  20 +
  21 +public class CommonUtil {
  22 +
  23 + private static DecimalFormat df = new DecimalFormat("######0.00");
  24 +
  25 + public static final double DISTANCE = 0.0001;
  26 +
  27 + public static String getCurProcessName(Context context) {
  28 + int pid = android.os.Process.myPid();
  29 + ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
  30 + for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) {
  31 + if (appProcess.pid == pid) {
  32 + return appProcess.processName;
  33 + }
  34 + }
  35 + return "";
  36 + }
  37 +
  38 + /**
  39 + * 获取当前时间戳(单位:秒)
  40 + *
  41 + * @return
  42 + */
  43 + public static long getCurrentTime() {
  44 + return System.currentTimeMillis() / 1000;
  45 + }
  46 +
  47 + /**
  48 + * 校验double数值是否为0
  49 + *
  50 + * @param value
  51 + *
  52 + * @return
  53 + */
  54 + public static boolean isEqualToZero(double value) {
  55 + return Math.abs(value - 0.0) < 0.01 ? true : false;
  56 + }
  57 +
  58 + /**
  59 + * 经纬度是否为(0,0)点
  60 + *
  61 + * @return
  62 + */
  63 + public static boolean isZeroPoint(double latitude, double longitude) {
  64 + return isEqualToZero(latitude) && isEqualToZero(longitude);
  65 + }
  66 +
  67 + /**
  68 + * 将字符串转为时间戳
  69 + */
  70 + public static long toTimeStamp(String time) {
  71 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
  72 + Locale.CHINA);
  73 + Date date;
  74 + try {
  75 + date = sdf.parse(time);
  76 + } catch (ParseException e) {
  77 + e.printStackTrace();
  78 + return 0;
  79 + }
  80 + return date.getTime() / 1000;
  81 + }
  82 +
  83 + /**
  84 + * 获取时分秒
  85 + *
  86 + * @param timestamp 时间戳(单位:毫秒)
  87 + *
  88 + * @return
  89 + */
  90 + public static String getHMS(long timestamp) {
  91 + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
  92 + try {
  93 + return sdf.format(new Timestamp(timestamp));
  94 + } catch (Exception e) {
  95 + e.printStackTrace();
  96 + }
  97 + return String.valueOf(timestamp);
  98 + }
  99 +
  100 + /**
  101 + * 获取年月日 时分秒
  102 + *
  103 + * @param timestamp 时间戳(单位:毫秒)
  104 + *
  105 + * @return
  106 + */
  107 + public static String formatTime(long timestamp) {
  108 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  109 + try {
  110 + return sdf.format(new Timestamp(timestamp));
  111 + } catch (Exception e) {
  112 + e.printStackTrace();
  113 + }
  114 + return String.valueOf(timestamp);
  115 + }
  116 +
  117 + public static String formatSecond(int second) {
  118 + String format = "%1$,02d:%2$,02d:%3$,02d";
  119 + Integer hours = second / (60 * 60);
  120 + Integer minutes = second / 60 - hours * 60;
  121 + Integer seconds = second - minutes * 60 - hours * 60 * 60;
  122 + Object[] array = new Object[] {hours, minutes, seconds};
  123 + return String.format(format, array);
  124 + }
  125 +
  126 + public static final String formatDouble(double doubleValue) {
  127 + return df.format(doubleValue);
  128 + }
  129 +
  130 + /**
  131 + * 计算x方向每次移动的距离
  132 + */
  133 + public static double getXMoveDistance(double slope) {
  134 + if (slope == Double.MAX_VALUE) {
  135 + return DISTANCE;
  136 + }
  137 + return Math.abs((DISTANCE * slope) / Math.sqrt(1 + slope * slope));
  138 + }
  139 +
  140 + /**
  141 + * 根据点和斜率算取截距
  142 + */
  143 + public static double getInterception(double slope, LatLng point) {
  144 + return point.latitude - slope * point.longitude;
  145 + }
  146 +
  147 + /**
  148 + * 算斜率
  149 + */
  150 + public static double getSlope(LatLng fromPoint, LatLng toPoint) {
  151 + if (toPoint.longitude == fromPoint.longitude) {
  152 + return Double.MAX_VALUE;
  153 + }
  154 + return (toPoint.latitude - fromPoint.latitude) / (toPoint.longitude - fromPoint.longitude);
  155 + }
  156 +
  157 + /**
  158 + * 根据两点算取图标转的角度
  159 + */
  160 + public static double getAngle(LatLng fromPoint, LatLng toPoint) {
  161 + double slope = getSlope(fromPoint, toPoint);
  162 + if (slope == Double.MAX_VALUE) {
  163 + if (toPoint.latitude > fromPoint.latitude) {
  164 + return 0;
  165 + } else {
  166 + return 180;
  167 + }
  168 + }
  169 + float deltAngle = 0;
  170 + if ((toPoint.latitude - fromPoint.latitude) * slope < 0) {
  171 + deltAngle = 180;
  172 + }
  173 + double radio = Math.atan(slope);
  174 + return 180 * (radio / Math.PI) + deltAngle - 90;
  175 + }
  176 +
  177 + /**
  178 + * 保存当前定位点
  179 + */
  180 +// public static void saveCurrentLocation(TrackApplication trackApp) {
  181 +// SharedPreferences.Editor editor = trackApp.trackConf.edit();
  182 +// StringBuffer locationInfo = new StringBuffer();
  183 +// locationInfo.append(CurrentLocation.locTime);
  184 +// locationInfo.append(";");
  185 +// locationInfo.append(CurrentLocation.latitude);
  186 +// locationInfo.append(";");
  187 +// locationInfo.append(CurrentLocation.longitude);
  188 +// editor.putString(Constants.LAST_LOCATION, locationInfo.toString());
  189 +// editor.apply();
  190 +// }
  191 +
  192 + /**
  193 + * 获取设备IMEI码
  194 + *
  195 + * @param context
  196 + *
  197 + * @return
  198 + */
  199 + public static String getImei(Context context) {
  200 + String imei;
  201 + try {
  202 + imei = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
  203 + } catch (Exception e) {
  204 + imei = "myTrace";
  205 + }
  206 + return imei;
  207 + }
  208 +
  209 +}
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/MapUtil.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.utils;
  2 +
  3 +import android.graphics.Color;
  4 +import android.graphics.Point;
  5 +import android.os.Bundle;
  6 +import android.text.TextUtils;
  7 +
  8 +import com.baidu.mapapi.map.BaiduMap;
  9 +import com.baidu.mapapi.map.BitmapDescriptor;
  10 +import com.baidu.mapapi.map.MapStatus;
  11 +import com.baidu.mapapi.map.MapStatusUpdate;
  12 +import com.baidu.mapapi.map.MapStatusUpdateFactory;
  13 +import com.baidu.mapapi.map.MapView;
  14 +import com.baidu.mapapi.map.Marker;
  15 +import com.baidu.mapapi.map.MarkerOptions;
  16 +import com.baidu.mapapi.map.Overlay;
  17 +import com.baidu.mapapi.map.OverlayOptions;
  18 +import com.baidu.mapapi.map.PolylineOptions;
  19 +import com.baidu.mapapi.model.LatLng;
  20 +import com.baidu.mapapi.model.LatLngBounds;
  21 +import com.baidu.mapapi.utils.CoordinateConverter;
  22 +import com.baidu.trace.model.CoordType;
  23 +import com.baidu.trace.model.SortType;
  24 +import com.baidu.trace.model.TraceLocation;
  25 +
  26 +import java.util.List;
  27 +
  28 +
  29 +/**
  30 + * Created by baidu on 17/2/9.
  31 + */
  32 +
  33 +public class MapUtil {
  34 +
  35 + private static MapUtil INSTANCE = new MapUtil();
  36 +
  37 + private MapStatus mapStatus = null;
  38 +
  39 + private Marker mMoveMarker = null;
  40 +
  41 + public MapView mapView = null;
  42 +
  43 + public BaiduMap baiduMap = null;
  44 +
  45 + public LatLng lastPoint = null;
  46 +
  47 + /**
  48 + * 路线覆盖物
  49 + */
  50 + public Overlay polylineOverlay = null;
  51 +
  52 + private MapUtil() {
  53 + }
  54 +
  55 + public static MapUtil getInstance() {
  56 + return INSTANCE;
  57 + }
  58 +
  59 + public void init(MapView view) {
  60 + mapView = view;
  61 + baiduMap = mapView.getMap();
  62 + mapView.showZoomControls(false);
  63 + }
  64 +
  65 + public void onPause() {
  66 + if (null != mapView) {
  67 + mapView.onPause();
  68 + }
  69 + }
  70 +
  71 + public void onResume() {
  72 + if (null != mapView) {
  73 + mapView.onResume();
  74 + }
  75 + }
  76 +
  77 + public void clear() {
  78 + lastPoint = null;
  79 + if (null != mMoveMarker) {
  80 + mMoveMarker.remove();
  81 + mMoveMarker = null;
  82 + }
  83 + if (null != polylineOverlay) {
  84 + polylineOverlay.remove();
  85 + polylineOverlay = null;
  86 + }
  87 + if (null != baiduMap) {
  88 + baiduMap.clear();
  89 + baiduMap = null;
  90 + }
  91 + mapStatus = null;
  92 + if (null != mapView) {
  93 + mapView.onDestroy();
  94 + mapView = null;
  95 + }
  96 + }
  97 +
  98 + /**
  99 + * 将轨迹实时定位点转换为地图坐标
  100 + *
  101 + * @param location
  102 + *
  103 + * @return
  104 + */
  105 + public static LatLng convertTraceLocation2Map(TraceLocation location) {
  106 + if (null == location) {
  107 + return null;
  108 + }
  109 + double latitude = location.getLatitude();
  110 + double longitude = location.getLongitude();
  111 + if (Math.abs(latitude - 0.0) < 0.000001 && Math.abs(longitude - 0.0) < 0.000001) {
  112 + return null;
  113 + }
  114 + LatLng currentLatLng = new LatLng(latitude, longitude);
  115 + if (CoordType.wgs84 == location.getCoordType()) {
  116 + LatLng sourceLatLng = currentLatLng;
  117 + CoordinateConverter converter = new CoordinateConverter();
  118 + converter.from(CoordinateConverter.CoordType.GPS);
  119 + converter.coord(sourceLatLng);
  120 + currentLatLng = converter.convert();
  121 + }
  122 + return currentLatLng;
  123 + }
  124 +
  125 + /**
  126 + * 将地图坐标转换轨迹坐标
  127 + *
  128 + * @param latLng
  129 + *
  130 + * @return
  131 + */
  132 + public static com.baidu.trace.model.LatLng convertMap2Trace(LatLng latLng) {
  133 + return new com.baidu.trace.model.LatLng(latLng.latitude, latLng.longitude);
  134 + }
  135 +
  136 + /**
  137 + * 将轨迹坐标对象转换为地图坐标对象
  138 + *
  139 + * @param traceLatLng
  140 + *
  141 + * @return
  142 + */
  143 + public static LatLng convertTrace2Map(com.baidu.trace.model.LatLng traceLatLng) {
  144 + return new LatLng(traceLatLng.latitude, traceLatLng.longitude);
  145 + }
  146 +
  147 +// /**
  148 +// * 设置地图中心:使用已有定位信息;
  149 +// *
  150 +// * @param trackApp
  151 +// */
  152 +// public void setCenter(TrackApplication trackApp) {
  153 +// if (!CommonUtil.isZeroPoint(CurrentLocation.latitude, CurrentLocation.longitude)) {
  154 +// LatLng currentLatLng = new LatLng(CurrentLocation.latitude, CurrentLocation.longitude);
  155 +// updateStatus(currentLatLng, false);
  156 +// return;
  157 +// }
  158 +// String lastLocation = trackApp.trackConf.getString(Constants.LAST_LOCATION, null);
  159 +// if (!TextUtils.isEmpty(lastLocation)) {
  160 +// String[] locationInfo = lastLocation.split(";");
  161 +// if (!CommonUtil.isZeroPoint(Double.parseDouble(locationInfo[1]),
  162 +// Double.parseDouble(locationInfo[2]))) {
  163 +// LatLng currentLatLng = new LatLng(Double.parseDouble(locationInfo[1]),
  164 +// Double.parseDouble(locationInfo[2]));
  165 +// updateStatus(currentLatLng, false);
  166 +// return;
  167 +// }
  168 +// }
  169 +// }
  170 +
  171 +// public void updateStatus(LatLng currentPoint, boolean showMarker) {
  172 +// if (null == baiduMap || null == currentPoint) {
  173 +// return;
  174 +// }
  175 +//
  176 +// if (null != baiduMap.getProjection()) {
  177 +// Point screenPoint = baiduMap.getProjection().toScreenLocation(currentPoint);
  178 +// // 点在屏幕上的坐标超过限制范围,则重新聚焦底图
  179 +// if (screenPoint.y < 200 || screenPoint.y > TrackApplication.screenHeight - 500
  180 +// || screenPoint.x < 200 || screenPoint.x > TrackApplication.screenWidth - 200
  181 +// || null == mapStatus) {
  182 +// animateMapStatus(currentPoint, 15.0f);
  183 +// }
  184 +// } else if (null == mapStatus) {
  185 +// // 第一次定位时,聚焦底图
  186 +// setMapStatus(currentPoint, 15.0f);
  187 +// }
  188 +//
  189 +// if (showMarker) {
  190 +// addMarker(currentPoint);
  191 +// }
  192 +//
  193 +// }
  194 +
  195 + public Marker addOverlay(LatLng currentPoint, BitmapDescriptor icon, Bundle bundle) {
  196 + OverlayOptions overlayOptions = new MarkerOptions().position(currentPoint)
  197 + .icon(icon).zIndex(9).draggable(true);
  198 + Marker marker = (Marker) baiduMap.addOverlay(overlayOptions);
  199 + if (null != bundle) {
  200 + marker.setExtraInfo(bundle);
  201 + }
  202 + return marker;
  203 + }
  204 +
  205 + /**
  206 + * 添加地图覆盖物
  207 + */
  208 +// public void addMarker(LatLng currentPoint) {
  209 +// if (null == mMoveMarker) {
  210 +// mMoveMarker = addOverlay(currentPoint, BitmapUtil.bmArrowPoint, null);
  211 +// return;
  212 +// }
  213 +//
  214 +// if (null != lastPoint) {
  215 +// moveLooper(currentPoint);
  216 +// } else {
  217 +// lastPoint = currentPoint;
  218 +// mMoveMarker.setPosition(currentPoint);
  219 +// }
  220 +// }
  221 +
  222 + /**
  223 + * 移动逻辑
  224 + */
  225 + public void moveLooper(LatLng endPoint) {
  226 +
  227 + mMoveMarker.setPosition(lastPoint);
  228 + mMoveMarker.setRotate((float) CommonUtil.getAngle(lastPoint, endPoint));
  229 +
  230 + double slope = CommonUtil.getSlope(lastPoint, endPoint);
  231 + // 是不是正向的标示(向上设为正向)
  232 + boolean isReverse = (lastPoint.latitude > endPoint.latitude);
  233 + double intercept = CommonUtil.getInterception(slope, lastPoint);
  234 + double xMoveDistance = isReverse ? CommonUtil.getXMoveDistance(slope) : -1 * CommonUtil.getXMoveDistance(slope);
  235 +
  236 + for (double latitude = lastPoint.latitude; latitude > endPoint.latitude == isReverse; latitude =
  237 + latitude - xMoveDistance) {
  238 + LatLng latLng;
  239 + if (slope != Double.MAX_VALUE) {
  240 + latLng = new LatLng(latitude, (latitude - intercept) / slope);
  241 + } else {
  242 + latLng = new LatLng(latitude, lastPoint.longitude);
  243 + }
  244 + mMoveMarker.setPosition(latLng);
  245 + }
  246 + }
  247 +
  248 +
  249 + public void animateMapStatus(List<LatLng> points) {
  250 + if (null == points || points.isEmpty()) {
  251 + return;
  252 + }
  253 + LatLngBounds.Builder builder = new LatLngBounds.Builder();
  254 + for (LatLng point : points) {
  255 + builder.include(point);
  256 + }
  257 + MapStatusUpdate msUpdate = MapStatusUpdateFactory.newLatLngBounds(builder.build());
  258 + baiduMap.animateMapStatus(msUpdate);
  259 + }
  260 +
  261 + public void animateMapStatus(LatLng point, float zoom) {
  262 + MapStatus.Builder builder = new MapStatus.Builder();
  263 + mapStatus = builder.target(point).zoom(zoom).build();
  264 + baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(mapStatus));
  265 + }
  266 +
  267 + public void setMapStatus(LatLng point, float zoom) {
  268 + MapStatus.Builder builder = new MapStatus.Builder();
  269 + mapStatus = builder.target(point).zoom(zoom).build();
  270 + baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(mapStatus));
  271 + }
  272 +
  273 + public void refresh() {
  274 + LatLng mapCenter = baiduMap.getMapStatus().target;
  275 + float mapZoom = baiduMap.getMapStatus().zoom - 1.0f;
  276 + setMapStatus(mapCenter, mapZoom);
  277 + }
  278 +
  279 +}
  280 +
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/MyMapUtil.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.utils;
  2 +
  3 +import android.content.Context;
  4 +import android.graphics.Bitmap;
  5 +import android.graphics.BitmapFactory;
  6 +import android.graphics.Color;
  7 +
  8 +import com.baidu.mapapi.map.BaiduMap;
  9 +import com.baidu.mapapi.map.BitmapDescriptorFactory;
  10 +import com.baidu.mapapi.map.Marker;
  11 +import com.baidu.mapapi.map.MarkerOptions;
  12 +import com.baidu.mapapi.map.Overlay;
  13 +import com.baidu.mapapi.map.OverlayOptions;
  14 +import com.baidu.mapapi.map.PolylineOptions;
  15 +import com.baidu.mapapi.model.LatLng;
  16 +import com.baidu.trace.model.SortType;
  17 +import com.example.moudle_pedometer.R;
  18 +
  19 +import java.util.List;
  20 +
  21 +/**
  22 + * @author ShinnyYang
  23 + */
  24 +public class MyMapUtil {
  25 + /**
  26 + * 将轨迹坐标对象转换为地图坐标对象
  27 + *
  28 + * @param traceLatLng
  29 + * @return
  30 + */
  31 + public static LatLng convertTrace2Map(com.baidu.trace.model.LatLng traceLatLng) {
  32 + return new LatLng(traceLatLng.latitude, traceLatLng.longitude);
  33 + }
  34 +
  35 + /**
  36 + * 绘制历史轨迹
  37 + */
  38 + public static Overlay drawHistoryTrack(Context context, BaiduMap baiduMap, List<LatLng> points, SortType sortType, int lineColor, int startIconRes, int endIconRes) {
  39 + // 绘制新覆盖物前,清空之前的覆盖物
  40 + baiduMap.clear();
  41 + if (points == null || points.size() == 0) {
  42 + return null;
  43 + }
  44 + //只有一个点
  45 + if (points.size() == 1) {
  46 + Bitmap pointBitmap = BitmapUtil.getBitmapFromDp(context, BitmapFactory.decodeResource(context.getResources(), startIconRes), 40, 40);
  47 + OverlayOptions startOptions = new MarkerOptions().position(points.get(0)).icon(BitmapDescriptorFactory.fromBitmap(pointBitmap));
  48 +// .zIndex(9).draggable(true);
  49 + return baiduMap.addOverlay(startOptions);
  50 + }
  51 +
  52 + LatLng startPoint;
  53 + LatLng endPoint;
  54 + if (sortType == SortType.asc) {
  55 + startPoint = points.get(0);
  56 + endPoint = points.get(points.size() - 1);
  57 + } else {
  58 + startPoint = points.get(points.size() - 1);
  59 + endPoint = points.get(0);
  60 + }
  61 +
  62 + // 添加起点图标
  63 + Bitmap startPointBitmap = BitmapUtil.getBitmapFromDp(context, BitmapFactory.decodeResource(context.getResources(), startIconRes), 40, 40);
  64 + OverlayOptions startOptions = new MarkerOptions()
  65 + .position(startPoint).icon(BitmapDescriptorFactory.fromBitmap(startPointBitmap));
  66 +// .zIndex(9).draggable(true);
  67 + // 添加终点图标
  68 + Bitmap endPointBitmap = BitmapUtil.getBitmapFromDp(context, BitmapFactory.decodeResource(context.getResources(), endIconRes), 40, 40);
  69 + OverlayOptions endOptions = new MarkerOptions().position(endPoint)
  70 + .icon(BitmapDescriptorFactory.fromBitmap(endPointBitmap));
  71 +// .zIndex(9).draggable(true);
  72 +
  73 + // 添加路线(轨迹)
  74 + OverlayOptions polylineOptions = new PolylineOptions().width(10)
  75 + .color(context.getResources().getColor(lineColor)).points(points);
  76 +
  77 + baiduMap.addOverlay(startOptions);
  78 +// baiduMap.addOverlay(endOptions);
  79 + return baiduMap.addOverlay(polylineOptions);
  80 + }
  81 +}
... ...
moudle_pedometer/src/main/java/com/cnlive/moudle/pedometer/utils/TimeUtil.java 0 → 100644
  1 +package com.cnlive.moudle.pedometer.utils;
  2 +
  3 +public class TimeUtil {
  4 + /**
  5 + * 获取当前时间戳(单位:秒)
  6 + *
  7 + * @return
  8 + */
  9 + public static long getCurrentTime() {
  10 + return System.currentTimeMillis() / 1000;
  11 + }
  12 +
  13 +}
... ...
moudle_pedometer/src/main/res/drawable-hdpi/icon_end.png 0 → 100644

2.2 KB

moudle_pedometer/src/main/res/drawable-hdpi/icon_start.png 0 → 100644

2.02 KB