Android GPS定位实现,教你如何一分钟实现GPS定位

转载请注明出处:http://blog.csdn.net/smartbetter/article/details/50425041

今天给大家带来的是一篇关于GPS定位的文章,我们都知道,Android定位大致分为wifi定位,基站定位和GPS定位,今天我就带大家来看看GPS定位是什么玩意,通过本篇的学习,相信大家能很快上手GPS定位操作了。GPS定位是通过和GPS定位卫星通讯来进行定位的,可以使用最少数量的卫星实现全球定位,3颗,通过光波进行通讯,不需要联网,但是连接时间比较长,大致1分钟左右吧。好了,大致有个了解了,接下来我们开始进入GPS实践篇章吧,通过本篇的学习后,挑战一下一分钟实现GPS定位你自己的坐标吧,哈哈。

一、定位的三种方式

1.wifi定位,ip地址定位,通过ip地址进行查询实际地址;
2.基站定位,信号塔,基站:手机通讯服务的设备 ,信号的格数决定了手机距离基站远近,精确度:几十米到几公里,精确度来自于基站的数量

wifi定位和基站定位局限性:不能定位海拔;

3.GPS定位,通过和GPS定位卫星通讯进行定位的,使用最少卫星实现全球定位,3颗,通过光波进行通讯,不需要联网,连接时间比较长,1分钟,比较费电,AGPS技术,通过联网来修正GPS定位坐标,AGPS技术需要联网,GPS不需要联网;

二、定位的具体代码实现(了解整个流程)

1.MainActivity.java

public class MainActivity extends Activity {
	private LocationManager locationManager;
	private TextView textview1;
	private MyLocationListener myLocationListener;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		textview1 = (TextView) findViewById(R.id.textview1);
		//1.获取位置的管理者
		locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
		//2.获取定位方式
		//2.1获取所有的定位方式,true:表示返回所有可用定位方式
		List<String> providers = locationManager.getProviders(true);
		for (String string : providers) {
			System.out.println(string);
		}
		//2.2获取最佳的定位方式
		Criteria criteria = new Criteria();
		criteria.setAltitudeRequired(true);//设置是否可以定位海拔,如果设置定位海拔,返回一定是gps
		//criteria : 设置定位属性
		//enabledOnly : true如果定位可用就返回
		String bestProvider = locationManager.getBestProvider(criteria, true);
		System.out.println("最佳的定位方式:"+bestProvider);
		//3.定位
		myLocationListener = new MyLocationListener();
		//provider : 定位的方式
		//minTime : 定位的最小时间间隔
		//minDistance : 定位最小的间隔距离
		//LocationListener : 定位监听
		locationManager.requestLocationUpdates(bestProvider, 0, 0, myLocationListener);
	}

	private class MyLocationListener implements LocationListener{
		//当定位位置改变的调用的方法
		//Location : 当前的位置
		@Override
		public void onLocationChanged(Location location) {
			location.getAccuracy();//获取精确位置
			location.getAltitude();//获取海拔
			double latitude = location.getLatitude();//获取纬度,平行于赤道
			double longitude = location.getLongitude();//获取经度,垂直于赤道
			textview1.setText("longitude:"+longitude+"  latitude:"+latitude);
		}
		//当定位状态发生改变的时候调用的方式
		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {
			// TODO Auto-generated method stub

		}
		//当定位可用的时候调用的方法
		@Override
		public void onProviderEnabled(String provider) {
			// TODO Auto-generated method stub

		}
		//当定位不可用的时候调用的方法
		@Override
		public void onProviderDisabled(String provider) {
			// TODO Auto-generated method stub

		}
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		locationManager.removeUpdates(myLocationListener);//关闭gps,但是高版本中规定打开和关闭gps必须由用户自己主观的去实现,代码已经不允许进行操作
	}
}

2.activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

3.需要添加的权限

android.permission.ACCESS_MOCK_LOCATION : 模拟位置的权限,模拟器中必须添加,真机可加可不加
android.permission.ACCESS_FINE_LOCATION : 精确位置的权限,都必须添加
android.permission.ACCESS_COARSE_LOCATION : 大概位置的权限,都必须添加

4.我们运行一下,运行效果如下

三、验证坐标的准确度

打开百度坐标拾取系统,进行坐标反查,(勾选坐标反查,百度搜索框中填入:经度,纬度),点击百度一下。
注意:会有一定误差
原因:是一种国家保密插件,也叫做加密插件或者加偏或者SM模组,其实就是对真实坐标系统进行人为的加偏处理,按照特殊的算法,将真实的坐标加密成虚假的坐标,而这个加偏并不是线性的加偏,所以各地的偏移情况都会有所不同。而加密后的坐标也常被人称为火星坐标系统。

四、纠正坐标为真实坐标

算法纠正

五、定位移植到实际开发项目中

1.问题:广播接受者中的onReceive方法执行时间不能超过10秒,超过了就不会再执行代码了,而GPS连接需要1分钟左右

解决方案:a.开启一个服务,让该服务在后台运行,在服务中不断的进行定位操作,代码如下:

public class GPSService extends Service {
	private LocationManager locationManager;
	private MyLocationListener myLocationListener;

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();

		// 1.获取位置的管理者
		locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
		// 2.获取定位方式
		// 2.1获取所有的定位方式,true:表示返回所有可用定位方式
		List<String> providers = locationManager.getProviders(true);
		for (String string : providers) {
			System.out.println(string);
		}
		// 2.2获取最佳的定位方式
		Criteria criteria = new Criteria();
		criteria.setAltitudeRequired(true);// 设置是否可以定位海拔,如果设置定位海拔,返回一定是gps
		// criteria : 设置定位属性
		// enabledOnly : true如果定位可用就返回
		String bestProvider = locationManager.getBestProvider(criteria, true);
		System.out.println("最佳的定位方式:" + bestProvider);
		// 3.定位
		myLocationListener = new MyLocationListener();
		// provider : 定位的方式
		// minTime : 定位的最小时间间隔
		// minDistance : 定位最小的间隔距离
		// LocationListener : 定位监听
		locationManager.requestLocationUpdates(bestProvider, 0, 0,
				myLocationListener);
	}
	private class MyLocationListener implements LocationListener{
		//当定位位置改变的调用的方法
		//Location : 当前的位置
		@Override
		public void onLocationChanged(Location location) {
			location.getAccuracy();//获取精确位置
			location.getAltitude();//获取海拔
			double latitude = location.getLatitude();//获取纬度,平行
			double longitude = location.getLongitude();//获取经度,垂直

			//发送坐标给指定手机号码
			SmsManager smsManager = SmsManager.getDefault();
			smsManager.sendTextMessage("5556", null, "longitude:"+longitude+" latitude:"+latitude, null, null);

			//停止服务,但是必须得是startservice开启
			stopSelf();

		}
		//当定位状态发生改变的时候调用的方式
		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {
			// TODO Auto-generated method stub

		}
		//当定位可用的时候调用的方法
		@Override
		public void onProviderEnabled(String provider) {
			// TODO Auto-generated method stub

		}
		//当定位不可用的时候调用的方法
		@Override
		public void onProviderDisabled(String provider) {
			// TODO Auto-generated method stub

		}
	}
	@Override
	public void onDestroy() {
		super.onDestroy();
		locationManager.removeUpdates(myLocationListener);//关闭gps,但是高版本中规定打开和关闭gps必须由用户自己主观的去实现,代码已经不允许进行操作
	}

}

b.AndroidManifest.xml中配置该服务,并添加权限

<service android:name="com.moblie.location.GPSService"></service>

c.在广播接受者中开启服务

Intent gpsIntent = new Intent(context,GPSService.class);
context.startService(gpsIntent);
时间: 2024-10-14 07:25:21

Android GPS定位实现,教你如何一分钟实现GPS定位的相关文章

Android Studio下加入百度地图的使用(二)——定位服务

上一章(http://www.cnblogs.com/jerehedu/p/4891216.html)中我们已经完成了环境的搭建,这一章我们来研究一下如何使用. 第一步:在xml文件中加入以下权限 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.android.launcher.permission.READ_S

Android 自定义ViewGroup手把手教你实现ArcMenu

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37567907 逛eoe发现这样的UI效果,感觉很不错,后来知道github上有这么个开源项目~~~~当然本篇不是教你如何使用这个开源项目,而是教你如何自己通过自定义ViewGroup写这样的效果,自定义ViewGroup也是我的痛楚,嘿嘿,希望以此可以抛砖引玉~~ 效果图: 1.实现思路 通过效果图,会有几个问题: a.动画效果如何实现 可以看出动画是从顶点外外发射的,可能有人

Android百度地图(二)结合方向传感器我们自己定位哪里走

Android百度地图(二)结合方向传感器我们自己定位哪里走 本文代码在http://blog.csdn.net/xyzz609/article/details/51943556的基础上进一步改动.有兴趣的同学能够研究下怎么改动的 本篇我们准备为地图加入:第一.定位功能:第二.与方向传感器结合.通过旋转手机进行道路的方向确认. 有了这两个功能.地图已经能够为我服务了 @一启动就自己主动定位了 a,MainActivity 中加入定位代码,定位的监听器MyLocationListener b.封装

Android开发之手把手教你写ButterKnife框架(二)

欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52664112 本文出自:[余志强的博客] 上一篇博客Android开发之手把手教你写ButterKnife框架(一)我们讲了ButterKnife是什么.ButterKnife的作用和功能介绍以及ButterKnife的实现原理. 本篇博客主要讲在android studio中如何使用apt. 一.新建个项目, 然后创建一个module名叫processor 新建m

【转】Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9671609 记得在很早之前,我写了一篇关于Android滑动菜单的文章,其中有一个朋友在评论中留言,希望我可以帮他将这个滑动菜单改成双向滑动的方式.当时也没想花太多时间,简单修改了一下就发给了他,结果没想到后来却有一大批的朋友都来问我要这份双向滑动菜单的代码.由于这份代码写得很不用心,我发了部分朋友之后实在不忍心继续发下去了,于是决定专门写一篇文章来介绍更好的Android双向滑

Android开发之手把手教你写ButterKnife框架(三)

欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52672188 本文出自:[余志强的博客] 一.概述 上一篇博客讲了,如何在android studio使用apt < Android开发之手把手教你写ButterKnife框架(二)> 然后在Processor里生成自己的代码,把要输出的类,通过StringBuilder拼接字符串,然后输出. try { // write the file JavaFileObj

android仿酷狗歌曲列表界面点击右侧字母定位到该字母的集合列表

原文:android仿酷狗歌曲列表界面点击右侧字母定位到该字母的集合列表 源代码下载地址:http://www.zuidaima.com/share/1550463694064640.htm android仿酷狗歌 曲列表界面 点击右侧字母定位到该字母的集合列表,也像类似联系人界面效果

Android滑动菜单框架完全解析,教你如何一分钟实现滑动菜单特效

本文首发于CSDN博客,转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8744400 之前我向大家介绍了史上最简单的滑动菜单的实现方式,相信大家都还记得.如果忘记了其中的实现原理或者还没看过的朋友,请先去看一遍之前的文章 Android滑动菜单特效实现,仿人人客户端侧滑效果,史上最简单的侧滑实现 ,因为我们今天要实现的滑动菜单框架也是基于同样的原理的. 之前的文章中在最后也提到了,如果是你的应用程序中有很多个Activity都需

Android 百度地图 SDK v3.3.0 (二)--- 地图定位和图层展示

转载请注明出处:http://blog.csdn.net/tanzuai/article/details/43763159 在上一篇博客中,我们成功把地图导入了我们的项目.本篇我们准备为地图添加:第一,定位功能:第二,图层展示,第三,结合方向传感器,通过旋转手机进行道路的方向确认.有了这三个功能,地图已经可以为我服务了! 为了方便,我把所有的按钮都放到了menu菜单中. 1.在AndroidManifest.xml配一个service <!-- 定位service --> <servic