package eVVM.apk.helper.GPS; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.text.TextUtils; import java.util.List; import static android.content.Context.LOCATION_SERVICE; public class LocationUtils { private static final long REFRESH_TIME = 5000L; private static final float METER_POSITION = 0.0f; private static ILocationListener mLocationListener; private static LocationListener listener = new MyLocationListener(); private static class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location location) {//定位改变监听 if (mLocationListener != null) { mLocationListener.onSuccessLocation(location); } } @Override public void onStatusChanged(String provider, int status, Bundle extras) {//定位状态监听 } @Override public void onProviderEnabled(String provider) {//定位状态可用监听 } @Override public void onProviderDisabled(String provider) {//定位状态不可用监听 } } /** * GPS获取定位方式 */ public static Location getGPSLocation(@NonNull Context context) { Location location = null; LocationManager manager = getLocationManager(context); //高版本的权限检查 if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return null; } if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {//是否支持GPS定位 //获取最后的GPS定位信息,如果是第一次打开,一般会拿不到定位信息,一般可以请求监听,在有效的时间范围可以获取定位信息 location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER); } return location; } /** * network获取定位方式 */ public static Location getNetWorkLocation(Context context) { Location location = null; LocationManager manager = getLocationManager(context); //高版本的权限检查 if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return null; } if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {//是否支持Network定位 //获取最后的network定位信息 location = manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); } return location; } /** * 获取最好的定位方式 */ public static Location getBestLocation(Context context, Criteria criteria) { Location location; LocationManager manager = getLocationManager(context); if (criteria == null) { criteria = new Criteria(); } String provider = manager.getBestProvider(criteria, true); if (TextUtils.isEmpty(provider)) { //如果找不到最适合的定位,使用network定位 location = getNetWorkLocation(context); } else { //高版本的权限检查 if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return null; } //获取最适合的定位方式的最后的定位权限 Location lkLocation = manager.getLastKnownLocation(provider); if(lkLocation != null){ location = lkLocation; }else { location = getLastKnownLocation(context); } } return location; } private static Location getLastKnownLocation(Context context) { if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return null; } LocationManager locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE); List providers = locationManager.getAllProviders(); Location bestLocation = null; for (String provider : providers) { Location l = locationManager.getLastKnownLocation(provider); if (l == null) { continue; } if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) { // Found best last known location: %s", l); bestLocation = l; } } return bestLocation; } /** * 定位监听 */ public static void addLocationListener(Context context, String provider, ILocationListener locationListener) { addLocationListener(context, provider, REFRESH_TIME, METER_POSITION, locationListener); } /** * 定位监听 */ public static void addLocationListener(Context context, String provider, long time, float meter, ILocationListener locationListener) { if (locationListener != null) { mLocationListener = locationListener; } if (listener == null) { listener = new MyLocationListener(); } LocationManager manager = getLocationManager(context); if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } manager.requestLocationUpdates(provider, time, meter, listener); } /** * 取消定位监听 */ public static void unRegisterListener(Context context) { if (listener != null) { LocationManager manager = getLocationManager(context); if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } //移除定位监听 manager.removeUpdates(listener); } } private static LocationManager getLocationManager(@NonNull Context context) { return (LocationManager) context.getSystemService(LOCATION_SERVICE); } /** * 自定义接口 */ public interface ILocationListener { void onSuccessLocation(Location location); } /** * 判断GPS是否开启,GPS或者AGPS开启一个就认为是开启的 * @param context * @return true 表示开启 */ public static final boolean isOPen(final Context context) { LocationManager locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE); // 通过GPS卫星定位,定位级别可以精确到街(通过24颗卫星定位,在室外和空旷的地方定位准确、速度快) boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); // 通过WLAN或移动网络(3G/2G)确定的位置(也称作AGPS,辅助GPS定位。主要用于在室内或遮盖物(建筑群或茂密的深林等)密集的地方定位) boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (gps || network) { return true; } return false; } }