sdk中已有一些可用的定位服务接口:
这里着重说一下GpsSatellite 接口
GpsSatellite结构
public final class GpsSatellite extends Object
java.lang.Object
android.location.GpsSatellite
此类用于描述当前GPS卫星状态,和GpsStatus联合使用。
返回卫星的方位角,方位角范围0至360度。
返回值 卫星的方位角,浮点型数据。
返回卫星的高度角,高度角范围0至90度。
返回值 卫星的高度角,浮点型数据。
返回伪随机噪声码,译者注:所谓伪噪声码,不是卫星编号,
是一个具有一定周期的取值0和1的离散符号串,它具有类似于白噪声的自相关函数
返回值 伪随机噪声码,整形数据
返回卫星的信噪比。(译者注:即放大器的输出信号的电压与同时输出的噪声电压的比,
常常用分贝数表示。设备的信噪比越高表明它产生的杂音越少。一般来说,信噪比越大,
说明混在信号里的噪声越小,声音回放的音质量越高,否则相反)
返回值 卫星信噪比,浮点型数据
如果GPS引擎有近似轨道信息(卫星是否有年历表)则返回true
返回值 如果GPS引擎有近似轨道信息则返回true,布尔型数据
如果GPS引擎有卫星星历(卫星是否有星历表)则返回true(译者注:卫星星历用于描述太空飞行体位置和速度的表达式)
返回值 如果GPS引擎有卫星星历则返回true,布尔型数据
当卫星被GPS引擎用于计算最近位置(卫星是否被用于近期的GPS修正计算)时,返回true
返回值 当卫星被GPS引擎用于计算最近位置时,返回true
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);上面给出了定位服务的初始化设置步骤,但我们都知道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); } };以上主要是通过从状态值里面status.getSatellite()获取c存放搜索到的卫星数目对象,并保存在队列中。
除了GPS状态信息,还要利用LocationListener实现对位置定位信息的监听:
位置监听回调是用来处理GPS位置发生变化的时候,自动回调的方法,我们可以从这里获取到当前的GPS数据。另外我们可以通过回调函数提供的location参数,获取GPS的地理位置信息,包括经纬度、速度、海拔等信息
根据方向角和高度角,计算卫星二维图里面位置的方法,上面效果图左边的绿色圆点就代表卫星位置。
计算方法: //根据方向角和高度角计算出,卫星显示的位置 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就是你需要绘画卫星图的起始坐标 右边的信噪比柱状图,代表卫星的接收信号能力。信噪比的绘画,就是一个单位换算,这里就不给代码了。Android为我们提供了很方便的位置服务获取接口,主要通过GpsStatus、LocationManager、GpsSatellite等类来实现相关服务的监听。