1、Android定位服务接口

sdk中已有一些可用的定位服务接口:

java能用gps吗 java获取gps定位_gps

这里着重说一下GpsSatellite 接口

GpsSatellite结构 

继承关系 

public final class GpsSatellite extends Object

java.lang.Object

android.location.GpsSatellite

类描述

此类用于描述当前GPS卫星状态,和GpsStatus联合使用。

公共方法

public float getAzimuth () 

返回卫星的方位角,方位角范围0至360度。

返回值 卫星的方位角,浮点型数据。

public float getElevation()

返回卫星的高度角,高度角范围0至90度。

返回值 卫星的高度角,浮点型数据。


public int getPrn () 

返回伪随机噪声码,译者注:所谓伪噪声码,不是卫星编号,

是一个具有一定周期的取值0和1的离散符号串,它具有类似于白噪声的自相关函数

                返回值 伪随机噪声码,整形数据


public float getSnr ()

返回卫星的信噪比。(译者注:即放大器的输出信号的电压与同时输出的噪声电压的比,

常常用分贝数表示。设备的信噪比越高表明它产生的杂音越少。一般来说,信噪比越大,

说明混在信号里的噪声越小,声音回放的音质量越高,否则相反)

                返回值 卫星信噪比,浮点型数据

public boolean hasAlmanac ()

如果GPS引擎有近似轨道信息(卫星是否有年历表)则返回true

                返回值 如果GPS引擎有近似轨道信息则返回true,布尔型数据


public boolean hasEphemeris ()

如果GPS引擎有卫星星历(卫星是否有星历表)则返回true(译者注:卫星星历用于描述太空飞行体位置和速度的表达式)

                返回值 如果GPS引擎有卫星星历则返回true,布尔型数据

public boolean useInfix ()

       当卫星被GPS引擎用于计算最近位置(卫星是否被用于近期的GPS修正计算)时,返回true

                返回值 当卫星被GPS引擎用于计算最近位置时,返回true



2、LocationMananger接口应用

1、获取定位服务

mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
//toast 消息出来
private void putToast(Context context, String text){
    Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
}
//判断GPS provider是否有效否则进入设置选择provider
private void openGpsSettings(){
    if(mLocationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)){
        putToast(getApplicationContext(),"GPS OK!");
    }else{
        putToast(getApplicationContext(),"GPS OFF!");
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startActivityForResult(intent, 0);
    }
}

用法例如:


// 通过GPS定位
String LocateType= locationManager.GPS_PROVIDER;
Location location = locationManager.getLastKnownLocation(LocateType);
// 设置监听器,设置自动更新间隔这里设置1000ms,移动距离:0米。
locationManager.requestLocationUpdates(provider, 1000, 0, locationListener);
// 设置状态监听回调函数。statusListener是监听的回调函数。
locationManager.addGpsStatusListener(statusListener); 
//另外给出 通过network定位设置
String LocateType= locationManager.NETWORK_PROVIDER;
Location location = locationManager.getLastKnownLocation(LocateType);

2、在android mainfest中添加权限

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>//精确定位
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>//粗咯定位



3、可以设置定位规则

Criteria criteria = new Criteria();  
// 设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细  
criteria.setAccuracy(Criteria.ACCURACY_FINE);  
// 设置是否要求速度  
criteria.setSpeedRequired(false);  
// 设置是否允许运营商收费  
criteria.setCostAllowed(false);  
// 设置是否需要方位信息  
criteria.setBearingRequired(false);  
// 设置是否需要海拔信息  
criteria.setAltitudeRequired(false);  
// 设置对电源的需求  
criteria.setPowerRequirement(Criteria.POWER_LOW);

用法


mProvider = mLocationManager.getBestProvider(criteria,true);
mLocation = mLocationManager.getLastKnownLocation(mProvider);

3、GpsStatus监听器

上面给出了定位服务的初始化设置步骤,但我们都知道GPS卫星是定期广播数据的,也就是说会定期收到卫星的GPS数据。我们并不能跟卫星主动申请数据,只能被动接收数据。(中国的北斗2倒是可以发送卫星报文给卫星)因此我们需要注册一个监听器来处理卫星返回的数据。

例如:

private final GpsStatus.Listener statusListener = new GpsStatus.Listener() 
{
    public void onGpsStatusChanged(int event) 
  {
      // GPS状态变化时的回调,获取当前状态
      GpsStatus status = locationManager.getGpsStatus(null);
       //自己编写的方法,获取卫星状态相关数据
       GetGPSStatus(event, status);
    }
};

4、获取搜索到的卫星

//定义一个List存放所搜索到的卫星信息
private List<GpsSatellite> numSatelliteList = new ArrayList<GpsSatellite>();
private String updateGpsStatus(int event,GpsStatus status){
    StringBuilder stringBuilder = new StringBuilder("");
    if(status == null){
        stringBuilder.append("没有捕捉到卫星!");
    }else if(event == GpsStatus.GPS_EVENT_FIRST_FIX){
        stringBuilder.append("第一次定位成功!");
    }else if(event == GpsStatus.GPS_EVENT_SATELLITE_STATUS){
        int maxSatellites = status.getMaxSatellites();
        Iterator<GpsSatellite> it = status.getSatellites().iterator();
        numSatelliteList.clear();
        int count = 0;//记录搜索到的实际卫星数
        while(it.hasNext()&& count < maxSatellites){
            GpsSatellite s = it.next();
            numSatelliteList.add(s);//将卫星信息存入队列
            count++;
        }
        stringBuilder.append("获得卫星总数:"+numSatelliteList.size());
    }else if(event == GpsStatus.GPS_EVENT_STARTED){
        //定位启动
    }else if(event == GpsStatus.GPS_EVENT_STOPPED){
        //定位结束
    }
        return stringBuilder.toString();
}

以上主要是通过从状态值里面status.getSatellite()获取c存放搜索到的卫星数目对象,并保存在队列中。

除了GPS状态信息,还要利用LocationListener实现对位置定位信息的监听:

5、LocationListener监听器

//弹出toast
private void putToast(Context context, String text){
    Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
}
private final LocationListener locationListener = new LocationListener(){
    @Override
    public void onLocationChanged(Location location) {
        //当坐标改变时调用此函数 如果provider传相同坐标 则不促发
        putToast(MainActivity.this,"onLocationChanged!");
        updateNewLocation(location);
    }
    @Override
    public void onProviderDisabled(String provider) {
        //provider 被disabled 时触发 例如GPS被关闭
        putToast(MainActivity.this,"onProviderDisabled!");
        updateNewLocation(null);
    }
    @Override
    public void onProviderEnabled(String provider) {
        //provider 被enable 时触发 例如GPS被打开
        putToast(MainActivity.this,"onProviderEnabled!");
    }
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        //provider 被enable 时触发 例如GPS被打开
        putToast(MainActivity.this,"onStatusChanged! status:"+status);
        //provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发
        if (status == LocationProvider.OUT_OF_SERVICE||status == LocationProvider.TEMPORARILY_UNAVAILABLE){    
        }
    }
};



位置监听回调是用来处理GPS位置发生变化的时候,自动回调的方法,我们可以从这里获取到当前的GPS数据。另外我们可以通过回调函数提供的location参数,获取GPS的地理位置信息,包括经纬度、速度、海拔等信息



6、获取定位位置等信息(经纬度、卫星个数、海拔高度、定位状态、授时时间)

//location对象是从上面定位服务回调函数的参数获取。
mLatitude = location.getLatitude();      //经度
mLongitude = location.getLongitude();    //纬度
mAltitude = location.getAltitude();      //海拔
mSpeed = location.getSpeed();            //速度
mBearing = location.getBearing();        //方向



7、获取特定卫星信息(方位角、高度角、信噪比)

//temgGpsSatellite就是上面保存的搜索到的卫星
float azimuth = temgGpsSatellite.getAzimuth();    //方向角
float elevation = temgGpsSatellite.getElevation();//高度角
float snr = temgGpsSatellite.getSnr();            //信噪比

利用方位角、高度角可以绘画出一个二维位置图像,表示卫星在地球的哪个方位。而信噪比则可以表示GPS模块搜星能力的代表。

8、绘制二维卫星效果图

java能用gps吗 java获取gps定位_实例_02


根据方向角和高度角,计算卫星二维图里面位置的方法,上面效果图左边的绿色圆点就代表卫星位置。

计算方法:

//根据方向角和高度角计算出,卫星显示的位置
Point point = new Point();
int x = mEarthHeartX; //左边地球圆形的圆心位置X坐标
int y = mEarthHeartY; //左边地球圆形的圆心位置Y坐标                       
int r = mEarthR;
x+=(int)((r*elevation*Math.sin(Math.PI*azimuth/180)/90));
y-=(int)((r*elevation*Math.cos(Math.PI*azimuth/180)/90));
point.x = x;
point.y = y;
//point就是你需要绘画卫星图的起始坐标



右边的信噪比柱状图,代表卫星的接收信号能力。信噪比的绘画,就是一个单位换算,这里就不给代码了。

9、总结

Android为我们提供了很方便的位置服务获取接口,主要通过GpsStatus、LocationManager、GpsSatellite等类来实现相关服务的监听。