android 获取设备当前经纬度 GPS位置信息

sancaiodm Android源码摘录 2021-09-01 1100 0

  通过GPS_PROVIDER或是NETWORK_PROVIDER获取设备当前经纬度定位,现将其整理至一个工具类中方便直接使用

import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;

public class XXLocationManager {

    private static final String TAG = "XXLocationManager";
    private boolean mRecordLocation;
    private Context mContext;
    private LocationManager mLocationManager;
    private static SOSLocationManager mSOSLMInstance;

    LocationListener [] mLocationListeners = new LocationListener[] {
            new LocationListener(android.location.LocationManager.GPS_PROVIDER),
            new LocationListener(android.location.LocationManager.NETWORK_PROVIDER)
    };
    
    
    private SOSLocationManager(Context context) {
    	  mContext = context;
    	  init();
    }

    public static SOSLocationManager getInstance(Context context ) {
    	if(mSOSLMInstance == null) {
    		synchronized(SOSLocationManager.class) {
    			if(mSOSLMInstance == null) {
    				mSOSLMInstance = new SOSLocationManager(context);
    			}
    		}
    	}
    	return mSOSLMInstance;
    }
    
    private void init() {
    	recordLocation(true);
    }
 
    public Location getCurrentLocation() {
        if (!mRecordLocation) {
            return null;
        }
        // go in best to worst order
        for (int i = 0; i < mLocationListeners.length; i++) {
            Location l = mLocationListeners[i].current();
            if (l != null) {
                return l;
            }
        }
        Log.d(TAG, "No location received yet.");
        return null;
    }

    /**
     * Start/stop location recording.
     */
    public void recordLocation(boolean recordLocation) {
        if (mRecordLocation != recordLocation) {
            mRecordLocation = recordLocation;
            if (recordLocation) {
                startReceivingLocationUpdates();
            } else {
                stopReceivingLocationUpdates();
            }
        }
    }
    
    
    private void startReceivingLocationUpdates() {
        Log.v(TAG, "starting location updates");
        if (mLocationManager == null) {
            mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
        }
        if (mLocationManager != null) {
        	
        	boolean isEnableGPS = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);//这里强制开启GPS定位方式服务
            if(!isEnableGPS){
                Settings.Secure.setLocationProviderEnabled(mContext.getContentResolver(), LocationManager.GPS_PROVIDER, true);
                android.util.Log.i(TAG,"setLocationProviderEnabled = true");
            }
        	
            try {
                mLocationManager.requestLocationUpdates(
                        android.location.LocationManager.NETWORK_PROVIDER,
                        1000,
                        0F,
                        mLocationListeners[1]);
            } catch (SecurityException ex) {
                Log.i(TAG, "fail to request location update, ignore"+ex.getMessage());
            } catch (IllegalArgumentException ex) {
                Log.d(TAG, "provider does not exist " + ex.getMessage());
            }
            try {
                mLocationManager.requestLocationUpdates(
                        android.location.LocationManager.GPS_PROVIDER,
                        1000,
                        0F,
                        mLocationListeners[0]);
            } catch (SecurityException ex) {
                Log.i(TAG, "fail to request location update, ignore"+ex.getMessage());
            } catch (IllegalArgumentException ex) {
                Log.d(TAG, "provider does not exist " + ex.getMessage());
            }
            Log.d(TAG, "startReceivingLocationUpdates");
        }
    }

    private void stopReceivingLocationUpdates() {
        Log.v(TAG, "stopping location updates");
        if (mLocationManager != null) {
            for (int i = 0; i < mLocationListeners.length; i++) {
                try {
                    mLocationManager.removeUpdates(mLocationListeners[i]);
                } catch (Exception ex) {
                    Log.i(TAG, "fail to remove location listners, ignore", ex);
                }
            }
            Log.d(TAG, "stopReceivingLocationUpdates");
        }
    }
    
    
    private class LocationListener implements android.location.LocationListener {
		Location mLastLocation;
		boolean mValid = false;
		String mProvider;
		
		public LocationListener(String provider) {
		    mProvider = provider;
		    mLastLocation = new Location(mProvider);
		}
		
		@Override
		public void onLocationChanged(Location newLocation) {
		    if (newLocation.getLatitude() == 0.0
		            && newLocation.getLongitude() == 0.0) {
		        // Hack to filter out 0.0,0.0 locations
		        return;
		    }
		    if (!mValid) {
		        Log.d(TAG, "Got last location.");
		    }
		    Log.d(TAG, "location. update");
		    mLastLocation.set(newLocation);
		    mValid = true;
		}
		
		@Override
		public void onProviderEnabled(String provider) {
		}
		
		@Override
		public void onProviderDisabled(String provider) {
		    mValid = false;
		}
		
		@Override
		public void onStatusChanged(
		        String provider, int status, Bundle extras) {
		    switch(status) {
		        case android.location.LocationProvider.OUT_OF_SERVICE:
		        case android.location.LocationProvider.TEMPORARILY_UNAVAILABLE: {
		            // we can't get the correct location but null.
		            //mValid = false;
		            break;
		        }
		    }
		}
		
		public Location current() {
		    return mValid ? mLastLocation : null;
		}
	}
}

在获取Location对象前记得在合适的位置开启获取位置功能,

        Location location = SOSLocationManager.getInstance(context).getCurrentLocation();

        if(location != null) {

            boolean hasLatLon = false;

            StringBuffer sb = new StringBuffer();

            double latitude = location.getLatitude();

            double longitude = location.getLongitude();

            hasLatLon = (latitude != 0.0d) || (longitude != 0.0d);

            String locat =  sb.append(latitude).append(",").append(longitude).toString();

            android.util.Log.i(TAG,"location ="+locat);

            return hasLatLon ? locat : "no signal";

        }

   return "no signal";


当前不需要位置服务功能时可在合适的位置关闭位置服务功能:

new XXLocationManager();


在开启位置服务功能后即可获取设备经纬度,调用代码:

Location location = new XXLocationManager().getCurrentLocation();   //这是最直接的调用方式,你也可以在此基础上封装一个new XXLocationManager()对象,如将其封装为单例模式等,

location.getLatitude();

location.getLongitude();

或是

    private String  getGPSLocation() {

        Location loc =  new XXLocationManager().getCurrentLocation();

        if (loc != null) {

                boolean hasLatLon = false;

        android.util.Log.i(TAG,"gps location not null");

        android.widget.Toast.makeText(context,"location not null", android.widget.Toast.LENGTH_SHORT).show();

               double latitude = location.getLatitude();

                double longitude = location.getLongitude();

                hasLatLon = (latitude != 0.0d) || (longitude != 0.0d);

               String locat =  sb.append(latitude).append(",").append(longitude).toString();

               return hasLatLon ? locat : "no signal";

        }

      return "no signal";

    }


方式二: 已封装成方法

    public static String getGPSLocation(Context context){
        LocationManager pLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        boolean isEnableGPS = pLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);//forced to be turned on this gps function
        if(!isEnableGPS){
            Settings.Secure.setLocationProviderEnabled(context.getContentResolver(), LocationManager.GPS_PROVIDER, true);
            android.util.Log.i(TAG,"setLocationProviderEnabled = true");
        }
        List<String> providers = pLocationManager.getProviders(true);
        Location location = null;
        for (String provider : providers) {
            Location l = pLocationManager.getLastKnownLocation(provider);
            if (l == null) {
                continue;
            }
            if (location == null || l.getAccuracy() < location.getAccuracy()) {
                location = l;
            }
        }
 
	if(location != null) {
	    boolean hasLatLon = false;
	    StringBuffer sb = new StringBuffer();
	    double latitude = location.getLatitude();
	    double longitude = location.getLongitude();
	    hasLatLon = (latitude != 0.0d) || (longitude != 0.0d);
	    String locat =  sb.append(latitude).append(",").append(longitude).toString();
	    android.util.Log.i(TAG,"location ="+locat);
	    return hasLatLon ? locat : "no signal";
         }
        android.util.Log.i(TAG,"Unable to get location");
        return "no signal";
    }


封装一个定位service

public class LocationService extends Service {

    private LocationManager lm;
    private MyLocationListener listener;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @SuppressLint("MissingPermission")
    @Override
    public void onCreate() {
        super.onCreate();

        lm = (LocationManager) getSystemService(LOCATION_SERVICE);
        listener = new MyLocationListener();

        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_COARSE);
        criteria.setAltitudeRequired(false);//不要求海拔
        criteria.setBearingRequired(false);//不要求方位
        criteria.setCostAllowed(true);//允许有花费
        criteria.setPowerRequirement(Criteria.POWER_LOW);//低功耗

        String provider = lm.getBestProvider(criteria, true);

        log.w("定位的provider:" + provider);

        Location location = lm.getLastKnownLocation(provider);

        log.w("location-" + location);

        if (location != null) {
            //不为空,显示地理位置经纬度
            String longitude = "Longitude:" + location.getLongitude();
            String latitude = "Latitude:" + location.getLatitude();
            log.w("getLastKnownLocation:" + longitude + "-" + latitude);

            stopSelf();

        }

        //第二个参数是间隔时间 第三个参数是间隔多少距离,这里我试过了不同的各种组合,能获取到位置就是能,不能获取就是不能
        lm.requestLocationUpdates(provider, 3000, 10, listener);
    }

    class MyLocationListener implements LocationListener {
        // 位置改变时获取经纬度
        @Override
        public void onLocationChanged(Location location) {

            String longitude = "Longitude:" + location.getLongitude();
            String latitude = "Latitude:" + location.getLatitude();

            log.w("onLocationChanged:" + longitude + "-" + latitude);


            stopSelf();  // 获取到经纬度以后,停止该service
        }

        // 状态改变时
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            log.w("onStatusChanged - provider:"+provider +" status:"+status);
        }

        // 提供者可以使用时
        @Override
        public void onProviderEnabled(String provider) {
            log.w("GPS开启了");
        }

        // 提供者不可以使用时
        @Override
        public void onProviderDisabled(String provider) {
            log.w("GPS关闭了");
        }

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        lm.removeUpdates(listener); // 停止所有的定位服务
    }

}


评论