吾知网

标题: Android GPS定位(获取经纬度) [打印本页]

作者: jekeyhui99    时间: 2017-9-1 15:50
标题: Android GPS定位(获取经纬度)
简述:
    Android 定位一般有四种方法,这四种方式分别是:GPS定位,WIFI定位,基站定位,AGPS定位。
本篇博文主要记录一下GPS定位:这种方式需要手机支持GPS模块硬件支持。通过GPS方式准确度是最高的,但是它的缺点也非常明显:
                    1、比较耗电;
                    2、绝大部分用户默认不开启GPS模块;
                    3、从GPS模块启动到获取第一次定位数据,可能需要比较长的时间;
                    4、室内几乎无法使用。
这其中,缺点2,3都是比较致命的。
GPS定位优点:GPS走的是卫星通信的通道,在没有网络连接的情况下也能使用。
GPS定位:    相关类
        (1)、LocationManager:位置服务管理器类
是获取位置信息的入口级类,要获取位置信息,首先需要获取一个LocationManger对象:                  
[html] view plain copy


  • LocationManager  pLocationManager = (LocationManager) Context.getSystemService(Context.LOCATION_SERVICE);  

        (2)、LocationProvider:位置源提供者
用于描述位置提供者信息,可以先使用方法获取最佳提供者的名称:
[html] view plain copy


  • String providerName = LocationManger.getBestProvider(Criteria criteria, boolean enabledOnly);  


                         LocationManger.getProvider(String name)获取LocationProvider对象。
        (3)、Location:位置对象
                        描述地理位置信息的类,记录了经纬度、海拔高度、获取坐标时间、速度、方位等。可以通过LocationManager.getLastKnowLocation(provider)获取位置坐标,provider就是上文中提到的GPS_PROVIDER、NETWORK_PROVIDER、PASSIVE_PROVIDER、FUSED_PROVIDER;不过很多时候得到的Location对象为null;实时动态坐标可以在监听器locationListener的onLocationChanged(Location location)方法中来获取。
        (4)、LocationListener:位置监听接口
用于监听位置(包括GPS、网络、基站等所有提供位置的)变化,监听设备开关与状态。实时动态获取位置信息,首先要实现该接口,在相关方法中添加实现功能的代码,实现该接口可以使用内部类或者匿名实现。然后注册监听:LocationManger.requestLocationUpdates(Stringprovider, long minTime, float minDistance, LocationListener listener)。使用完之后需要在适当的位置移除监听:LocationManager .removeUpdates(LocationListener listener)。LocationListener需要实现的方法:
onLocationChanged(Locationlocation):当位置发生变化的时候会自动调用该方法,参数location记录了最新的位置信息。
onStatusChanged(String provider, int status, Bundle extras):当位置提供者的状态发生改变(可用到不可用、不可用到可用)时自动调用该方法;参数provider为位置提供者的名称,status为状态信息:OUT_OF_SERVICE 、AVAILABLE 、TEMPORARILY_UNAVAILABLE ,extras为附加数据:key/value,如satellites;
onProviderEnabled(String provider):位置信息提供者可用时自动调用,比如用户关闭了GPS时,provider则为“gps”;
onProviderDisabled(String provider):位置信息不可用时自动调用。
        (5)、Criteria:用于选择位置信息提供者的辅助类
创建LocationProvider对象时会使用到该类,参考上文中内容。定位信息提供者会根据精度、电量、是否提供高度、速度、方位、服务商付费等信息进行排序选择定位提供者。 可以参考一个示例:

[html] view plain copy


  • /** this criteria needs high accuracy, high power and cost */  
  • public static Criteria createFineCriteria() {  
  •   
  •     Criteriac = new Criteria();  
  •     c.setAccuracy(Criteria.ACCURACY_FINE);//高精度  
  •     c.setAltitudeRequired(true);//包含高度信息  
  •     c.setBearingRequired(true);//包含方位信息  
  •     c.setSpeedRequired(true);//包含速度信息  
  •     c.setCostAllowed(true);//允许付费  
  •     c.setPowerRequirement(Criteria.POWER_HIGH);//高耗电  
  •     return c;  
  • }  

         (6)、GpsStatus.Listener:GPS状态监听的一个接口
                       使用方法与locationListener接口类似,先实现接口并创建对象,实现接口中的方法:onGpsStatusChanged(int event);在方法中实现对卫星状态信息变化的监听,根据event的类型编写逻辑代码。创建对象后再注册监听:LocationManager .addGpsStatusListener(GpsStatus.Listener listener);使用后在合适的位置释放监听:LocationManager .removeGpsStatusListener(GpsStatus.Listener listener)。
    GPS定位流程
          (1)配置权限:
                添加如下权限:

[html] view plain copy


  • <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
  • <uses-permission android:name="android.permission..ACCESS_FINE_LOCATION" />  

  (2)获取LocationManager类型对象:     

[html] view plain copy


  • LocationManager mLocationManager =(LocationManager) mContext.getSystemService (Context.LOCATION_SERVICE);   

             (3) 获取最佳位置定位方式pProvider:(这步可有可无,根据情况而定)
       mLocationManager.getBestProvider(mCriteria,true); mCriteria为Criteria类型的对象,包含精度、是否返回高度、方位、速度等信息。创建Criteria对象示例:
[html] view plain copy


  • /** this criteria needs highaccuracy, high power, and cost */  
  •    public static CriteriacreateFineCriteria() {  
  •    
  •       Criteriac = new Criteria();  
  •       c.setAccuracy(Criteria.ACCURACY_FINE);//高精度  
  •       c.setAltitudeRequired(true);//包含高度信息  
  •       c.setBearingRequired(true);//包含方位信息  
  •       c.setSpeedRequired(true);//包含速度信息  
  •       c.setCostAllowed(true);//允许付费  
  •       c.setPowerRequirement(Criteria.POWER_HIGH);//高耗电  
  •       return c;  
  •    }  

     (4) 实现LocationListener接口:可以采用内部类(MyLocationListener)或匿名类方式实现,重写接口方法.
             (5) 创建MyLocationListener对象mLocationListener,并添加监听:

[html] view plain copy


  • mLocationListener =new MyLocationListener();  
  • mLocationManager.requestLocationUpdates(pProvider, MIN_TIME_UPDATE,MIN_DISTANCE_UPDATE, mLocationListener);  

             (6) 使用完释放监听:

[html] view plain copy


  • mLocationManager.removeUpdates(mLocationListener);  

该方法执行的位置需要特别注意,如果是在Activity对象中,则需要考虑Activity的生命周期,onPause方法中比较合适,因为onStop、onDestroy两个方法在异常情况下不会被执行。
              (7) 如果需要监听GPS卫星状态,则需要实现GpsStatus.Listener接口,并创建对象、添加监听、使用完后释放监听:
                   实现接口:

[html] view plain copy


  • private class MyGpsStatusListener implements GpsStatus.Listener;  

                   创建对象:

[html] view plain copy


  • MyGpsStatusListener mGpsStatusListener = new MyGpsStatusListener();  


                   添加监听:

[html] view plain copy


  • mLocationManager.addGpsStatusListener (mGpsStatusListener;  


                   释放监听:      
[html] view plain copy


  • mLocationManager.removeGpsStatusListener(mGpsStatusListener);  

原地址:http://blog.csdn.net/u012810020/article/details/52517976




欢迎光临 吾知网 (http://bbs.5g99.com/bbs/) Powered by Discuz! X3.2