preface
In the use of maps, especially in navigation scenes, GPS track recording is very necessary and useful. This paper will share the track recording part under Android system.
System architecture
For a GPS record system (GPS track recording system) there are three main parts: start recording, record GPS positioning, end recording and storage, as shown on the right side of the figure above. In practical application, take the navigation system as an example :(1) start navi, recording work related configuration; (2) Receiving the GPSLocation record of the onLocationChanged callback of Android system; (3) At the end of the navigation (Stop navi), stop recording and save the file.
Related code display
Relevant variables used
private LocationManager mLocationManager; // System locationManager private LocationListener; Private Boolean mIsRecording = false; Private List<String> mGpsList; Private String mRecordFileName; // GPS file nameCopy the code
- Start recording
Start recording is generally at the beginning of the whole system. For example, in the navigation scenario, when “Start navigation”, you can start the configuration of “startRecordLocation”
Public void startRecordLocation(Context Context, String fileName) {// Not recording if (mIsRecording) {return; } Toast.makeText(context, "start record location..." , Toast.LENGTH_SHORT).show(); // Initialize locationManager and locationListener mLocationManager = (locationManager) context.getSystemService(Context.LOCATION_SERVICE); mLocationListener = new MyLocationListener(); Try {/ / add the listener mLocationManager. RequestLocationUpdates (LocationManager GPS_PROVIDER, 0, 0, mLocationListener); } catch (SecurityException e) { Toast.makeText(context, "start record location error!!!" , Toast.LENGTH_SHORT).show(); Log.e(TAG, "startRecordLocation Exception", e); e.printStackTrace(); } mRecordFileName = fileName; if (! mRecordFileName.endsWith(".gps")) { mRecordFileName += ".gps"; } mIsRecording = true; }Copy the code
- Record track during recording
Recording location is usually done by calling “recordGPSLocation” when you get the Android onLocationChanged callback.
public void recordGPSLocation(Location location) { if (mIsRecording && location ! = null) {// Record location to list mGpsList. Add (locationToString(location)); }}Copy the code
LocationToString tool method
GPS track points that drive navigation generally include the following elements, such as longitude, latitude, accuracy, Angle, speed, time and altitude, so they are recorded here to prepare for track playback in the later stage.
private String locationToString(Location location) { StringBuilder sb = new StringBuilder(); long time = System.currentTimeMillis(); String timeStr = gpsDataFormatter.format(new Date(time)); sb.append(location.getLatitude()); sb.append(","); sb.append(location.getLongitude()); sb.append(","); sb.append(location.getAccuracy()); sb.append(","); sb.append(location.getBearing()); sb.append(","); sb.append(location.getSpeed()); sb.append(","); sb.append(timeStr); sb.append(","); Sb. Append (df) format (1000.0) (double) time /); / / sb. Append (df) format (System. CurrentTimeMillis () / 1000.0)); / / sb. Append (df) format (the location. The getTime () / 1000.0)); sb.append(","); sb.append(location.getAltitude()); sb.append("\n"); return sb.toString(); }Copy the code
- End recording and save the GPS file
End recording is generally used at the end of the entire system. For example, in the navigation scene, stop recording when “end navigation” calls “stopRecordLocation”.
public void stopRecordLocation(Context context) { Toast.makeText(context, "stop record location, save to file..." , Toast.LENGTH_SHORT).show(); / / remove the listener mLocationManager. RemoveUpdates (mLocationListener); String storagePath = StorageUtil.getStoragePath(context); String filePath = storagePath + mRecordFileName; // storagePath String filePath = storagePath + mRecordFileName; saveGPS(filePath); mIsRecording = false; }Copy the code
GPS track storage tool method
private void saveGPS(String path) {
OutputStreamWriter writer = null;
try {
File outFile = new File(path);
File parent = outFile.getParentFile();
if (parent != null && !parent.exists()) {
parent.mkdirs();
}
OutputStream out = new FileOutputStream(outFile);
writer = new OutputStreamWriter(out);
for (String line : mGpsList) {
writer.write(line);
}
} catch (Exception e) {
Log.e(TAG, "saveGPS Exception", e);
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.flush();
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, "Failed to flush output stream", e);
}
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, "Failed to close output stream", e);
}
}
}
}
Copy the code
The getStoragePath tool method of StorageUtil
/ / stored in the follow path/TencentMapSDK/navigation under private static final String NAVIGATION_PATH = "/ TencentMapSDK/navigation"; Public static String getStoragePath(Context Context) {if (Context == null) {return null; } String strFolder; boolean hasSdcard; try { hasSdcard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); } catch (Exception e) { Log.e(TAG, "getStoragePath Exception", e); e.printStackTrace(); hasSdcard = false; } if (! hasSdcard) { strFolder = context.getFilesDir().getPath() + NAVIGATION_PATH; File file = new File(strFolder); if (! file.exists()) { file.mkdirs(); } } else { strFolder = Environment.getExternalStorageDirectory().getPath() + NAVIGATION_PATH; File file = new File(strFolder); if (! File.exists ()) {// Directory does not exist, create directory if (! file.mkdirs()) { strFolder = context.getFilesDir().getPath() + NAVIGATION_PATH; file = new File(strFolder); if (! file.exists()) { file.mkdirs(); Try {String newFile = strFolder + "/.test"; File tmpFile = new File(newFile); if (tmpFile.createNewFile()) { tmpFile.delete(); } } catch (IOException e) { e.printStackTrace(); Log.e(TAG, "getStoragePath Exception", e); strFolder = context.getFilesDir().getPath() + NAVIGATION_PATH; file = new File(strFolder); if (! file.exists()) { file.mkdirs(); } } } } return strFolder; }Copy the code
The results show
It ends up in the navigation directory under the phone’s directory
The follow-up work
Later, the recorded GPS files can be explained to share track playback in navigation scenarios