最近做项目的时候突然发现可以给自己的手机加一个定位的系统,定时往服务器发送自己的位置,之后再把这些坐标放到百度地图之类的sdk上面,就能画出一天的行程。【以下只是下班之后弄的,其实代码只完成了50%,所以就不把代码贴出来了只是写一些代码逻辑,主要用来记录整个过程。
(一)关于定位的知识,这篇文章说得很详细https://www.cnblogs.com/kdkler/p/6196751.html。除了LocationManager等自带的工具类,咱们还可以使用百度定位的sdk。在定位之前,最好先获取当前最精准的地理位置传感器,android手机所有的传感器信息可以使用LocationManager类下的getAllProviders()获得,然后筛选
LocationManager.GPS_PROVIDER
LocationManager.NETWORK_PROVIDER
LocationManager.PASSIVE_PROVIDER
一般首选GPS。
(二)因为咱们这个功能必须要在后台长时间运行,所以必须使用service,并且要给这个定位的service开启另一个进程
android:process=":xxxService"
使用一个定时器或者一个不停短暂停止的thread获取到经纬度之后,使用Handler发送定位信息给主进程
ThreadManagerUtil.getThreadPollProxy().execute(new Runnable() {
@Override
public void run() {
Bundle bundle = new Bundle();
bundle.putString("address", address);
bundle.putDouble("latitude", latitude);
bundle.putDouble("longitude", longitude);
Message msg = new Message();
msg.what = GET_MESSENGER;
msg.setData(bundle);
try {
if (mLocalMessenger != null) {
mLocalMessenger.send(msg);
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
备注:经过测试,有些手机在室内或者一些奇怪的地方会获取不到经纬度,所以我在成功定位到一次位置之后就把经纬度保存到SharedPreferences里,以保证后续再地图上画线的连续性。
(三)android的高版本因为要提升系统的流畅性以及省电,会对后台没有任务标记的serivce进行扑杀,所以必须要加上一个保活的功能,我使用的是双进程守护,当其中一个进程被被kill时,另外一个进程负责重启。这篇关于双进程守护的文章说得很详细https://blog.csdn.net/qq_38520096/article/details/79007228
(四)要查看轨迹的话就用另一个app,这个app专门读取服务器上的经纬度数据,然后用百度地图api画出线路图https://blog.csdn.net/u013351759/article/details/51768136
【先记录到这,后续再完善