e43edbe9e75df263028a0a98a772f7c439a16b3f.svn-base 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package eVVM.apk.helper.GPS;
  2. import android.Manifest;
  3. import android.content.Context;
  4. import android.content.pm.PackageManager;
  5. import android.location.Criteria;
  6. import android.location.Location;
  7. import android.location.LocationListener;
  8. import android.location.LocationManager;
  9. import android.os.Bundle;
  10. import android.support.annotation.NonNull;
  11. import android.support.v4.app.ActivityCompat;
  12. import android.text.TextUtils;
  13. public class LocationUtils {
  14. private static final long REFRESH_TIME = 5000L;
  15. private static final float METER_POSITION = 0.0f;
  16. private static ILocationListener mLocationListener;
  17. private static LocationListener listener = new MyLocationListener();
  18. private static class MyLocationListener implements LocationListener {
  19. @Override
  20. public void onLocationChanged(Location location) {//定位改变监听
  21. if (mLocationListener != null) {
  22. mLocationListener.onSuccessLocation(location);
  23. }
  24. }
  25. @Override
  26. public void onStatusChanged(String provider, int status, Bundle extras) {//定位状态监听
  27. }
  28. @Override
  29. public void onProviderEnabled(String provider) {//定位状态可用监听
  30. }
  31. @Override
  32. public void onProviderDisabled(String provider) {//定位状态不可用监听
  33. }
  34. }
  35. /**
  36. * GPS获取定位方式
  37. */
  38. public static Location getGPSLocation(@NonNull Context context) {
  39. Location location = null;
  40. LocationManager manager = getLocationManager(context);
  41. //高版本的权限检查
  42. if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  43. return null;
  44. }
  45. if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {//是否支持GPS定位
  46. //获取最后的GPS定位信息,如果是第一次打开,一般会拿不到定位信息,一般可以请求监听,在有效的时间范围可以获取定位信息
  47. location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
  48. }
  49. return location;
  50. }
  51. /**
  52. * network获取定位方式
  53. */
  54. public static Location getNetWorkLocation(Context context) {
  55. Location location = null;
  56. LocationManager manager = getLocationManager(context);
  57. //高版本的权限检查
  58. if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  59. return null;
  60. }
  61. if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {//是否支持Network定位
  62. //获取最后的network定位信息
  63. location = manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
  64. }
  65. return location;
  66. }
  67. /**
  68. * 获取最好的定位方式
  69. */
  70. public static Location getBestLocation(Context context, Criteria criteria) {
  71. Location location;
  72. LocationManager manager = getLocationManager(context);
  73. if (criteria == null) {
  74. criteria = new Criteria();
  75. }
  76. String provider = manager.getBestProvider(criteria, true);
  77. if (TextUtils.isEmpty(provider)) {
  78. //如果找不到最适合的定位,使用network定位
  79. location = getNetWorkLocation(context);
  80. } else {
  81. //高版本的权限检查
  82. if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
  83. && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  84. return null;
  85. }
  86. //获取最适合的定位方式的最后的定位权限
  87. location = manager.getLastKnownLocation(provider);
  88. }
  89. return location;
  90. }
  91. /**
  92. * 定位监听
  93. */
  94. public static void addLocationListener(Context context, String provider, ILocationListener locationListener) {
  95. addLocationListener(context, provider, REFRESH_TIME, METER_POSITION, locationListener);
  96. }
  97. /**
  98. * 定位监听
  99. */
  100. public static void addLocationListener(Context context, String provider, long time, float meter, ILocationListener locationListener) {
  101. if (locationListener != null) {
  102. mLocationListener = locationListener;
  103. }
  104. if (listener == null) {
  105. listener = new MyLocationListener();
  106. }
  107. LocationManager manager = getLocationManager(context);
  108. if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
  109. && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  110. return;
  111. }
  112. manager.requestLocationUpdates(provider, time, meter, listener);
  113. }
  114. /**
  115. * 取消定位监听
  116. */
  117. public static void unRegisterListener(Context context) {
  118. if (listener != null) {
  119. LocationManager manager = getLocationManager(context);
  120. if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
  121. && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  122. return;
  123. }
  124. //移除定位监听
  125. manager.removeUpdates(listener);
  126. }
  127. }
  128. private static LocationManager getLocationManager(@NonNull Context context) {
  129. return (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
  130. }
  131. /**
  132. * 自定义接口
  133. */
  134. public interface ILocationListener {
  135. void onSuccessLocation(Location location);
  136. }
  137. /**
  138. * 判断GPS是否开启,GPS或者AGPS开启一个就认为是开启的
  139. * @param context
  140. * @return true 表示开启
  141. */
  142. public static final boolean isOPen(final Context context) {
  143. LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
  144. // 通过GPS卫星定位,定位级别可以精确到街(通过24颗卫星定位,在室外和空旷的地方定位准确、速度快)
  145. boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
  146. // 通过WLAN或移动网络(3G/2G)确定的位置(也称作AGPS,辅助GPS定位。主要用于在室内或遮盖物(建筑群或茂密的深林等)密集的地方定位)
  147. boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
  148. if (gps || network) {
  149. return true;
  150. }
  151. return false;
  152. }
  153. }