android基于GPS实现定位操作
一、定位的三种方式
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实现定位操作的更多相关文章
- 彻底解决Android GPS没法定位这一顽固问题
大家去网上搜索Android定位location为null没法定位问题.预计有一大堆文章介绍怎样来解决.可是最后大家发现基本没用. 本文将从Android定位实现原理来深入分析没法定位原因并提出真正的 ...
- [置顶]
xamarin android使用gps定位获取经纬度
看了文章你会得出以下几个结论 1.android定位主要有四种方式GPS,Network(wifi定位.基站定位),AGPS定位 2.绝大部分android国产手机使用network进行定位是没有作用 ...
- Android定位(是否使用GPS进行定位)
TencentLocationRequest request = TencentLocationRequest.create(); request.setRequestLevel(TencentLoc ...
- 极客DIY:廉价电视棒玩转GNSS-SDR,实现GPS实时定位
0×00 前言 GNSS是Global Navigation Satellite System的缩写.中文称作:全球卫星导航系统.全球导航卫星系统. GNSS泛指所有的卫星导航系统,包括全球的.区域的 ...
- Android:基于Eclipse编译调试系统级应用源代码
一. 概要描述 在使用Eclipse导入android工程源代码以后,我们可以使用ddms调试和跟踪源代码. 本文讲述动态调试源代码和静态调试源代码的两种方法,避免build system. ...
- qt on android之GPS信号的获取
0. 写在最前面 本人參考安晓辉大侠的一篇博文后.做了Qt on android的GSP相关的实验.为了后面不时之需.故而记录下来. 1. Qt on Android GPS系统流 ...
- 基于GPS北斗卫星授时系统和NTP网络授时服务器的设计与开发
基于GPS北斗卫星授时系统和NTP网络授时服务器的设计与开发 安徽京准科技提供@请勿转载@@ 更多资料请参考——ahjzsz.com 天文观测设备对于控制系统的时间准确度有严格要求.为此,采用搭建高精 ...
- 张高兴的 .NET IoT 入门指南:(八)基于 GPS 的 NTP 时间同步服务器
时间究竟是什么?这既可以是一个哲学问题,也可以是一个物理问题.古人对太阳进行观测,利用太阳的投影发明了日晷,定义了最初的时间.随着科技的发展,天文观测的精度也越来越准确,人们发现地球的自转并不是完全一 ...
- Android Bitmap 载入与像素操作
Android Bitmap 载入与像素操作 一:载入与像素读写 在Android SDK中,图像的像素读写能够通过getPixel与setPixel两个Bitmap的API实现. Bitmap AP ...
随机推荐
- 常用的dos命令
cd 进入一个目录 cd .. 返回上一个目录 dir 遍历目录 上下键 查找输入过的命令 Tab键 命令自动补齐
- Foundation ----->NSNumber
/*--------------------NSNumber--------------------*/ //包装基本数据类型 //1.创建number对象 //12 ...
- iOS图片编辑功能实现
图片加标签:标签可以编辑 https://github.com/shumingli/waterMark 1. 编辑效果;图片可以放到.缩小.旋转 2. 保存相册效果
- Git相关文章
1.Git教程 2.Git常用命令整理 3.EGit(Git Eclipse Plugin)使用
- Winform DataGridView控件添加行号
有很多种方法,这里介绍三种: A: 控件的RowStateChanged事件中添加,RowStateChanged事件是在行的状态更改(例如,失去或获得输入焦点)时发生的事件: e.Row.Hea ...
- Sql Server中不常用的表运算符之PIVOT
PIVOT是SQL Server2005新添加的一个表运算符,作用在于将行转为列. 先来看看他的基本语法: 来自http://technet.microsoft.com/zh-cn/library/m ...
- 13 Balls Problem
今天讨论的是称球问题. No.3 13 balls problem You are given 13 balls. The odd ball may be either heavier or ligh ...
- ORACLE连接SQLSERVER
一.实验(实验成功) 1.实验目标:ORACLE连接SQLSERVER以及查询数据 2.搭建的环境: oracle 9i 9.0.2.0.1 地址:192.168.40.139 sql2000 的数据 ...
- Qt中让Qwidget置顶的方法
一般来是说窗体置顶和取消只要 setWindowFlags(Qt::WindowStaysOnTopHint); setWindowFlags(Qt::Widget); 要 ...
- 用fxc.exe编译shader文件(*.fx, *.hlsl)的设置
原文出自:http://msdn.microsoft.com/en-us/library/windows/desktop/bb509709(v=vs.85).aspx#Profiles 拿DX11 S ...