一、定位的三种方式

1.wifi定位,ip地址定位,通过ip地址进行查询实际地址;

2.基站定位,信号塔,基站:手机通讯服务的设备 ,信号的格数决定了手机距离基站远近,精确度:几十米到几公里,精确度来自于基站的数量;

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

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

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

1.MainActivity.java
package com.example.locationdemo;

import java.util.List;

import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

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.开启一个服务,让该服务在后台运行,在服务中不断的进行定位操作,代码如下:

package com.moblie.location.GPSService;

import java.util.List;

import android.app.Service;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.telephony.SmsManager;

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);

android基于GPS实现定位操作的更多相关文章

  1. 彻底解决Android GPS没法定位这一顽固问题

    大家去网上搜索Android定位location为null没法定位问题.预计有一大堆文章介绍怎样来解决.可是最后大家发现基本没用. 本文将从Android定位实现原理来深入分析没法定位原因并提出真正的 ...

  2. [置顶] xamarin android使用gps定位获取经纬度

    看了文章你会得出以下几个结论 1.android定位主要有四种方式GPS,Network(wifi定位.基站定位),AGPS定位 2.绝大部分android国产手机使用network进行定位是没有作用 ...

  3. Android定位(是否使用GPS进行定位)

    TencentLocationRequest request = TencentLocationRequest.create(); request.setRequestLevel(TencentLoc ...

  4. 极客DIY:廉价电视棒玩转GNSS-SDR,实现GPS实时定位

    0×00 前言 GNSS是Global Navigation Satellite System的缩写.中文称作:全球卫星导航系统.全球导航卫星系统. GNSS泛指所有的卫星导航系统,包括全球的.区域的 ...

  5. Android:基于Eclipse编译调试系统级应用源代码

    一.      概要描述 在使用Eclipse导入android工程源代码以后,我们可以使用ddms调试和跟踪源代码. 本文讲述动态调试源代码和静态调试源代码的两种方法,避免build system. ...

  6. qt on android之GPS信号的获取

    0.      写在最前面 本人參考安晓辉大侠的一篇博文后.做了Qt on android的GSP相关的实验.为了后面不时之需.故而记录下来. 1.      Qt on Android GPS系统流 ...

  7. 基于GPS北斗卫星授时系统和NTP网络授时服务器的设计与开发

    基于GPS北斗卫星授时系统和NTP网络授时服务器的设计与开发 安徽京准科技提供@请勿转载@@ 更多资料请参考——ahjzsz.com 天文观测设备对于控制系统的时间准确度有严格要求.为此,采用搭建高精 ...

  8. 张高兴的 .NET IoT 入门指南:(八)基于 GPS 的 NTP 时间同步服务器

    时间究竟是什么?这既可以是一个哲学问题,也可以是一个物理问题.古人对太阳进行观测,利用太阳的投影发明了日晷,定义了最初的时间.随着科技的发展,天文观测的精度也越来越准确,人们发现地球的自转并不是完全一 ...

  9. Android Bitmap 载入与像素操作

    Android Bitmap 载入与像素操作 一:载入与像素读写 在Android SDK中,图像的像素读写能够通过getPixel与setPixel两个Bitmap的API实现. Bitmap AP ...

随机推荐

  1. windows脚本配置ip地址

    背景:工作上经常涉及到要调试设备,每次都要手动配置静态ip地址,配置完之后还要重新改回来,有时候为了连续调试多台设备,来回手动更改ip,实在麻烦. 思考:想到windows有脚本,可以利用脚本文件达到 ...

  2. webApi 导入Excel

    /// <summary> /// 导入 /// </summary> /// <param name="organizationId">< ...

  3. 关于GPL的一些知识

    1.什么是GPL GPL许可协议(GNU General Public License):只要软件中包含有其他GPL协议的产品或代码,那么该软件就必须也采用GPL许可协议且开源及免费.具有以下特点: ...

  4. Comet4J推技术在SSHE三大框架中应用-linux下亲测可用

    Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询.长连接.自动选择三种工作模式. 下载地址 co ...

  5. Office 365 系列五 -------- Imap邮箱迁移步骤

    当客户购买了我们的Office 365之后,第一个功能必然是会用我们的企业邮箱,如果企业之前是用 263.腾讯.网易等的邮件厂商的话,必然会涉及到邮件的迁移, 其实说到邮箱迁移,我们办法很多,如果人数 ...

  6. 使用hex6x 进行十六进制转换

    接触DSP两年多,虽然烧写Flash的操作都没问题,但是要是问起来为什么这么做的,就有点自惭形秽了.所以花些时间,查阅一下资料,整理一下. 1.先看看BurnFlash都需要什么东西. XXX.out ...

  7. 一步一步学WebSocket (一) 初识WebSocket

    众所周知,Http协议是无状态的,并且是基于Request/Response的方式与服务器进行交互,也就是我们常说的单工模式.但是随着互联网的发展,浏览器与服务端进行双向通信需求的增加,长轮询向服务器 ...

  8. wpf 遮住输入法 问题

    可以参考这个代码   http://www.cnblogs.com/Leaco/p/3164394.html 当你发现没用的时候 可以改这句代码  var hwnd = ((HwndSource)Pr ...

  9. sass、less和stylus的安装使用和入门实践

    刚 开始的时候,说实话,我很反感使用css预处理器这种新玩意的,因为其中涉及到了编程的东西,私以为很复杂,而且考虑到项目不是一天能够完成的,也很少是 一个人完成的,对于这种团队的项目开发,前端实践用c ...

  10. 介绍开源的.net通信框架NetworkComms框架 源码分析(二十二 )TCPConnectionStatic

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...