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

 在CODE上查看代码片派生到我的代码片

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

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

 

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. 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

 在CODE上查看代码片派生到我的代码片

  1. /** this criteria needs high accuracy, high power and cost */  
  2.  public static Criteria createFineCriteria() {  
  3.   
  4.     Criteriac = new Criteria();  
  5.     c.setAccuracy(Criteria.ACCURACY_FINE);//高精度  
  6.     c.setAltitudeRequired(true);//包含高度信息  
  7.     c.setBearingRequired(true);//包含方位信息  
  8.     c.setSpeedRequired(true);//包含速度信息  
  9.     c.setCostAllowed(true);//允许付费  
  10.     c.setPowerRequirement(Criteria.POWER_HIGH);//高耗电  
  11.     return c;  
  12.  }  

         (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

 在CODE上查看代码片派生到我的代码片

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

  (2)获取LocationManager类型对象:     

 

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

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

             (3) 获取最佳位置定位方式pProvider:(这步可有可无,根据情况而定)

 

       mLocationManager.getBestProvider(mCriteria,true); mCriteria为Criteria类型的对象,包含精度、是否返回高度、方位、速度等信息。创建Criteria对象示例:

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. /** this criteria needs highaccuracy, high power, and cost */  
  2.    public static CriteriacreateFineCriteria() {  
  3.    
  4.       Criteriac = new Criteria();  
  5.       c.setAccuracy(Criteria.ACCURACY_FINE);//高精度  
  6.       c.setAltitudeRequired(true);//包含高度信息  
  7.       c.setBearingRequired(true);//包含方位信息  
  8.       c.setSpeedRequired(true);//包含速度信息  
  9.       c.setCostAllowed(true);//允许付费  
  10.       c.setPowerRequirement(Criteria.POWER_HIGH);//高耗电  
  11.       return c;  
  12.    }  

     (4) 实现LocationListener接口:可以采用内部类(MyLocationListener)或匿名类方式实现,重写接口方法.

 

             (5) 创建MyLocationListener对象mLocationListener,并添加监听:

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

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

             (6) 使用完释放监听:

 

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. mLocationManager.removeUpdates(mLocationListener);  

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

 

                   实现接口:

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. private class MyGpsStatusListener implements GpsStatus.Listener;  

                   创建对象:

 

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. MyGpsStatusListener mGpsStatusListener = new MyGpsStatusListener();  

 

                   添加监听:

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. mLocationManager.addGpsStatusListener (mGpsStatusListener;  

 

                   释放监听:      

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. mLocationManager.removeGpsStatusListener(mGpsStatusListener);  

    案例实现:

全部代码贴出来:

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. package com.lzy.gpslocation;  
  2.   
  3. import android.Manifest;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.content.pm.PackageManager;  
  7. import android.location.Criteria;  
  8. import android.location.Location;  
  9. import android.location.LocationListener;  
  10. import android.location.LocationManager;  
  11. import android.location.LocationProvider;  
  12. import android.support.annotation.NonNull;  
  13. import android.support.v4.app.ActivityCompat;  
  14. import android.support.v7.app.AppCompatActivity;  
  15. import android.os.Bundle;  
  16. import android.util.Log;  
  17. import android.view.View;  
  18. import android.widget.Button;  
  19. import android.widget.TextView;  
  20. import android.widget.Toast;  
  21.   
  22. import com.fastaccess.permission.base.PermissionHelper;  
  23. import com.fastaccess.permission.base.callback.OnPermissionCallback;  
  24.   
  25. import java.util.Arrays;  
  26.   
  27. public class MainActivity extends AppCompatActivity implements OnPermissionCallback {  
  28.     private static final String TAG = MainActivity.class.getSimpleName();  
  29.     private static final String GPS_LOCATION_NAME = android.location.LocationManager.GPS_PROVIDER;  
  30.     private static final int REQUEST_PRESSMION_CODE = 10000;  
  31.     private final static String[] MULTI_PERMISSIONS = new String[]{  
  32.             Manifest.permission.ACCESS_COARSE_LOCATION,  
  33.             Manifest.permission.ACCESS_FINE_LOCATION};  
  34.   
  35.     private LocationManager locationManager;  
  36.     private boolean isGpsEnabled;  
  37.     private String locateType;  
  38.     private TextView textLocationShow;  
  39.     private Button btnLocation;  
  40.   
  41.     //权限检测类  
  42.     private PermissionHelper mPermissionHelper;  
  43.   
  44.     @Override  
  45.     protected void onCreate(Bundle savedInstanceState) {  
  46.         super.onCreate(savedInstanceState);  
  47.         setContentView(R.layout.activity_main);  
  48.   
  49.         initData();  
  50.         initViews();  
  51.     }  
  52.   
  53.     /**  
  54.      * 方法描述:初始化定位相关数据  
  55.      */  
  56.     private void initData() {  
  57.         //获取定位服务  
  58.         locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);  
  59.         //判断是否开启GPS定位功能  
  60.         isGpsEnabled = locationManager.isProviderEnabled(GPS_LOCATION_NAME);  
  61.         //定位类型:GPS  
  62.         locateType = locationManager.GPS_PROVIDER;  
  63.         //初始化PermissionHelper  
  64.         mPermissionHelper = PermissionHelper.getInstance(MainActivity.this);  
  65.     }  
  66.   
  67.     /**  
  68.      * 方法描述:初始化View组件信息及相关点击事件  
  69.      */  
  70.     private void initViews() {  
  71.         textLocationShow = (TextView) findViewById(R.id.text_location_show);  
  72.         btnLocation = (Button) findViewById(R.id.btn_location);  
  73.   
  74.         btnLocation.setOnClickListener(new View.OnClickListener() {  
  75.             @Override  
  76.             public void onClick(View v) {  
  77.                 getLocation();  
  78.             }  
  79.         });  
  80.   
  81.         ((Button)findViewById(R.id.btn_skip)).setOnClickListener(new View.OnClickListener() {  
  82.             @Override  
  83.             public void onClick(View v) {  
  84.                 Intent intent = new Intent(MainActivity.this,ThirdActivity.class);  
  85.                 startActivity(intent);  
  86.             }  
  87.         });  
  88.     }  
  89.   
  90.     private void getLocation() {  
  91.         if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)  
  92.                 != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission  
  93.                 (MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)  
  94.                 != PackageManager.PERMISSION_GRANTED) {  
  95.             mPermissionHelper.request(MULTI_PERMISSIONS);  
  96.             return;  
  97.         }  
  98.         Location location = locationManager.getLastKnownLocation(locateType); // 通过GPS获取位置  
  99.         if (location != null) {  
  100.             updateUI(location);  
  101.         }  
  102.         // 设置监听*器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米  
  103.         locationManager.requestLocationUpdates(locateType, 100,0,  
  104.                 locationListener);  
  105.     }  
  106.   
  107.     private LocationListener locationListener = new LocationListener() {  
  108.         /**  
  109.          * 位置信息变化时触发:当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发  
  110.          * @param location  
  111.          */  
  112.         @Override  
  113.         public void onLocationChanged(Location location) {  
  114.             Toast.makeText(MainActivity.this, "onLocationChanged函数被触发!", Toast.LENGTH_SHORT).show();  
  115.             updateUI(location);  
  116.             Log.i(TAG, "时间:" + location.getTime());  
  117.             Log.i(TAG, "经度:" + location.getLongitude());  
  118.             Log.i(TAG, "纬度:" + location.getLatitude());  
  119.             Log.i(TAG, "海拔:" + location.getAltitude());  
  120.         }  
  121.   
  122.         /**  
  123.          * GPS状态变化时触发:Provider被disable时触发此函数,比如GPS被关闭  
  124.          * @param provider  
  125.          * @param status  
  126.          * @param extras  
  127.          */  
  128.         @Override  
  129.         public void onStatusChanged(String provider, int status, Bundle extras) {  
  130.             switch (status) {  
  131.                 //GPS状态为可见时  
  132.                 case LocationProvider.AVAILABLE:  
  133.                     Toast.makeText(MainActivity.this, "onStatusChanged:当前GPS状态为可见状态", Toast.LENGTH_SHORT).show();  
  134.                     break;  
  135.                 //GPS状态为服务区外时  
  136.                 case LocationProvider.OUT_OF_SERVICE:  
  137.                     Toast.makeText(MainActivity.this, "onStatusChanged:当前GPS状态为服务区外状态", Toast.LENGTH_SHORT).show();  
  138.                     break;  
  139.                 //GPS状态为暂停服务时  
  140.                 case LocationProvider.TEMPORARILY_UNAVAILABLE:  
  141.                     Toast.makeText(MainActivity.this, "onStatusChanged:当前GPS状态为暂停服务状态", Toast.LENGTH_SHORT).show();  
  142.                     break;  
  143.             }  
  144.         }  
  145.   
  146.         /**  
  147.          * 方法描述:GPS开启时触发  
  148.          * @param provider  
  149.          */  
  150.         @Override  
  151.         public void onProviderEnabled(String provider) {  
  152.             Toast.makeText(MainActivity.this, "onProviderEnabled:方法被触发", Toast.LENGTH_SHORT).show();  
  153.             getLocation();  
  154.         }  
  155.   
  156.         /**  
  157.          * 方法描述: GPS禁用时触发  
  158.          * @param provider  
  159.          */  
  160.         @Override  
  161.         public void onProviderDisabled(String provider) {  
  162.   
  163.         }  
  164.     };  
  165.   
  166.     /**  
  167.      * 方法描述:在View上更新位置信息的显示  
  168.      *  
  169.      * @param location  
  170.      */  
  171.     private void updateUI(Location location) {  
  172.         double longitude = location.getLongitude();  
  173.         double latitude = location.getLatitude();  
  174.   
  175.         textLocationShow.setText("当前经度:" + longitude + "\n当前纬度:" + latitude);  
  176.     }  
  177.   
  178.     @Override  
  179.     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {  
  180.         mPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);  
  181.     }  
  182.   
  183.     @Override  
  184.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  185.         mPermissionHelper.onActivityForResult(requestCode);  
  186.     }  
  187.   
  188.     @Override  
  189.     public void onPermissionGranted(@NonNull String[] permissionName) {  
  190.         getLocation();  
  191.         Log.i("onPermissionGranted", "Permission(s) " + Arrays.toString(permissionName) + " Granted");  
  192.     }  
  193.   
  194.     @Override  
  195.     public void onPermissionDeclined(@NonNull String[] permissionName) {  
  196.   
  197.     }  
  198.   
  199.     @Override  
  200.     public void onPermissionPreGranted(@NonNull String permissionsName) {  
  201.   
  202.     }  
  203.   
  204.     @Override  
  205.     public void onPermissionNeedExplanation(@NonNull String permissionName) {  
  206.   
  207.     }  
  208.   
  209.     @Override  
  210.     public void onPermissionReallyDeclined(@NonNull String permissionName) {  
  211.   
  212.     }  
  213.   
  214.     @Override  
  215.     public void onNoPermissionNeeded() {  
  216.   
  217.     }  
  218. }  

 

代码封装:

     高效的开发者绝对不会做重复的代码的事情。那么可以编写一个GPS定位管理类,将公共的功能逻辑封装好实现模块化,在activity中实现差异化的内容。   

    1、GPSLocationListener:利用Java面向接口编程的方式定义该接口用于实时监听数据回调

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. import android.location.Location;  
  2. import android.os.Bundle;  
  3.   
  4. /**  
  5.  * 类描述:供外部实现的接口  
  6.  * Created by lizhenya on 2016/9/12.  
  7.  */  
  8. public interface GPSLocationListener {  
  9.     /**  
  10.      * 方法描述:位置信息发生改变时被调用  
  11.      *  
  12.      * @param location 更新位置后的新的Location对象  
  13.      */  
  14.     void UpdateLocation(Location location);  
  15.   
  16.     /**  
  17.      * 方法描述:provider定位源类型变化时被调用  
  18.      *  
  19.      * @param provider provider的类型  
  20.      * @param status   provider状态  
  21.      * @param extras   provider的一些设置参数(如高精度、低功耗等)  
  22.      */  
  23.     void UpdateStatus(String provider, int status, Bundle extras);  
  24.   
  25.     /**  
  26.      * 方法描述:GPS状态发生改变时被调用(GPS手动启动、手动关闭、GPS不在服务区、GPS占时不可用、GPS可用)  
  27.      *  
  28.      * @param gpsStatus 详见{@link GPSProviderStatus}  
  29.      */  
  30.     void UpdateGPSProviderStatus(int gpsStatus);  
  31. }  

 

 

    2、GPSLocation:实现动态地实时更新位置坐标信息、状态信息

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. import android.location.Location;  
  2. import android.location.LocationListener;  
  3. import android.location.LocationProvider;  
  4. import android.os.Bundle;  
  5.   
  6. /**  
  7.  * 类描述:实现LocationListener的子类,同时实现自己的接口调用  
  8.  * Created by lizhenya on 2016/9/12.  
  9.  */  
  10. public class GPSLocation implements LocationListener {  
  11.     private GPSLocationListener mGpsLocationListener;  
  12.   
  13.     public GPSLocation(GPSLocationListener gpsLocationListener) {  
  14.         this.mGpsLocationListener = gpsLocationListener;  
  15.     }  
  16.   
  17.     @Override  
  18.     public void onLocationChanged(Location location) {  
  19.         if (location != null) {  
  20.             mGpsLocationListener.UpdateLocation(location);  
  21.         }  
  22.     }  
  23.   
  24.   
  25.     @Override  
  26.     public void onStatusChanged(String provider, int status, Bundle extras) {  
  27.         mGpsLocationListener.UpdateStatus(provider, status, extras);  
  28.         switch (status) {  
  29.             case LocationProvider.AVAILABLE:  
  30.                 mGpsLocationListener.UpdateGPSProviderStatus(GPSProviderStatus.GPS_AVAILABLE);  
  31.                 break;  
  32.             case LocationProvider.OUT_OF_SERVICE:  
  33.                 mGpsLocationListener.UpdateGPSProviderStatus(GPSProviderStatus.GPS_OUT_OF_SERVICE);  
  34.                 break;  
  35.             case LocationProvider.TEMPORARILY_UNAVAILABLE:  
  36.                 mGpsLocationListener.UpdateGPSProviderStatus(GPSProviderStatus.GPS_TEMPORARILY_UNAVAILABLE);  
  37.                 break;  
  38.         }  
  39.     }  
  40.   
  41.     @Override  
  42.     public void onProviderEnabled(String provider) {  
  43.         mGpsLocationListener.UpdateGPSProviderStatus(GPSProviderStatus.GPS_ENABLED);  
  44.     }  
  45.   
  46.     @Override  
  47.     public void onProviderDisabled(String provider) {  
  48.         mGpsLocationListener.UpdateGPSProviderStatus(GPSProviderStatus.GPS_DISABLED);  
  49.     }  
  50. }  

 

 

    3、GPS状态信息类

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. /**  
  2.  * 类描述:GPS状态类  
  3.  * Created by lizhenya on 2016/9/12.  
  4.  */  
  5. public class GPSProviderStatus {  
  6.     //用户手动开启GPS  
  7.     public static final int GPS_ENABLED = 0;  
  8.     //用户手动关闭GPS  
  9.     public static final int GPS_DISABLED = 1;  
  10.     //服务已停止,并且在短时间内不会改变  
  11.     public static final int GPS_OUT_OF_SERVICE = 2;  
  12.     //服务暂时停止,并且在短时间内会恢复  
  13.     public static final int GPS_TEMPORARILY_UNAVAILABLE = 3;  
  14.     //服务正常有效  
  15.     public static final int GPS_AVAILABLE = 4;  
  16. }  

 

    4、GPSLocationManager:实现GPS定位的初始化、GPS定位的启动和终止

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. import android.Manifest;  
  2. import android.app.Activity;  
  3. import android.content.Context;  
  4. import android.content.Intent;  
  5. import android.content.pm.PackageManager;  
  6. import android.location.Location;  
  7. import android.location.LocationManager;  
  8. import android.os.Build;  
  9. import android.provider.Settings;  
  10. import android.support.v4.app.ActivityCompat;  
  11. import android.widget.Toast;  
  12.   
  13. import java.lang.ref.WeakReference;  
  14.   
  15. /**  
  16.  * 类描述:GPS定位的管理类  
  17.  * Created by lizhenya on 2016/9/12.  
  18.  */  
  19. public class GPSLocationManager {  
  20.     private static final String GPS_LOCATION_NAME = android.location.LocationManager.GPS_PROVIDER;  
  21.     private static GPSLocationManager gpsLocationManager;  
  22.     private static Object objLock = new Object();  
  23.     private boolean isGpsEnabled;  
  24.     private static String mLocateType;  
  25.     private WeakReference<Activity> mContext;  
  26.     private LocationManager locationManager;  
  27.     private GPSLocation mGPSLocation;  
  28.     private boolean isOPenGps;  
  29.     private long mMinTime;  
  30.     private float mMinDistance;  
  31.   
  32.     private GPSLocationManager(Activity context) {  
  33.         initData(context);  
  34.     }  
  35.   
  36.     private void initData(Activity context) {  
  37.         this.mContext = new WeakReference<>(context);  
  38.         if (mContext.get() != null) {  
  39.             locationManager = (LocationManager) (mContext.get().getSystemService(Context.LOCATION_SERVICE));  
  40.         }  
  41.         //定位类型:GPS  
  42.         mLocateType = locationManager.GPS_PROVIDER;  
  43.         //默认不强制打开GPS设置面板  
  44.         isOPenGps = false;  
  45.         //默认定位时间间隔为1000ms  
  46.         mMinTime = 1000;  
  47.         //默认位置可更新的最短距离为0m  
  48.         mMinDistance = 0;  
  49.     }  
  50.   
  51.     public static GPSLocationManager getInstances(Activity context) {  
  52.         if (gpsLocationManager == null) {  
  53.             synchronized (objLock) {  
  54.                 if (gpsLocationManager == null) {  
  55.                     gpsLocationManager = new GPSLocationManager(context);  
  56.                 }  
  57.             }  
  58.         }  
  59.         return gpsLocationManager;  
  60.     }  
  61.   
  62.     /**  
  63.      * 方法描述:设置发起定位请求的间隔时长  
  64.      *  
  65.      * @param minTime 定位间隔时长(单位ms)  
  66.      */  
  67.     public void setScanSpan(long minTime) {  
  68.         this.mMinTime = minTime;  
  69.     }  
  70.   
  71.     /**  
  72.      * 方法描述:设置位置更新的最短距离  
  73.      *  
  74.      * @param minDistance 最短距离(单位m)  
  75.      */  
  76.     public void setMinDistance(float minDistance) {  
  77.         this.mMinDistance = minDistance;  
  78.     }  
  79.   
  80.     /**  
  81.      * 方法描述:开启定位(默认情况下不会强制要求用户打开GPS设置面板)  
  82.      *  
  83.      * @param gpsLocationListener  
  84.      */  
  85.     public void start(GPSLocationListener gpsLocationListener) {  
  86.         this.start(gpsLocationListener, isOPenGps);  
  87.     }  
  88.   
  89.     /**  
  90.      * 方法描述:开启定位  
  91.      *  
  92.      * @param gpsLocationListener  
  93.      * @param isOpenGps           当用户GPS未开启时是否强制用户开启GPS  
  94.      */  
  95.     public void start(GPSLocationListener gpsLocationListener, boolean isOpenGps) {  
  96.         this.isOPenGps = isOpenGps;  
  97.         if (mContext.get() == null) {  
  98.             return;  
  99.         }  
  100.         mGPSLocation = new GPSLocation(gpsLocationListener);  
  101.         isGpsEnabled = locationManager.isProviderEnabled(GPS_LOCATION_NAME);  
  102.         if (!isGpsEnabled && isOPenGps) {  
  103.             openGPS();  
  104.             return;  
  105.         }  
  106.         if (ActivityCompat.checkSelfPermission(mContext.get(), Manifest.permission.ACCESS_FINE_LOCATION)  
  107.                 != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission  
  108.                 (mContext.get(), Manifest.permission.ACCESS_COARSE_LOCATION)  
  109.                 != PackageManager.PERMISSION_GRANTED) {  
  110.             return;  
  111.         }  
  112.   
  113.         Location lastKnownLocation = locationManager.getLastKnownLocation(mLocateType);  
  114.         mGPSLocation.onLocationChanged(lastKnownLocation);  
  115.         //备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新  
  116.         locationManager.requestLocationUpdates(mLocateType, mMinTime, mMinDistance, mGPSLocation);  
  117.     }  
  118.   
  119.     /**  
  120.      * 方法描述:转到手机设置界面,用户设置GPS  
  121.      */  
  122.     public void openGPS() {  
  123.         Toast.makeText(mContext.get(), "请打开GPS设置", Toast.LENGTH_SHORT).show();  
  124.         if (Build.VERSION.SDK_INT > 15) {  
  125.             Intent intent = new Intent(  
  126.                     Settings.ACTION_LOCATION_SOURCE_SETTINGS);  
  127.             mContext.get().startActivityForResult(intent, 0);  
  128.         }  
  129.     }  
  130.   
  131.     /**  
  132.      * 方法描述:终止GPS定位,该方法最好在onPause()中调用  
  133.      */  
  134.     public void stop() {  
  135.         if (mContext.get() != null) {  
  136.             if (ActivityCompat.checkSelfPermission(mContext.get(), Manifest.permission.ACCESS_FINE_LOCATION) !=  
  137.                     PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext.get(),  
  138.                     Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {  
  139.                 return;  
  140.             }  
  141.             locationManager.removeUpdates(mGPSLocation);  
  142.         }  
  143.     }  
  144. }  

 

 

 

GPS管理类的使用:在Activity中Oncreate()方法中进行初始化和开启定位,在onPause()方法中终止定位

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. import android.app.Activity;  
  2. import android.location.Location;  
  3. import android.os.Bundle;  
  4. import android.view.View;  
  5. import android.widget.Button;  
  6. import android.widget.TextView;  
  7. import android.widget.Toast;  
  8.   
  9. import com.lzy.gpslocation.location.GPSLocationListener;  
  10. import com.lzy.gpslocation.location.GPSLocationManager;  
  11. import com.lzy.gpslocation.location.GPSProviderStatus;  
  12.   
  13. /**  
  14.  * Created by lizhenya on 2016/9/12.  
  15.  */  
  16. public class ThirdActivity extends Activity {  
  17.     private TextView text_gps_3;  
  18.     private Button btn_gps_3;  
  19.   
  20.     private GPSLocationManager gpsLocationManager;  
  21.   
  22.     @Override  
  23.     public void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_third);  
  26.   
  27.         initData();  
  28.     }  
  29.   
  30.     private void initData() {  
  31.         gpsLocationManager = GPSLocationManager.getInstances(ThirdActivity.this);  
  32.   
  33.         text_gps_3 = (TextView) findViewById(R.id.text_gps_3);  
  34.         btn_gps_3 = (Button) findViewById(R.id.btn_gps_3);  
  35.         btn_gps_3.setOnClickListener(new View.OnClickListener() {  
  36.             @Override  
  37.             public void onClick(View v) {  
  38.                 //开启定位  
  39.                 gpsLocationManager.start(new MyListener());  
  40.             }  
  41.         });  
  42.     }  
  43.   
  44.     class MyListener implements GPSLocationListener {  
  45.   
  46.         @Override  
  47.         public void UpdateLocation(Location location) {  
  48.             if (location != null) {  
  49.                 text_gps_3.setText("经度:" + location.getLongitude() + "\n纬度:" + location.getLatitude());  
  50.             }  
  51.         }  
  52.   
  53.         @Override  
  54.         public void UpdateStatus(String provider, int status, Bundle extras) {  
  55.             if ("gps" == provider) {  
  56.                 Toast.makeText(ThirdActivity.this, "定位类型:" + provider, Toast.LENGTH_SHORT).show();  
  57.             }  
  58.         }  
  59.   
  60.         @Override  
  61.         public void UpdateGPSProviderStatus(int gpsStatus) {  
  62.             switch (gpsStatus) {  
  63.                 case GPSProviderStatus.GPS_ENABLED:  
  64.                     Toast.makeText(ThirdActivity.this, "GPS开启", Toast.LENGTH_SHORT).show();  
  65.                     break;  
  66.                 case GPSProviderStatus.GPS_DISABLED:  
  67.                     Toast.makeText(ThirdActivity.this, "GPS关闭", Toast.LENGTH_SHORT).show();  
  68.                     break;  
  69.                 case GPSProviderStatus.GPS_OUT_OF_SERVICE:  
  70.                     Toast.makeText(ThirdActivity.this, "GPS不可用", Toast.LENGTH_SHORT).show();  
  71.                     break;  
  72.                 case GPSProviderStatus.GPS_TEMPORARILY_UNAVAILABLE:  
  73.                     Toast.makeText(ThirdActivity.this, "GPS暂时不可用", Toast.LENGTH_SHORT).show();  
  74.                     break;  
  75.                 case GPSProviderStatus.GPS_AVAILABLE:  
  76.                     Toast.makeText(ThirdActivity.this, "GPS可用啦", Toast.LENGTH_SHORT).show();  
  77.                     break;  
  78.             }  
  79.         }  
  80.     }  
  81.   
  82.     @Override  
  83.     protected void onPause() {  
  84.         super.onPause();  
  85.         //在onPause()方法终止定位  
  86.         gpsLocationManager.stop();  
  87.     }  
  88. }  

 

OK,关于GPS定位获取经纬度的总结先这么多。

源码下载:Android GPS定位(获取经纬度)

转载于:https://my.oschina.net/JiangTun/blog/897650

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值