GPS(Global Position System,全球定位系统)是20世纪70年代由美国陆海空三军联合研制的新一代空间卫星导航定位系统。

在Android 的位置服务中,有两个重要的类LocationManager和LocationProvider提供了一系列方法来处理位置相关的问题,包括查询一个已知位置;注册/注销来自某个 LocationProvider的周期性的位置更新;以及注册/注销接近某个坐标时对一个已定义Intent的触发等。今天我们就来看看Android 中LocatinManager的简单使用,以获取当前所在的位置为例。

首先,我们需要获取LocationManager的一个实例,这里需要注意的是他的实例只能通过下面这种方式来获取,直接实例化LocationManager是不被允许的。

Java代码
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
LocationManagerlocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

得到了LocationManager的实例locatonManager以后,我们通过下面的语句来注册一个周期性的位置更新。

Java代码
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,  
1000 ,  0 , locationListener);   
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
1000, 0, locationListener);

这句代码告诉系统,我们需要从GPS获取位置信息,并且是每隔1000ms更新一次,并且不考虑位置的变化。最后一个参数是LocationListener的一个引用,我们必须要实现这个类。

Java代码
private   final LocationListener locationListener =  new  LocationListener() {  
public   void onLocationChanged(Location location) {  //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发   
// log it when the location changes   
if (location !=  null ) {   
Log.i("SuperMap",  "Location changed : Lat: "   
+ location.getLatitude() + " Lng: "   
+ location.getLongitude());  
}  
}   
public   void onProviderDisabled(String provider) {   
// Provider被disable时触发此函数,比如GPS被关闭   
}   
public   void onProviderEnabled(String provider) {   
//  Provider被enable时触发此函数,比如GPS被打开   
}   
public   void onStatusChanged(String provider,  int status, Bundle extras) {   
// Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数   
}   
};   
private finalLocationListener locationListener = new LocationListener() {
public void onLocationChanged(Locationlocation) { //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
// log it when the location changes
if (location != null) {
Log.i("SuperMap", "Location changed : Lat: "
+ location.getLatitude() + "Lng: "
+ location.getLongitude());
}
}
public void onProviderDisabled(Stringprovider) {
// Provider被disable时触发此函数,比如GPS被关闭
}
public void onProviderEnabled(Stringprovider) {
// Provider被enable时触发此函数,比如GPS被打开
}
public void onStatusChanged(Stringprovider, int status, Bundle extras) {
// Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
}
};

以上的这些步骤一般应当在Activity的onCreate()阶段完成。

在成功注册了一个周期性坐标更新以后,我们就随时可以通过下面的方法来取得当前的坐标了。

Java代码
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);  
double latitude = location.getLatitude();     //经度   
double  longitude = location.getLongitude(); //纬度   
double altitude =  location.getAltitude();     //海拔   
Location location =locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
double latitude =location.getLatitude();     //经度
double longitude =location.getLongitude(); //纬度
double altitude =  location.getAltitude();     //海拔

不过这时候,如果你尝试去运行这个LocationSample的话程序启动时多半就会报错,因为我们没有设置GPS相关的权限,解决方法也相当简单,在AndroidManifest.xml中的block里添加下面这句即可解决权限的问题。

Java代码
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"  />   

如果是在模拟器中调试的话,我们有两种方法来设置一个模拟的坐标值,第一种是通过DDMS,我们可以在eclipse的ADT插件中使用这种方法,只要打开"Window" --&gt; "Show View" 中打开"Emulator Control" View即可看到如下的设置窗口,我们可以手动,或者通过KML和GPX文件来设置一个坐标。

另一种方法是使用geo命令,我们需要telnet到本机的5554端口(telnet localhost 5554 ),然后在命令行下输入类似于 geo fix -121.45356 46.51119 4392 这样的命令,后面三个参数分别代表了经度、纬度和(可选的)海拔。

完整案例如下:
java 代码:

import java.util.List;
import android.app.Activity;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.widget.TextView;
public class LocationTest extends Activity implementsLocationListener
{
/** Calledwhen the activity is first created. */
private LocationManager lm;
private TextView tvOutput;
private String best;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lm = (LocationManager) this.getSystemService(LOCATION_SERVICE); // 从系统服务中获得位置管理器
tvOutput = (TextView) findViewById(R.id.textView1);
getMyLocation();
}
public void getMyLocation()
{
log("location providers");
dumpProviders(); // 输出所有位置提供者(network,gps等)
Criteria criteria = new Criteria(); // 定义规则
criteria.setAccuracy(Criteria.ACCURACY_FINE); // 精确位置
best = lm.getBestProvider(criteria, true); // 获得最合适的提供者
log("\n best provider is :" + best);
Location location = lm.getLastKnownLocation(best); // 获得最后可知的位置
dumpLocation(location);
}
// 获得所有提供者信息
public void dumpProviders()
{
List<String> list = lm.getAllProviders();
for (String string : list)
{
dumpProvider(string);
}
}
// 输出到TextView
private void log(String string)
{
tvOutput.append(string + "\n");
}
// 获得每个位置提供者
public void dumpProvider(String provider)
{
LocationProvider lp = lm.getProvider(provider);
StringBuffer sb = new StringBuffer();
sb.append("\n位置提供者名称:" + lp.getName());
sb.append("\n提供者是否可用:" + lm.isProviderEnabled(provider));
sb.append("\n 是否精确位置:" + lp.getAccuracy());
sb.append("\n是否省电模式:" + lp.getPowerRequirement());
sb.append("\n 是否需要网路:" + lp.requiresNetwork());
sb.append("\n 是否需要无线网络:" + lp.requiresCell());
sb.append("\n 是否需要GPS:" + lp.requiresSatellite());
log(sb.toString());
}
public void dumpLocation(Location location)
{
if (location == null)
{
log("\n[Locationunknowen]");
return;
}
log("\nLocation is:" +location.toString());
}
// 位置改变时获得坐标
@Override
public void onLocationChanged(Location arg0)
{
dumpLocation(arg0);
}
// 暂停时删除更新位置
@Override
protected void onPause()
{
super.onPause();
lm.removeUpdates(this);
}
// 恢复时请求更新位置
@Override
protected void onResume()
{
super.onResume();
//绑定临听
lm.requestLocationUpdates(best, 1500, 1, this);
}
@Override
public void onProviderDisabled(String arg0)
{
log("\nprovider disabled :" + arg0);
}
@Override
public void onProviderEnabled(String arg0)
{
log("\nprovider enabled :" + arg0);
}
// 状态改变时
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2)
{
log("\nstatus changed:provider:" + arg0 + ",status=" + arg1 + ",extra="+ arg2);
}

}

AndroidManifest.xml :

<?xml version="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gps"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<application android:icon="@drawable/icon"android:label="@string/app_name">
<activity android:name=".LocationTest"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

Android:GPS卫星定位相关推荐

  1. Android 逆向分析之 : GPS卫星定位监控导航寻找人

    同事发过来一个地址:GPS卫星定位监控导航寻找人, 看起来挺有有意思的,逆向看看不可能就这么找人吧: 程序就是两个actvitiy,通过AsyncTask进行异步查询显示结果,当然还有其它的一大堆东西 ...

  2. Android GPS定位记录发送功能

    写博客分享经验,记录研发之路. 最近,要写一个GPS定位的小应用.要求很简单,能够利用Android 手机的GPS硬件模块实现定位,并能记录定位信息,并能发送给指定的邮箱或QQ-- 如下图所示:显示定 ...

  3. Android GPS 背景知识介绍

    这篇未完成的文章写于2016年初,两年后翻到了,贴出来.. 1.  课题介绍 1.1. 课题的来源 随着近年来Android手机的大量使用,设备中附带的GPS也得以大规模的应用,位置服务从一个附加功能 ...

  4. android GPS驱动

    关于android定位方式 android 定位一般有四种方法,这四种方式分别是GPS定位.WIFI定位.基站定位.AGPS定位. 1. Android GPS 需要GPS硬件支持直接和卫星交互来获取 ...

  5. android gps 串口,Android GPS数据上报(基于gps_qemu.c)

    Android GPS数据上报(基于gps_qemu.c) 在网上找了好久关于这方面的东西,可都是介绍启动的,现在我把我理解的其数据上报的流程写下来,以作记录: (主要基于gps_qemu.c的数据上 ...

  6. android过滤数字,android – GPS卫星数量和位置过滤

    根据可用的位置字段,浮动精度似乎是确定GPS位置有多好的主要字段,而不考虑时间戳.我想知道从NMEA数据(我认为是$GPGGA)或通过LocationManager.getGpsStatus解析卫星数 ...

  7. Android GPS中间层驱动开发调试

    ~.Android GPS中间层驱动开发调试小结  // rkeclair_v1.02_sdkdemo , ublox芯片       调通GPS功能,用串口可打印出位置数据,并可在gpslogger ...

  8. php gps定位范围算法,基本的GPS卫星定位算法

    姓名:杨汉雄 学号:19011210569 [嵌牛导读]GPS定位包括确定一个点的三维坐标与实现同步这四个未知参数.当前主流的GPS定位算法有有两种:(1)伪距测量:测量GPS卫星发射的测距码信号到达 ...

  9. GPS卫星定位接收器的NMEA协议解析

    原文地址:GPS卫星定位接收器的NMEA协议解析作者:蟹蟹 GPS接收机只要处于工作状态就会源源不断地把接收并计算出的GPS导航定位信息通过串口传送到计算机中.前面的代码只负责从串口接收数据并将其放置 ...

  10. 天球坐标系、地球坐标系与地球自转有无关系,哪一种便于描述地面观测站的空间位置,哪一种便于描述人造地球卫星的位置?请用类似思维导图的方式总结GNSS定位的时空基准?GPS卫星定位中时间系统有何重要意义?

    答: 1.天球坐标系.地球坐标系与地球自转有无关系,哪一种便于描述地面观测站的空间位置,哪一种便于描述人造地球卫星的位置? 卫星定位中常采用空间直角坐标系及其相应的大地坐标系,一般取地球质心为坐标系的 ...

最新文章

  1. python 使用sax 解析xml 文件
  2. SVN 文件的解锁方法
  3. 【图像处理】——Python实现几何变换(自定义+opencv库)
  4. IntentService用法
  5. mysql warning 日志_Mysql5.7.19安装后错误日志中有警告
  6. pythonsocket自动化教程_Python 的 Socket 编程教程
  7. android7.1以太网动态ip,android7.1编译路上的那些坑!(部分转自网络整理)
  8. Python之数据分析(Numpy中的除法和取余、三角函数、ufunc对象的位运算)
  9. ndarray 求和_numpy不同阶数张量相加问题(broadcast)
  10. Hyperledger Fabric教程(9)-- peer命令-通道channel
  11. android sdk mac 环境变量,Mac 下的SDK环境变量配置
  12. Android7.0 MessageQueue
  13. 信号复数及希尔伯特变换的理解
  14. 康师傅被“水和面”糊住了眼睛?
  15. 微型计算机数码管显示实验,微机原理实验八段数码管显示.doc
  16. 不要女程序员,公司都爱招男性程序员,这是为什么?
  17. partitionBy()的解释
  18. 西安电子科技大学经济与管理学院861上岸学姐考研经验分享
  19. Cassandra数据分布之1数据中心(DC)和机架(RACK)
  20. ESP8266 基础篇:内存分布

热门文章

  1. 【HTML CSS JS 蝴蝶飞舞特效 绝美(附完整代码)】
  2. 谢尔宾斯基三角形:Python+turtle
  3. 清华大学马少平:一款智能硬件背后的“AI争霸”...
  4. redis雪崩、击穿、穿透
  5. 51单片机流水灯现象2
  6. 低配电脑Win10哪个版本好用?
  7. 屏幕录像专家V7.5注册机
  8. selenium模拟登录QQ空间
  9. 00套经典机械结构设计非标自动化SW机构3D图纸solidWorks模型库
  10. 如何将数据添加到python_如何将数据导入python