LocationManager mLocationManager;
MyLocationListener myLocationListener;
OnLocationChangeListener mListener;
@SuppressLint("MissingPermission")
public boolean registerLocation(Context context, long minTime, long minDistance, OnLocationChangeListener listener) {
if(listener == null) {
return false;
} else if(ContextCompat.checkSelfPermission(context, "android.permission.ACCESS_FINE_LOCATION") != 0 && ActivityCompat.checkSelfPermission(context, "android.permission.ACCESS_COARSE_LOCATION") != 0) {
ActivityCompat.requestPermissions((Activity)context, new String[]{"android.permission.ACCESS_FINE_LOCATION"}, 1);
ActivityCompat.requestPermissions((Activity)context, new String[]{"android.permission.ACCESS_COARSE_LOCATION"}, 1);
return false;
} else {
mLocationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
mListener = listener;
if(!isLocationEnabled(context)) {
Toast.showToast(context, "无法定位,请打开定位服务", 500);
return false;
} else {
String provider = mLocationManager.getBestProvider(getCriteria(), true);
Location location = mLocationManager.getLastKnownLocation(provider);
if(location != null) {
listener.getLastKnownLocation(location);
}
if(myLocationListener == null) {
myLocationListener = new MyLocationListener();
}
mLocationManager.requestLocationUpdates(provider, minTime, (float)minDistance, myLocationListener);
return true;
}
}
}
private Criteria getCriteria() {
Criteria criteria = new Criteria();
criteria.setAccuracy(1);
criteria.setSpeedRequired(false);
criteria.setCostAllowed(false);
criteria.setBearingRequired(false);
criteria.setAltitudeRequired(false);
criteria.setPowerRequirement(1);
return criteria;
}
public static boolean isLocationEnabled(Context context) {
LocationManager lm = (LocationManager)context.getSystemService(LOCATION_SERVICE);
return lm.isProviderEnabled("network") || lm.isProviderEnabled("gps");
}
private class MyLocationListener implements LocationListener {
private MyLocationListener() {
}
public void onLocationChanged(Location location) {
if(mListener != null) {
mListener.onLocationChanged(location);
}
}
public void onStatusChanged(String provider, int status, Bundle extras) {
if(mListener != null) {
mListener.onStatusChanged(provider, status, extras);
}
switch(status) {
case 0:
Log.d("onStatusChanged", "当前GPS状态为服务区外状态");
break;
case 1:
Log.d("onStatusChanged", "当前GPS状态为暂停服务状态");
break;
case 2:
Log.d("onStatusChanged", "当前GPS状态为可见状态");
}
}
public void onProviderEnabled(String provider) {
}
public void onProviderDisabled(String provider) {
}
}
public interface OnLocationChangeListener {
void getLastKnownLocation(Location var1);
void onLocationChanged(Location var1);
void onStatusChanged(String var1, int var2, Bundle var3);
}
解除注册
//移除监听
@SuppressLint("MissingPermission")
public void unRegisterLocation() {
if(mLocationManager != null) {
if(myLocationListener != null) {
mLocationManager.removeUpdates(myLocationListener);
myLocationListener = null;
}
mLocationManager = null;
}
}