301f327d646146965d4c85467625b5ae8099c1a8.svn-base 8.0 KB

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