Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >腾讯位置服务GPS轨迹录制-安卓篇

腾讯位置服务GPS轨迹录制-安卓篇

原创
作者头像
腾讯位置服务
发布于 2021-05-14 04:10:14
发布于 2021-05-14 04:10:14
1.2K0
举报
文章被收录于专栏:腾讯位置服务腾讯位置服务

前言

在地图的使用中,尤其在导航场景下,进行GPS轨迹录制是十分必要并且有用的,本文会对于安卓系统下的轨迹录制部分做一个分享。

系统架构

16202923779379.jpg
16202923779379.jpg

对于一个GPSRecordSystem(GPS轨迹录制系统)主要分成3个部分:开始录制,录制GPS定位,结束录制并存储,如上图右方所示。在实际应用中,以导航系统为例:(1)在开始导航时(start navi),进行录制工作的相关配置;(2)收到安卓系统的onLocationChanged的callback进行GPSLocation的记录;(3)结束导航(stop navi)时,停止记录并存入文件。

相关代码展示

用到的相关变量

代码语言:txt
AI代码解释
复制
	private LocationManager mLocationManager;   // 系统locationManager
	private LocationListener mLocationListener; // 系统locationListener
	
	private boolean mIsRecording = false;       // 是否正在录制 

	private List<String> mGpsList;              // 记录gps的list
	private String mRecordFileName;             // gps文件名称
  • 开始录制

开始录制一般是在整个系统工作之初,比如在导航场景下,当“开始导航”时,可以开始进行“startRecordLocation” 的配置

代码语言:txt
AI代码解释
复制
	public void startRecordLocation(Context context, String fileName) {
		// 已经在录制中不进行录制
		if (mIsRecording) {
			return;
		}
		Toast.makeText(context, "start record location...", Toast.LENGTH_SHORT).show();
		
		// 初始化locationManager和locationListener
		mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
		mLocationListener = new MyLocationListener();
		try {
			// 添加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();
		}

// 记录文件名称,笔者这里使用“realLocationRecord + routeID”形式进行记录
		mRecordFileName = fileName;
		if (!mRecordFileName.endsWith(".gps")) {
			mRecordFileName += ".gps";
		}

		mIsRecording = true;
	}
  • 录制中记录轨迹 记录location一般是在获取安卓系统onLocationChanged回调时调用“recordGPSLocation”
代码语言:txt
AI代码解释
复制
	public void recordGPSLocation(Location location) {
		if (mIsRecording && location != null) {
		// 记录location to list
			mGpsList.add(locationToString(location));
		}
	}

locationToString工具方法

驱动导航工作的GPS轨迹点一般要包含以下几个要素,经度,纬度,精度,角度,速度,时间,海拔高度,所以在此记录下,为后期轨迹回放做准备。

代码语言:txt
AI代码解释
复制
	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((double) time / 1000.0));
		// sb.append(df.format(System.currentTimeMillis()/1000.0));
		// sb.append(df.format(location.getTime()/1000.0));
		sb.append(",");
		sb.append(location.getAltitude());
		sb.append("\n");
		return sb.toString();
	}
  • 结束录制并保存gps文件

结束录制一般作用在整个系统的结尾,例如在导航场景下,“结束导航”时停止录制调用“stopRecordLocation”

代码语言:txt
AI代码解释
复制
	public void stopRecordLocation(Context context) {
        Toast.makeText(context, "stop record location, save to file...", Toast.LENGTH_SHORT).show();
        
        // 移除listener
		mLocationManager.removeUpdates(mLocationListener);
		String storagePath = StorageUtil.getStoragePath(context); // 存储的路径
		String filePath = storagePath + mRecordFileName;

		saveGPS(filePath);
		mIsRecording = false;
	}

GPS轨迹存储工具方法

代码语言:txt
AI代码解释
复制
	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);
				}
			}
		}
	}
	

StorageUtil的getStoragePath工具方法

代码语言:txt
AI代码解释
复制
// 存储在跟路径下/TencentMapSDK/navigation
    private static final String NAVIGATION_PATH = "/tencentmapsdk/navigation";

// getStoragePath工具方法
    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()) { // 目录不存在,创建目录
                if (!file.mkdirs()) {
                    strFolder = context.getFilesDir().getPath() + NAVIGATION_PATH;
                    file = new File(strFolder);
                    if (!file.exists()) {
                        file.mkdirs();
                    }
                }
            } else { // 目录存在,创建文件测试是否有权限
                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;
    }

结果展示

最终存储在了手机目录下的navigation目录

16202872001222.jpg
16202872001222.jpg

后续工作

后续可以对于录制的gps文件讲解在导航场景下进行轨迹回放的分享

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
腾讯位置服务GPS轨迹回放-安卓篇
当我们使用地图进行开发时,利用已经录制好的轨迹进行轨迹回放来检查导航的准确性是十分常用的手段,并且上一篇已经讲完了关于地图使用时GPS轨迹文件的录制,现在对于安卓系统下使用腾讯导航SDK进行轨迹回放做一个分享
腾讯位置服务
2021/06/04
2.3K0
Android GB28181接入端实时位置订阅和上报之-如何获取当前经纬度
我们在做Android平台GB28181的时候,其中实时位置(MobilePosition)订阅和上报这块,涉及到实时经纬度的获取,特别是执法记录、车载系统的那个等场景,几乎就是标配。
音视频牛哥
2022/09/21
8240
android中几种定位方式详解
目前,移动端大致通过三种方式来进行设备定位:GPS、基站、wifi。本文就详细的讲解一下这几种定位方式和实现方法。
BennuCTech
2021/12/10
7.9K0
android中几种定位方式详解
位置定位(LocationManager)
LocationManager是Android 提供的Location 服务,来获得当前的位置信息和卫星信息。
李小白是一只喵
2020/06/11
2.7K0
位置定位(LocationManager)
Arcgis For Android之GPS定位实现
翻开以前做的东西,看了看,很多从逻辑上比较乱,对之做了修改,完成后实现的效果为: MapActivity源代码如下: package com.lzugis.map; import java.io.File; import java.util.Iterator; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.location.Gps
牛老师讲GIS
2018/10/23
1.9K0
一文揭秘那些牛逼的安卓收集crash如何实现
大家都知道,我们在测试过程当中,都会遇到crash,那么我们需要收集这些日志,然后给开发处理,正常的情况下呢,我们都会去抓log来实现的。我们常用的就是.
雷子
2021/03/15
5540
一文揭秘那些牛逼的安卓收集crash如何实现
Android 关于文件及文件夹的创建 、删除、重命名、复制拷贝
zhangjiqun
2024/12/16
2660
Android自定义崩溃收集器捕获java层和native层崩溃异常日志
3.native层的崩溃收集可以使用编译好的breakpad.so。(参考 https://github.com/yinyinnie/breakpad-for-android.git)
北洋
2021/12/08
1.4K0
Google Map
上一章介绍了如何使用Android的GPS来获取设备的定位信息,但这种方式得到的定位信息只不过是一些数字的经度、纬度值,如果这些经度、纬度值不能以更加形象、直观的方式显示出来,对于大部分普通用户而言,这些数据几乎没有任何价值。要想让这些经纬度值“派上”用场,就需要用到本章中介绍到的Google Map服务。在本章中我们首先对Google Map进行简单的介绍,然后介绍Android中进行Google Map开发需要的准备工作,最后通过一系列的案例讲解了在Android中进行Google Map开发的方法及技巧。
张哥编程
2024/12/17
8030
Google Map
LocationManager的简单使用
当在真机上运行时,弹出定位错误信息,则可能是因为没有打开定位权限,需要自己手动打开,运行成功弹出你所在的城市的位置。
全栈程序员站长
2022/07/22
1.1K0
LocationManager的简单使用
微信模拟位置想在哪就在哪(GPS欺骗)
微信模拟位置是通过位置欺骗,让微信误以为我们就在当前的位置进行周边好友的搜索与添加。
全栈程序员站长
2022/08/12
2.8K0
微信模拟位置想在哪就在哪(GPS欺骗)
把一个txt文件转化为带标题栏的Excel文档
public class Export { public static final String CSVNAME_COMPETITION="cpc.csv"; } public class CSV { public static final String ENDLINE = "\n"; public static final Map<String,String> HEADLINES=new HashMap<String,String>(); static{ //分别是Excel文档的第
用户5166556
2019/04/16
7590
Android 集成腾讯定位
由于众所周知的原因,在中国境内所有的出版电子地图都必须要经过至少一次加偏(也就是所谓的国测局火星坐标系),因此国内地图提供商为了更好的对接产品,纷纷推出了自家的坐标系,也就是在火星坐标系基础之上再次加偏的高德坐标、百度坐标。
宋天伦
2020/07/16
1.8K0
Android 集成腾讯定位
系统捕获异常并发送到服务器
大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了
xiangzhihong
2018/01/30
1K0
系统捕获异常并发送到服务器
百度地图---获取当前的位置返回的是汉字显示而不是经纬度
这个需求在百度地图里面实现很简单,但是出了一大堆的乱起八糟的错误,错误等到后面的文章再说,先说要获取当前位置怎么做
wust小吴
2019/07/08
2.7K0
《移动互联网技术》第九章 感知与多媒体: 了解质感设计的基本原则和设计方法
《移动互联网技术》课程是软件工程、电子信息等专业的专业课,主要介绍移动互联网系统及应用开发技术。课程内容主要包括移动互联网概述、无线网络技术、无线定位技术、Android应用开发和移动应用项目实践等五个部分。移动互联网概述主要介绍移动互联网的概况和发展,以及移动计算的特点。无线网络技术部分主要介绍移动通信网络(包括2G/3G/4G/5G技术)、无线传感器网络、Ad hoc网络、各种移动通信协议,以及移动IP技术。无线定位技术部分主要介绍无线定位的基本原理、定位方法、定位业务、数据采集等相关技术。Android应用开发部分主要介绍移动应用的开发环境、应用开发框架和各种功能组件以及常用的开发工具。移动应用项目实践部分主要介绍移动应用开发过程、移动应用客户端开发、以及应用开发实例。 课程的教学培养目标如下: 1.培养学生综合运用多门课程知识以解决工程领域问题的能力,能够理解各种移动通信方法,完成移动定位算法的设计。 2.培养学生移动应用编程能力,能够编写Andorid应用的主要功能模块,并掌握移动应用的开发流程。 3. 培养工程实践能力和创新能力。  通过本课程的学习应达到以下目的: 1.掌握移动互联网的基本概念和原理; 2.掌握移动应用系统的设计原则; 3.掌握Android应用软件的基本编程方法; 4.能正确使用常用的移动应用开发工具和测试工具。
猫头虎
2024/04/08
2660
羊皮书APP(Android版)开发系列(十)Android开发常用工具类
Android开发过程中,我们需要的很多代码都是重复多次使用的,写成工具类是一个比较好的做法,下面是我常用的几个工具类,也希望对你有所帮助。分别是:日期格式化工具、转换图片颜色工具、app启动引导页控制工具、Intent 工具、手机信息采集工具、存储和访问SharedPreferences工具、正则表达式工具、SD卡片工具、Toast信息工具、app版本工具、错误信息反馈工具、类型转换工具。 大家可到github上下载代码AndroidUtils。 日期格式化工具 package cn.studyou
热心的程序员
2018/08/30
9360
Java如何实现定位
最近了不起这边有个项目需求,我们需要知道设备所在的位置,进而进行未来5天的天气预估,做这个就是为了看天气有没有太阳。
灬沙师弟
2023/12/11
6490
Java如何实现定位
Android平台GPS系统的应用开发
第一部分、前述: Android作为Google移动互联网战略的重要组成部分,将进一步推进“随时随地为每个人提供信息”这一企业目标的实现。Google的目标是让移动通信不依赖于设备,甚至是平台。出于这个目的,Android将完善而不是替代Google长期以来推行的移动发展战略:通过与全球各地的手机制造商和移动运营商成为合作伙伴,开发既实用又有吸引力的移动服务,并推广这些产品。 随着城市化的进展和家用轿车的普及.原本根遥远的全球卫星定位系统(Global Position System.6Ps)的使用越来越多
庞小明
2018/03/07
4.7K0
Android平台GPS系统的应用开发
推荐阅读
相关推荐
腾讯位置服务GPS轨迹回放-安卓篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档