关于Android应用中的GPS卫星定位。
一、应用层实现
1.首先需要在AndroidMainfest.xml中开启定位权限。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> //开启精确定位权限,误差一般为三到十米。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> //开启粗略定位权限,误差一般不超过1.5km。
2.创建LocaionManager(位置管理器、总控制器)对象。
LocationManager mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
3.创建Location(位置)对象。
Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
/* Location类的常用方法:location.getLongitude(); //获取经度
location.getLatitude(); //获取纬度
location.getAltitude(); //获取海拔
location.getTime(); //获取时间 */
//AS下该语句报错,ALT+ENTER出现额外代码块,该代码块检查定位权限是否开启。
4.创建LocationListener对象,监听位置变化,LocationListener为接口,故需要实现类,本文使用匿名内部类实现。
LocationListener mLocationListener = new LocationListener(){
@Override
public void onLocationChanged(){ //位置变化时该方法自动触发
//自己定义的方法体
}
@Override
public void onStatusChanged(String provider , int status , Bundle extra){
//provider:我的手机上值是gps,status:GPS状态,extra:额外信息
/* status(GPS状态) 一共有三种:1.LocationProvider.AVAILABLE; 服务可获得
2.LocationProvider.OUT_OF_SERVICE; 不在服务区
3.LocationProvider.TEMPORARITY_UNAVAILABLE; 服务未提供
//自己定义方法体
}
@Override
public void onProviderEnabled(String provider){
//当用户启用具有定位功能的硬件时调用
//自己定义方法体
}
@Override
public void onProviderDisabled(){
//当用户禁用具有定位功能的硬件时调用
//自己定义方法体
}
};
5.创建GpsStatus.Listener对象,其中Listener是GpsStatus的一个成员内部类(Listener是一个接口,仍然需要实现类,本文仍然采用匿名内部类)。
//细心的朋友也许会发现前面的mLocationListener也实现了类似的功能,没错。
GpsStatus.Listener mListener = new GpsStatus.Listener(){
@Override
public void onGpsStatusChanged(int event){
//event代表GPS的状态
//自己定义方法体
}
};
mLocationManager.addGpsStatusListener(mListener); //别忘了注册监听器
6.创建GpsStatus对象。
GpsStatus mGpsStatus = mLocationManager.getGpsStatus(null);
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
只需要实时定位信息的话只需要完成前四步即可。
细心的朋友可能会发现GpsStatus的功能似乎与LocationListener有点重复,没错,GpsStatus最有用的功能(个人见解)其实是开启查分定位数据监听,但目前的移动设备具博主
所知大部分都是单点定位,想使用差分定位需要厂商定制,所以只在具体的环境中使用。
mLocationManager.addNmeaListener(new GpsStatus.NmeaListener(){
@Override
public void onNmeaReceived(long l , String s){ //接收到Nmea数据时该方法会被调用,l表示数据长度,s表示数据本身
//自己定义方法体
}
});