项目结构

BaseActivity.java
package siso.track.activity;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;import siso.track.R;public abstract class BaseActivity extends Activity {@Overrideprotected void onCreateBundle savedInstanceState) {super.onCreatesavedInstanceState);setContentViewgetContentViewId));}protected abstract int getContentViewId);public void setTitleint resId) {LinearLayout layout = LinearLayout) findViewByIdR.id.layout_top);TextView textView = TextView) layout.findViewByIdR.id.tv_activity_title);textView.setTextresId);}public void setOnClickListenerView.OnClickListener listener) {LinearLayout layout = LinearLayout) findViewByIdR.id.layout_top);LinearLayout optionsButton = LinearLayout) layout.findViewByIdR.id.btn_activity_options);optionsButton.setOnClickListenerlistener);}public void setOptionsButtonInVisible) {LinearLayout layout = LinearLayout) findViewByIdR.id.layout_top);LinearLayout optionsButton = LinearLayout) layout.findViewByIdR.id.btn_activity_options);optionsButton.setVisibilityView.INVISIBLE);}public void onBackView v) {super.onBackPressed);}@Overrideprotected void onStart) {super.onStart);}@Overrideprotected void onResume) {super.onResume);}@Overrideprotected void onPause) {super.onPause);}@Overrideprotected void onStop) {super.onStop);}@Overrideprotected void onRestart) {super.onRestart);}@Overrideprotected void onDestroy) {super.onDestroy);}}
MainActivity.java
package siso.track.activity;import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.baidu.mapapi.SDKInitializer;
import com.baidu.trace.LBSTraceClient;
import com.baidu.trace.Trace;
import com.baidu.trace.api.entity.LocRequest;
import com.baidu.trace.api.entity.OnEntityListener;
import com.baidu.trace.model.OnTraceListener;
import com.baidu.trace.model.PushMessage;
import com.baidu.trace.model.TraceLocation;import siso.track.utils.BitmapUtil;
import siso.track.R;
import siso.track.TrackApplication;import java.util.ArrayList;
import java.util.List;public class MainActivity extends BaseActivity {private TrackApplication trackApp;private SDKReceiver mReceiver;public class SDKReceiver extends BroadcastReceiver {public void onReceiveContext context, Intent intent) {String s = intent.getAction);if s.equalsSDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {Toast.makeTextMainActivity.this,"apikey验证失败,地图功能无法正常使用",Toast.LENGTH_SHORT).show);} else if s.equalsSDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK)) {Toast.makeTextMainActivity.this,"apikey验证成功",Toast.LENGTH_SHORT).show);} else if s.equalsSDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {Toast.makeTextMainActivity.this,"网络错误",Toast.LENGTH_SHORT).show);}}}@Overrideprotected void onCreateBundle savedInstanceState) {super.onCreatesavedInstanceState);IntentFilter iFilter = new IntentFilter);iFilter.addActionSDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK);iFilter.addActionSDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);iFilter.addActionSDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);mReceiver = new SDKReceiver);registerReceivermReceiver, iFilter);init);siso.track.utils.BitmapUtil.init);}private void init) {trackApp = TrackApplication) getApplicationContext);Button trace = Button) findViewByIdR.id.btn_trace);Button query = Button) findViewByIdR.id.btn_query);trace.setOnClickListenernew View.OnClickListener) {@Overridepublic void onClickView v) {Intent intent = new IntentMainActivity.this, TracingActivity.class);startActivityintent);}});query.setOnClickListenernew View.OnClickListener) {@Overridepublic void onClickView v) {Intent intent = new IntentMainActivity.this,TrackQueryActivity.class);startActivityintent);}});}@Overrideprotected void onStart) {super.onStart);List<String> permissions = new ArrayList<>);if Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && isNeedRequestPermissionspermissions)) {requestPermissionspermissions.toArraynew String[permissions.size)]), 0);}}@Overrideprotected int getContentViewId) {return R.layout.activity_main;}private boolean isNeedRequestPermissionsList<String> permissions) {addPermissionpermissions, Manifest.permission.ACCESS_FINE_LOCATION);addPermissionpermissions, Manifest.permission.WRITE_EXTERNAL_STORAGE);addPermissionpermissions, Manifest.permission.READ_PHONE_STATE);return permissions.size) > 0;}private void addPermissionList<String> permissionsList, String permission) {if Build.VERSION.SDK_INT >= Build.VERSION_CODES.M&& checkSelfPermissionpermission) != PackageManager.PERMISSION_GRANTED) {permissionsList.addpermission);}}@Overrideprotected void onDestroy) {super.onDestroy);unregisterReceivermReceiver);if trackApp.trackConf.contains"is_trace_started")&& trackApp.trackConf.getBoolean"is_trace_started", true)) {trackApp.mClient.setOnTraceListenernull);trackApp.mClient.stopTracetrackApp.mTrace, null);trackApp.mClient.clear);} else {trackApp.mClient.clear);}trackApp.isTraceStarted = false;trackApp.isGatherStarted = false;SharedPreferences.Editor editor = trackApp.trackConf.edit);editor.remove"is_trace_started");editor.remove"is_gather_started");editor.apply);BitmapUtil.clear);}
}
TracingActivity.java
package siso.track.activity;import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.SyncStatusObserver;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.PowerManager;
import android.provider.Settings;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.res.ResourcesCompat;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;import com.baidu.mapapi.common.SysOSUtil;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.trace.api.entity.OnEntityListener;
import com.baidu.trace.api.track.HistoryTrackRequest;
import com.baidu.trace.api.track.HistoryTrackResponse;
import com.baidu.trace.api.track.LatestPoint;
import com.baidu.trace.api.track.LatestPointResponse;
import com.baidu.trace.api.track.OnTrackListener;
import com.baidu.trace.api.track.SupplementMode;
import com.baidu.trace.api.track.TrackPoint;
import com.baidu.trace.model.CoordType;
import com.baidu.trace.model.LocationMode;
import com.baidu.trace.model.OnTraceListener;
import com.baidu.trace.model.ProcessOption;
import com.baidu.trace.model.PushMessage;
import com.baidu.trace.model.SortType;
import com.baidu.trace.model.StatusCodes;
import com.baidu.trace.model.TraceLocation;
import com.baidu.trace.model.TransportMode;import siso.track.utils.CommonUtil;
import siso.track.utils.Constants;
import siso.track.utils.MapUtil;
import siso.track.utils.TrackReceiver;
import siso.track.utils.ViewUtil;
import siso.track.R;
import siso.track.TrackApplication;
import siso.track.model.CurrentLocation;import java.util.ArrayList;
import java.util.List;import siso.track.activity.BaseActivity;
public class TracingActivity extends BaseActivity implements View.OnClickListener, SensorEventListener {private TrackApplication trackApp = null;private ViewUtil viewUtil = null;private Button traceBtn = null;private Button gatherBtn = null;private PowerManager powerManager = null;private PowerManager.WakeLock wakeLock = null;private TrackReceiver trackReceiver = null;private SensorManager mSensorManager;private Double lastX = 0.0;private int mCurrentDirection = 0;private MapUtil mapUtil = null;private OnTraceListener traceListener = null;private OnTrackListener trackListener = null;private OnEntityListener entityListener = null;private RealTimeHandler realTimeHandler = new RealTimeHandler);private RealTimeLocRunnable realTimeLocRunnable = null;public int packInterval = Constants.DEFAULT_PACK_INTERVAL;private List<LatLng> trackPoints;private boolean firstLocate = true;@Overrideprotected void onCreateBundle savedInstanceState) {super.onCreatesavedInstanceState);setTitleR.string.tracing_title);setOptionsText);setOnClickListenerthis);init);}public void setOptionsText) {LinearLayout layout = LinearLayout) findViewByIdR.id.layout_top);TextView textView = TextView) layout.findViewByIdR.id.tv_options);textView.setText"轨迹追踪设置");}private void init) {initListener);trackApp = TrackApplication) getApplicationContext);viewUtil = new ViewUtil);mapUtil = MapUtil.getInstance);mapUtil.initMapView) findViewByIdR.id.tracing_mapView));mapUtil.setCentermCurrentDirection);powerManager = PowerManager) trackApp.getSystemServiceContext.POWER_SERVICE);mSensorManager = SensorManager) getSystemServiceSENSOR_SERVICE);traceBtn = Button) findViewByIdR.id.btn_trace);gatherBtn = Button) findViewByIdR.id.btn_gather);traceBtn.setOnClickListenerthis);gatherBtn.setOnClickListenerthis);setTraceBtnStyle);setGatherBtnStyle);trackPoints = new ArrayList<>);}@Overridepublic void onSensorChangedSensorEvent sensorEvent) {double x = sensorEvent.values[SensorManager.DATA_X];if Math.absx - lastX) > 1.0) {mCurrentDirection = int) x;if !CommonUtil.isZeroPointCurrentLocation.latitude, CurrentLocation.longitude)) {mapUtil.updateMapLocationnew LatLngCurrentLocation.latitude, CurrentLocation.longitude), float) mCurrentDirection);}}lastX = x;}@Overridepublic void onAccuracyChangedSensor sensor, int i) {}@Overridepublic void onClickView view) {switch view.getId)) {case R.id.btn_activity_options:ViewUtil.startActivityForResultthis, TracingOptionsActivity.class, Constants.REQUEST_CODE);break;case R.id.btn_trace:if trackApp.isTraceStarted) {trackApp.mClient.stopTracetrackApp.mTrace, traceListener);} else {trackApp.mClient.startTracetrackApp.mTrace, traceListener);}break;case R.id.btn_gather:if trackApp.isGatherStarted) {trackApp.mClient.stopGathertraceListener);} else {trackApp.mClient.setIntervalConstants.DEFAULT_GATHER_INTERVAL, packInterval);trackApp.mClient.startGathertraceListener);}break;default:break;}}private void setTraceBtnStyle) {boolean isTraceStarted = trackApp.trackConf.getBoolean"is_trace_started", false);if isTraceStarted) {traceBtn.setTextR.string.stop_trace);traceBtn.setTextColorContextCompat.getColorthis, R.color.white));if Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {traceBtn.setBackgroundResourcesCompat.getDrawablegetResources),R.mipmap.bg_btn_sure, null));} else {traceBtn.setBackgroundDrawableResourcesCompat.getDrawablegetResources),R.mipmap.bg_btn_sure, null));}} else {traceBtn.setTextR.string.start_trace);traceBtn.setTextColor ContextCompat.getColorthis, R.color.layout_title));if Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {traceBtn.setBackgroundResourcesCompat.getDrawablegetResources),R.mipmap.bg_btn_cancel, null));} else {traceBtn.setBackgroundDrawableResourcesCompat.getDrawablegetResources),R.mipmap.bg_btn_cancel, null));}}}private void setGatherBtnStyle) {boolean isGatherStarted = trackApp.trackConf.getBoolean"is_gather_started", false);if isGatherStarted) {gatherBtn.setTextR.string.stop_gather);gatherBtn.setTextColorContextCompat.getColorthis,R.color.white));if Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {gatherBtn.setBackgroundResourcesCompat.getDrawablegetResources),R.mipmap.bg_btn_sure, null));} else {gatherBtn.setBackgroundDrawableResourcesCompat.getDrawablegetResources),R.mipmap.bg_btn_sure, null));}} else {gatherBtn.setTextR.string.start_gather);gatherBtn.setTextColorContextCompat.getColorthis,R.color.layout_title));if Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {gatherBtn.setBackgroundResourcesCompat.getDrawablegetResources),R.mipmap.bg_btn_cancel, null));} else {gatherBtn.setBackgroundDrawableResourcesCompat.getDrawablegetResources),R.mipmap.bg_btn_cancel, null));}}}class RealTimeLocRunnable implements Runnable {private int interval = 0;public RealTimeLocRunnableint interval) {this.interval = interval;}@Overridepublic void run) {trackApp.getCurrentLocationentityListener, trackListener);realTimeHandler.postDelayedthis, interval * 1000);}}public void startRealTimeLocint interval) {realTimeLocRunnable = new RealTimeLocRunnableinterval);realTimeHandler.postrealTimeLocRunnable);}public void stopRealTimeLoc) {if null != realTimeHandler && null != realTimeLocRunnable) {realTimeHandler.removeCallbacksrealTimeLocRunnable);}trackApp.mClient.stopRealTimeLoc);}@Overrideprotected void onActivityResultint requestCode, int resultCode, Intent data) {if null == data) {return;}if data.hasExtra"locationMode")) {LocationMode locationMode = LocationMode.valueOfdata.getStringExtra"locationMode"));trackApp.mClient.setLocationModelocationMode);}trackApp.mTrace.setNeedObjectStoragefalse);if data.hasExtra"gatherInterval") && data.hasExtra"packInterval")) {int gatherInterval = data.getIntExtra"gatherInterval", Constants.DEFAULT_GATHER_INTERVAL);int packInterval = data.getIntExtra"packInterval", Constants.DEFAULT_PACK_INTERVAL);TracingActivity.this.packInterval = packInterval;trackApp.mClient.setIntervalgatherInterval, packInterval);}}private void initListener) {trackListener = new OnTrackListener) {@Overridepublic void onLatestPointCallbackLatestPointResponse response) {try {if StatusCodes.SUCCESS != response.getStatus)) {return;}LatestPoint point = response.getLatestPoint);if null == point || CommonUtil.isZeroPointpoint.getLocation).getLatitude), point.getLocation).getLongitude))) {return;}LatLng currentLatLng = mapUtil.convertTrace2Mappoint.getLocation));if null == currentLatLng) {return;}iffirstLocate){firstLocate = false;Toast.makeTextTracingActivity.this,"起点获取中,请稍后...",Toast.LENGTH_SHORT).show);return;}CurrentLocation.locTime = point.getLocTime);CurrentLocation.latitude = currentLatLng.latitude;CurrentLocation.longitude = currentLatLng.longitude;if trackPoints == null) {return;}trackPoints.addcurrentLatLng);mapUtil.drawHistoryTracktrackPoints, false, mCurrentDirection);} catch Exception x) {}}};entityListener = new OnEntityListener) {@Overridepublic void onReceiveLocationTraceLocation location) {try {if StatusCodes.SUCCESS != location.getStatus) || CommonUtil.isZeroPointlocation.getLatitude),location.getLongitude))) {return;}LatLng currentLatLng = mapUtil.convertTraceLocation2Maplocation);if null == currentLatLng) {return;}CurrentLocation.locTime = CommonUtil.toTimeStamplocation.getTime));CurrentLocation.latitude = currentLatLng.latitude;CurrentLocation.longitude = currentLatLng.longitude;if null != mapUtil) {mapUtil.updateMapLocationcurrentLatLng, mCurrentDirection);mapUtil.animateMapStatuscurrentLatLng);}} catch Exception x) {}}};traceListener = new OnTraceListener) {@Overridepublic void onBindServiceCallbackint errorNo, String message) {viewUtil.showToastTracingActivity.this,String.format"onBindServiceCallback, errorNo:%d, message:%s ", errorNo, message));}@Overridepublic void onStartTraceCallbackint errorNo, String message) {if StatusCodes.SUCCESS == errorNo || StatusCodes.START_TRACE_NETWORK_CONNECT_FAILED <= errorNo) {trackApp.isTraceStarted = true;SharedPreferences.Editor editor = trackApp.trackConf.edit);editor.putBoolean"is_trace_started", true);editor.apply);setTraceBtnStyle);registerReceiver);}viewUtil.showToastTracingActivity.this,String.format"onStartTraceCallback, errorNo:%d, message:%s ", errorNo, message));}@Overridepublic void onStopTraceCallbackint errorNo, String message) {if StatusCodes.SUCCESS == errorNo || StatusCodes.CACHE_TRACK_NOT_UPLOAD == errorNo) {trackApp.isTraceStarted = false;trackApp.isGatherStarted = false;SharedPreferences.Editor editor = trackApp.trackConf.edit);editor.remove"is_trace_started");editor.remove"is_gather_started");editor.apply);setTraceBtnStyle);setGatherBtnStyle);unregisterPowerReceiver);firstLocate = true;}viewUtil.showToastTracingActivity.this,String.format"onStopTraceCallback, errorNo:%d, message:%s ", errorNo, message));}@Overridepublic void onStartGatherCallbackint errorNo, String message) {if StatusCodes.SUCCESS == errorNo || StatusCodes.GATHER_STARTED == errorNo) {trackApp.isGatherStarted = true;SharedPreferences.Editor editor = trackApp.trackConf.edit);editor.putBoolean"is_gather_started", true);editor.apply);setGatherBtnStyle);stopRealTimeLoc);startRealTimeLocpackInterval);}viewUtil.showToastTracingActivity.this,String.format"onStartGatherCallback, errorNo:%d, message:%s ", errorNo, message));}@Overridepublic void onStopGatherCallbackint errorNo, String message) {if StatusCodes.SUCCESS == errorNo || StatusCodes.GATHER_STOPPED == errorNo) {trackApp.isGatherStarted = false;SharedPreferences.Editor editor = trackApp.trackConf.edit);editor.remove"is_gather_started");editor.apply);setGatherBtnStyle);firstLocate = true;stopRealTimeLoc);startRealTimeLocConstants.LOC_INTERVAL);if trackPoints.size) >= 1) {try {mapUtil.drawEndPointtrackPoints.gettrackPoints.size) - 1));} catch Exception e) {}}}viewUtil.showToastTracingActivity.this,String.format"onStopGatherCallback, errorNo:%d, message:%s ", errorNo, message));}@Overridepublic void onPushCallbackbyte messageType, PushMessage pushMessage) {}};}static class RealTimeHandler extends Handler {@Overridepublic void handleMessageMessage msg) {super.handleMessagemsg);}}private void registerReceiver) {if trackApp.isRegisterReceiver) {return;}if null == wakeLock) {wakeLock = powerManager.newWakeLockPowerManager.PARTIAL_WAKE_LOCK, "track upload");}if null == trackReceiver) {trackReceiver = new TrackReceiverwakeLock);}IntentFilter filter = new IntentFilter);filter.addActionIntent.ACTION_SCREEN_OFF);filter.addActionIntent.ACTION_SCREEN_ON);filter.addActionIntent.ACTION_USER_PRESENT);filter.addActionStatusCodes.GPS_STATUS_ACTION);trackApp.registerReceivertrackReceiver, filter);trackApp.isRegisterReceiver = true;}private void unregisterPowerReceiver) {if !trackApp.isRegisterReceiver) {return;}if null != trackReceiver) {trackApp.unregisterReceivertrackReceiver);}trackApp.isRegisterReceiver = false;}@Overrideprotected void onStart) {super.onStart);if trackApp.trackConf.contains"is_trace_started")&& trackApp.trackConf.contains"is_gather_started")&& trackApp.trackConf.getBoolean"is_trace_started", false)&& trackApp.trackConf.getBoolean"is_gather_started", false)) {startRealTimeLocpackInterval);} else {startRealTimeLocConstants.LOC_INTERVAL);}}@Overrideprotected void onResume) {super.onResume);mapUtil.onResume);mSensorManager.registerListenerthis, mSensorManager.getDefaultSensorSensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_UI);if Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {String packageName = trackApp.getPackageName);boolean isIgnoring = powerManager.isIgnoringBatteryOptimizationspackageName);if !isIgnoring) {Intent intent = new IntentSettings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);intent.setDataUri.parse"package:" + packageName));try {startActivityintent);} catch Exception ex) {ex.printStackTrace);}}}}@Overrideprotected void onPause) {super.onPause);mapUtil.onPause);}@Overrideprotected void onStop) {super.onStop);stopRealTimeLoc);mSensorManager.unregisterListenerthis);}@Overrideprotected void onDestroy) {super.onDestroy);stopRealTimeLoc);trackPoints.clear);trackPoints = null;mapUtil.clear);}@Overrideprotected int getContentViewId) {return R.layout.activity_tracing;}}
TracingOptionsActivity.java
package siso.track.activity;import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;import com.baidu.trace.model.LocationMode;import siso.track.utils.Constants;
import siso.track.R;import static com.baidu.trace.model.LocationMode.High_Accuracy;
public class TracingOptionsActivity extends BaseActivity {private Intent result = null;private EditText gatherIntervalText = null;private EditText packIntervalText = null;@Overrideprotected void onCreateBundle savedInstanceState) {super.onCreatesavedInstanceState);setTitleR.string.tracing_options_title);setOptionsButtonInVisible);init);}private void init) {gatherIntervalText = EditText) findViewByIdR.id.gather_interval);packIntervalText = EditText) findViewByIdR.id.pack_interval);gatherIntervalText.setOnFocusChangeListenernew View.OnFocusChangeListener) {@Overridepublic void onFocusChangeView view, boolean hasFocus) {EditText textView = EditText) view;String hintStr = textView.getHint).toString);if hasFocus) {textView.setHint"");} else {textView.setHinthintStr);}}});packIntervalText.setOnFocusChangeListenernew View.OnFocusChangeListener) {@Overridepublic void onFocusChangeView view, boolean hasFocus) {EditText textView = EditText) view;String hintStr = textView.getHint).toString);if hasFocus) {textView.setHint"");} else {textView.setHinthintStr);}}});}public void onCancelView v) {super.onBackPressed);}public void onFinishView v) {result = new Intent);RadioGroup locationModeGroup = RadioGroup) findViewByIdR.id.location_mode);RadioButton locationModeRadio = RadioButton) findViewByIdlocationModeGroup.getCheckedRadioButtonId));LocationMode locationMode = High_Accuracy;switch locationModeRadio.getId)) {case R.id.device_sensors:locationMode = LocationMode.Device_Sensors;break;case R.id.battery_saving:locationMode = LocationMode.Battery_Saving;break;case R.id.high_accuracy:locationMode = High_Accuracy;break;default:break;}result.putExtra"locationMode", locationMode.name));EditText gatherIntervalText = EditText) findViewByIdR.id.gather_interval);EditText packIntervalText = EditText) findViewByIdR.id.pack_interval);String gatherIntervalStr = gatherIntervalText.getText).toString);String packIntervalStr = packIntervalText.getText).toString);if !TextUtils.isEmptygatherIntervalStr)) {try {result.putExtra"gatherInterval", Integer.parseIntgatherIntervalStr));} catch Exception ex) {ex.printStackTrace);}}if !TextUtils.isEmptypackIntervalStr)) {try {result.putExtra"packInterval", Integer.parseIntpackIntervalStr));} catch Exception ex) {ex.printStackTrace);}}setResultConstants.RESULT_CODE, result);super.onBackPressed);}@Overrideprotected int getContentViewId) {return R.layout.activity_tracing_options;}}
TrackQueryActivity
package siso.track.activity;import siso.track.TrackApplication;
import siso.track.activity.BaseActivity;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.model.LatLng;
import com.baidu.trace.api.track.DistanceRequest;
import com.baidu.trace.api.track.DistanceResponse;
import com.baidu.trace.api.track.HistoryTrackRequest;
import com.baidu.trace.api.track.HistoryTrackResponse;
import com.baidu.trace.api.track.LatestPointResponse;
import com.baidu.trace.api.track.OnTrackListener;
import com.baidu.trace.model.ProcessOption;
import com.baidu.trace.api.track.SupplementMode;
import com.baidu.trace.api.track.TrackPoint;
import com.baidu.trace.model.SortType;
import com.baidu.trace.model.StatusCodes;
import com.baidu.trace.model.TransportMode;
import com.baidu.trace.model.CoordType;import java.util.ArrayList;
import java.util.List;import siso.track.activity.BaseActivity;
import siso.track.utils.CommonUtil;
import siso.track.utils.Constants;
import siso.track.utils.MapUtil;
import siso.track.utils.ViewUtil;
import siso.track.R;
public class TrackQueryActivity extends BaseActivityimplements View.OnClickListener {private TrackApplication trackApp = null;private ViewUtil viewUtil = null;private MapUtil mapUtil = null;private HistoryTrackRequest historyTrackRequest = new HistoryTrackRequest);private OnTrackListener mTrackListener = null;private long startTime = CommonUtil.getCurrentTime);private long endTime = CommonUtil.getCurrentTime);private List<LatLng> trackPoints = new ArrayList<>);private SortType sortType = SortType.asc;private int pageIndex = 1;@Overrideprotected void onCreateBundle savedInstanceState) {super.onCreatesavedInstanceState);setTitleR.string.track_query_title);setOptionsText);setOnClickListenerthis);trackApp = TrackApplication) getApplicationContext);init);}public void setOptionsText) {LinearLayout layout = LinearLayout) findViewByIdR.id.layout_top);TextView textView = TextView) layout.findViewByIdR.id.tv_options);textView.setText"查询条件设置");}private void init) {viewUtil = new ViewUtil);mapUtil = MapUtil.getInstance);mapUtil.initMapView) findViewByIdR.id.track_query_mapView));initListener);}@Overrideprotected void onActivityResultint historyTrackRequestCode, int resultCode, Intent data) {if null == data) {return;}trackPoints.clear);pageIndex = 1;if data.hasExtra"startTime")) {startTime = data.getLongExtra"startTime", CommonUtil.getCurrentTime));}if data.hasExtra"endTime")) {endTime = data.getLongExtra"endTime", CommonUtil.getCurrentTime));}ProcessOption processOption = new ProcessOption);if data.hasExtra"radius")) {processOption.setRadiusThresholddata.getIntExtra"radius", Constants.DEFAULT_RADIUS_THRESHOLD));}processOption.setTransportModeTransportMode.walking);if data.hasExtra"denoise")) {processOption.setNeedDenoisedata.getBooleanExtra"denoise", true));}if data.hasExtra"vacuate")) {processOption.setNeedVacuatedata.getBooleanExtra"vacuate", true));}if data.hasExtra"mapmatch")) {processOption.setNeedMapMatchdata.getBooleanExtra"mapmatch", true));}historyTrackRequest.setProcessOptionprocessOption);if data.hasExtra"processed")) {historyTrackRequest.setProcesseddata.getBooleanExtra"processed", true));}queryHistoryTrack);}private void queryHistoryTrack) {trackApp.initRequesthistoryTrackRequest);historyTrackRequest.setSupplementModeSupplementMode.no_supplement);historyTrackRequest.setSortTypeSortType.asc);historyTrackRequest.setCoordTypeOutputCoordType.bd09ll);historyTrackRequest.setEntityNametrackApp.entityName);historyTrackRequest.setStartTimestartTime);historyTrackRequest.setEndTimeendTime);historyTrackRequest.setPageIndexpageIndex);historyTrackRequest.setPageSizeConstants.PAGE_SIZE);trackApp.mClient.queryHistoryTrackhistoryTrackRequest, mTrackListener);}@Overridepublic void onClickView view) {switch view.getId)) {case R.id.btn_activity_options:ViewUtil.startActivityForResultthis, TrackQueryOptionsActivity.class, Constants.REQUEST_CODE);break;default:break;}}private void initListener) {mTrackListener = new OnTrackListener) {@Overridepublic void onHistoryTrackCallbackHistoryTrackResponse response) {try {int total = response.getTotal);if StatusCodes.SUCCESS != response.getStatus)) {viewUtil.showToastTrackQueryActivity.this, response.getMessage));} else if 0 == total) {viewUtil.showToastTrackQueryActivity.this, getStringR.string.no_track_data));} else {List<TrackPoint> points = response.getTrackPoints);if null != points) {for TrackPoint trackPoint : points) {if !CommonUtil.isZeroPointtrackPoint.getLocation).getLatitude),trackPoint.getLocation).getLongitude))) {trackPoints.addMapUtil.convertTrace2MaptrackPoint.getLocation)));}}}}if total > Constants.PAGE_SIZE * pageIndex) {historyTrackRequest.setPageIndex++pageIndex);queryHistoryTrack);} else {mapUtil.drawHistoryTracktrackPoints, true, 0);}queryDistance);} catch Exception e) {}}@Overridepublic void onDistanceCallbackDistanceResponse response) {viewUtil.showToastTrackQueryActivity.this, "里程:" + response.getDistance));super.onDistanceCallbackresponse);}};}private void queryDistance) {DistanceRequest distanceRequest = new DistanceRequesttrackApp.getTag), trackApp.serviceId, trackApp.entityName);distanceRequest.setStartTimestartTime);distanceRequest.setEndTimeendTime);distanceRequest.setProcessedtrue);ProcessOption processOption = new ProcessOption);processOption.setNeedDenoisetrue);processOption.setNeedMapMatchtrue);processOption.setTransportModeTransportMode.walking);distanceRequest.setProcessOptionprocessOption);distanceRequest.setSupplementModeSupplementMode.no_supplement);trackApp.mClient.queryDistancedistanceRequest, mTrackListener);}@Overrideprotected void onResume) {super.onResume);mapUtil.onResume);}@Overrideprotected void onPause) {super.onPause);mapUtil.onPause);}@Overrideprotected void onDestroy) {super.onDestroy);if null != trackPoints) {trackPoints.clear);}trackPoints = null;mapUtil.clear);}@Overrideprotected int getContentViewId) {return R.layout.activity_trackquery;}
}
TrackQueryOptionsActivity.java
package siso.track.activity;import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;import siso.track.TrackApplication;
import siso.track.utils.CommonUtil;
import siso.track.utils.Constants;
import siso.track.utils.DateDialog;import java.text.SimpleDateFormat;import siso.track.activity.BaseActivity;
import siso.track.R;
public class TrackQueryOptionsActivity extends BaseActivityimplements CompoundButton.OnCheckedChangeListener {private SimpleDateFormat simpleDateFormat = new SimpleDateFormat"yyyy年MM月dd日 HH:mm");private TrackApplication trackApp = null;private Intent result = null;private DateDialog dateDialog = null;private Button startTimeBtn = null;private Button endTimeBtn = null;private CheckBox processedCBx = null;private CheckBox denoiseCBx = null;private CheckBox vacuateCBx = null;private CheckBox mapmatchCBx = null;private TextView radiusText = null;private DateDialog.Callback startTimeCallback = null;private DateDialog.Callback endTimeCallback = null;private long startTime = CommonUtil.getCurrentTime);private long endTime = CommonUtil.getCurrentTime);private boolean isProcessed = true;private boolean isDenoise = false;private boolean isVacuate = false;private boolean isMapmatch = false;@Overrideprotected void onCreateBundle savedInstanceState) {super.onCreatesavedInstanceState);setTitleR.string.track_query_options_title);setOptionsButtonInVisible);init);trackApp = TrackApplication) getApplication);}private void init) {result = new Intent);startTimeBtn = Button) findViewByIdR.id.start_time);endTimeBtn = Button) findViewByIdR.id.end_time);processedCBx = CheckBox) findViewByIdR.id.processed);denoiseCBx = CheckBox) findViewByIdR.id.denoise);vacuateCBx = CheckBox) findViewByIdR.id.vacuate);mapmatchCBx = CheckBox) findViewByIdR.id.mapmatch);radiusText = TextView) findViewByIdR.id.radius_threshold);StringBuilder startTimeBuilder = new StringBuilder);startTimeBuilder.appendgetResources).getStringR.string.start_time));startTimeBuilder.appendsimpleDateFormat.formatSystem.currentTimeMillis)));startTimeBtn.setTextstartTimeBuilder.toString));StringBuilder endTimeBuilder = new StringBuilder);endTimeBuilder.appendgetResources).getStringR.string.end_time));endTimeBuilder.appendsimpleDateFormat.formatSystem.currentTimeMillis)));endTimeBtn.setTextendTimeBuilder.toString));processedCBx.setOnCheckedChangeListenerthis);denoiseCBx.setOnCheckedChangeListenerthis);vacuateCBx.setOnCheckedChangeListenerthis);mapmatchCBx.setOnCheckedChangeListenerthis);}public void onStartTimeView v) {if null == startTimeCallback) {startTimeCallback = new DateDialog.Callback) {@Overridepublic void onDateCallbacklong timeStamp) {TrackQueryOptionsActivity.this.startTime = timeStamp;StringBuilder startTimeBuilder = new StringBuilder);startTimeBuilder.appendgetResources).getStringR.string.start_time));startTimeBuilder.appendsimpleDateFormat.formattimeStamp * 1000));startTimeBtn.setTextstartTimeBuilder.toString));}};}if null == dateDialog) {dateDialog = new DateDialogthis, startTimeCallback);} else {dateDialog.setCallbackstartTimeCallback);}dateDialog.show);}public void onEndTimeView v) {if null == endTimeCallback) {endTimeCallback = new DateDialog.Callback) {@Overridepublic void onDateCallbacklong timeStamp) {TrackQueryOptionsActivity.this.endTime = timeStamp;StringBuilder endTimeBuilder = new StringBuilder);endTimeBuilder.appendgetResources).getStringR.string.end_time));endTimeBuilder.appendsimpleDateFormat.formattimeStamp * 1000));endTimeBtn.setTextendTimeBuilder.toString));}};}if null == dateDialog) {dateDialog = new DateDialogthis, endTimeCallback);} else {dateDialog.setCallbackendTimeCallback);}dateDialog.show);}public void onCancelView v) {super.onBackPressed);}public void onFinishView v) {result.putExtra"startTime", startTime);result.putExtra"endTime", endTime);result.putExtra"processed", isProcessed);result.putExtra"denoise", isDenoise);result.putExtra"vacuate", isVacuate);result.putExtra"mapmatch", isMapmatch);String radiusStr = radiusText.getText).toString);if !TextUtils.isEmptyradiusStr)) {try {result.putExtra"radius", Integer.parseIntradiusStr));} catch Exception ex) {ex.printStackTrace);}}setResultConstants.RESULT_CODE, result);super.onBackPressed);}@Overridepublic void onCheckedChangedCompoundButton compoundButton, boolean isChecked) {switch compoundButton.getId)) {case R.id.processed:isProcessed = isChecked;break;case R.id.denoise:isDenoise = isChecked;break;case R.id.vacuate:isVacuate = isChecked;break;case R.id.mapmatch:isMapmatch = isChecked;break;default:break;}}@Overrideprotected int getContentViewId) {return R.layout.activity_trackquery_options;}}
TrackApplication.java
package siso.track;import android.app.Application;
import android.app.Notification;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.DisplayMetrics;import com.baidu.mapapi.SDKInitializer;
import com.baidu.trace.LBSTraceClient;
import com.baidu.trace.Trace;
import com.baidu.trace.api.entity.LocRequest;
import com.baidu.trace.api.entity.OnEntityListener;
import com.baidu.trace.api.track.LatestPointRequest;
import com.baidu.trace.api.track.OnTrackListener;
import com.baidu.trace.model.BaseRequest;
import com.baidu.trace.model.OnCustomAttributeListener;
import com.baidu.trace.model.ProcessOption;
import com.baidu.trace.model.TransportMode;import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;public class TrackApplication extends Application {private AtomicInteger mSequenceGenerator = new AtomicInteger);private LocRequest locRequest = null;public Context mContext = null;public SharedPreferences trackConf = null;public LBSTraceClient mClient = null;public Trace mTrace = null;public long serviceId = 162074;public String entityName = "myTrace";public boolean isRegisterReceiver = false;public boolean isTraceStarted = false;public boolean isGatherStarted = false;public static int screenWidth = 0;public static int screenHeight = 0;@Overridepublic void onCreate) {super.onCreate);mContext = getApplicationContext);entityName = siso.track.utils.CommonUtil.getImeithis);if "siso.track:remote".equalssiso.track.utils.CommonUtil.getCurProcessNamemContext))) {return;}SDKInitializer.initializemContext);getScreenSize);mClient = new LBSTraceClientmContext);mTrace = new TraceserviceId, entityName);trackConf = getSharedPreferences"track_conf", MODE_PRIVATE);locRequest = new LocRequestserviceId);mClient.setOnCustomAttributeListenernew OnCustomAttributeListener) {@Overridepublic Map<String, String> onTrackAttributeCallback) {Map<String, String> map = new HashMap<>);map.put"key1", "value1");map.put"key2", "value2");return map;}});clearTraceStatus);}public void getCurrentLocationOnEntityListener entityListener, OnTrackListener trackListener) {if siso.track.utils.NetUtil.isNetworkAvailablemContext)&& trackConf.contains"is_trace_started")&& trackConf.contains"is_gather_started")&& trackConf.getBoolean"is_trace_started", false)&& trackConf.getBoolean"is_gather_started", false)) {LatestPointRequest request = new LatestPointRequestgetTag), serviceId, entityName);ProcessOption processOption = new ProcessOption);processOption.setRadiusThreshold50);processOption.setTransportModeTransportMode.walking);processOption.setNeedDenoisetrue);processOption.setNeedMapMatchtrue);request.setProcessOptionprocessOption);mClient.queryLatestPointrequest, trackListener);} else {mClient.queryRealTimeLoclocRequest, entityListener);}}private void getScreenSize) {DisplayMetrics dm = getResources).getDisplayMetrics);screenHeight = dm.heightPixels;screenWidth = dm.widthPixels;}private void clearTraceStatus) {if trackConf.contains"is_trace_started") || trackConf.contains"is_gather_started")) {SharedPreferences.Editor editor = trackConf.edit);editor.remove"is_trace_started");editor.remove"is_gather_started");editor.apply);}}public void initRequestBaseRequest request) {request.setTaggetTag));request.setServiceIdserviceId);}public int getTag) {return mSequenceGenerator.incrementAndGet);}}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="siso.track"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_OWNER_DATA" /><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><uses-permission android:name="android.permission.READ_LOGS" /><uses-permission android:name="android.permission.VIBRATE" /><uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.WRITE_SETTINGS" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /><applicationandroid:name="siso.track.TrackApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activityandroid:name="siso.track.activity.MainActivity"android:screenOrientation="portrait"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="bsewxQvoh47gxgzI7CIEb6VPCxZcIiTE" /><activityandroid:name="siso.track.activity.TracingActivity"android:screenOrientation="portrait" /><activityandroid:name="siso.track.activity.TrackQueryActivity"android:screenOrientation="portrait" /><activityandroid:name="siso.track.activity.TracingOptionsActivity"android:screenOrientation="portrait"android:theme="@style/AppBaseTheme" /><activityandroid:name="siso.track.activity.TrackQueryOptionsActivity"android:screenOrientation="portrait"android:theme="@style/AppBaseTheme" /><serviceandroid:name="com.baidu.trace.LBSTraceService"android:enabled="true"android:exported="true"android:process=":remote" /></application></manifest>
build.gradle
apply plugin: 'com.android.application'android {compileSdkVersion 26buildToolsVersion "27.0.3"defaultConfig {applicationId 'siso.baidugj'minSdkVersion 24targetSdkVersion 24versionCode 1versionName "1.0"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile'proguard-android.txt'), 'proguard-rules.pro'}}sourceSets {main {jniLibs.srcDirs = ['libs']}}productFlavors {}
}dependencies {compile fileTreeinclude: ['*.jar'], dir: 'libs')testCompile 'junit:junit:4.12'compile 'com.android.support:appcompat-v7:26.1.0'compile files'libs/BaiduLBS_Android.jar')compile files'libs/BaiduTraceSDK_v3_0_4.jar')compile files'libs/bos-android-sdk-1.0.2.jar')
}
运行结果如图:


