8547b45f2112548b1dd21161450f2a7b38958c74.svn-base 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package eVVM.apk.helper.GPS;
  2. import android.Manifest;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.pm.PackageManager;
  7. import android.location.Location;
  8. import android.location.LocationManager;
  9. import android.net.Uri;
  10. import android.os.Build;
  11. import android.provider.Settings;
  12. import android.support.v4.app.ActivityCompat;
  13. import android.util.Log;
  14. import android.widget.Toast;
  15. import com.hjq.permissions.OnPermission;
  16. import com.hjq.permissions.Permission;
  17. import com.hjq.permissions.XXPermissions;
  18. import java.lang.ref.WeakReference;
  19. import java.util.List;
  20. import eVVM.apk.common.MyActivity;
  21. import eVVM.apk.ui.login.LoginActivity;
  22. /**
  23. * 类描述:GPS定位的管理类
  24. * Created by lizhenya on 2016/9/12.
  25. */
  26. public class GPSLocationManager {
  27. private static final String GPS_LOCATION_NAME = android.location.LocationManager.GPS_PROVIDER;
  28. private static GPSLocationManager gpsLocationManager;
  29. private static Object objLock = new Object();
  30. private boolean isGpsEnabled;
  31. private static String mLocateType;
  32. private WeakReference<Activity> mContext;
  33. private LocationManager locationManager;
  34. private GPSLocation mGPSLocation;
  35. private boolean isOPenGps;
  36. private long mMinTime;
  37. private float mMinDistance;
  38. private GPSLocationManager(Activity context) {
  39. initData(context);
  40. }
  41. private void initData(Activity context) {
  42. this.mContext = new WeakReference<>(context);
  43. if (mContext.get() != null) {
  44. locationManager = (LocationManager) (mContext.get().getSystemService(Context.LOCATION_SERVICE));
  45. }
  46. //定位类型:GPS
  47. mLocateType = locationManager.GPS_PROVIDER;
  48. //默认不强制打开GPS设置面板
  49. isOPenGps = false;
  50. //默认定位时间间隔为1000ms
  51. mMinTime = 1000;
  52. //默认位置可更新的最短距离为0m
  53. mMinDistance = 0;
  54. }
  55. public static GPSLocationManager getInstances(Activity context) {
  56. if (gpsLocationManager == null) {
  57. synchronized (objLock) {
  58. if (gpsLocationManager == null) {
  59. gpsLocationManager = new GPSLocationManager(context);
  60. }
  61. }
  62. }
  63. return gpsLocationManager;
  64. }
  65. /**
  66. * 方法描述:设置发起定位请求的间隔时长
  67. *
  68. * @param minTime 定位间隔时长(单位ms)
  69. */
  70. public void setScanSpan(long minTime) {
  71. this.mMinTime = minTime;
  72. }
  73. /**
  74. * 方法描述:设置位置更新的最短距离
  75. *
  76. * @param minDistance 最短距离(单位m)
  77. */
  78. public void setMinDistance(float minDistance) {
  79. this.mMinDistance = minDistance;
  80. }
  81. /**
  82. * 方法描述:开启定位(默认情况下不会强制要求用户打开GPS设置面板)
  83. *
  84. * @param gpsLocationListener
  85. */
  86. public void start(GPSLocationListener gpsLocationListener) {
  87. this.start(gpsLocationListener, isOPenGps);
  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) != PackageManager.PERMISSION_GRANTED &&
  107. ActivityCompat.checkSelfPermission(mContext.get(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  108. String[] CONTACTS = new String[]{
  109. Permission.ACCESS_FINE_LOCATION,
  110. Permission.ACCESS_COARSE_LOCATION};
  111. XXPermissions.with(mContext.get())
  112. .constantRequest() //可设置被拒绝后继续申请,直到用户授权或者永久拒绝
  113. //.permission(Permission.SYSTEM_ALERT_WINDOW, Permission.REQUEST_INSTALL_PACKAGES) //支持请求6.0悬浮窗权限8.0请求安装权限
  114. .permission(CONTACTS) //不指定权限则自动获取清单中的危险权限
  115. .request(new OnPermission() {
  116. @Override
  117. public void hasPermission(List<String> granted, boolean isAll) {
  118. if (isAll) {
  119. ((MyActivity)mContext.get()).toast("获取权限成功, 请重启软件");
  120. }else {
  121. ((MyActivity)mContext.get()).toast("获取权限成功,软件无法使用");
  122. mContext.get().finish();
  123. }
  124. }
  125. @Override
  126. public void noPermission(List<String> denied, boolean quick) {
  127. if(quick) {
  128. ((MyActivity)mContext.get()).toast("被永久拒绝授权,请手动授予权限");
  129. //如果是被永久拒绝就跳转到应用权限系统设置页面
  130. XXPermissions.gotoPermissionSettings(mContext.get());
  131. }else {
  132. ((MyActivity)mContext.get()).toast("获取权限失败,软件无法使用");
  133. mContext.get().finish();
  134. }
  135. }
  136. });
  137. return;
  138. }
  139. Location lastKnownLocation = locationManager.getLastKnownLocation(mLocateType);
  140. mGPSLocation.onLocationChanged(lastKnownLocation);
  141. //备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新
  142. locationManager.requestLocationUpdates(mLocateType, mMinTime, mMinDistance, mGPSLocation);
  143. }
  144. /**
  145. * 方法描述:转到手机设置界面,用户设置GPS
  146. */
  147. public void openGPS() {
  148. Toast.makeText(mContext.get(), "请打开GPS设置", Toast.LENGTH_SHORT).show();
  149. if (Build.VERSION.SDK_INT > 15) {
  150. Intent intent = new Intent(
  151. Settings.ACTION_LOCATION_SOURCE_SETTINGS);
  152. mContext.get().startActivityForResult(intent, 0);
  153. }
  154. }
  155. /**
  156. * 方法描述:终止GPS定位,该方法最好在onPause()中调用
  157. */
  158. public void stop() {
  159. if (mContext.get() != null) {
  160. if (ActivityCompat.checkSelfPermission(mContext.get(), Manifest.permission.ACCESS_FINE_LOCATION) !=
  161. PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext.get(),
  162. Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  163. return;
  164. }
  165. locationManager.removeUpdates(mGPSLocation);
  166. }
  167. }
  168. }