public class GPSInfoProvider{ private static GPSInfoProvider gpsInfoProvider; private static Context context; private static MyLocationListener listener; private LocationManager locationManager; private GPSInfoProvider() { } /** * 为了让这个方法一定执行完,所以我们加入了synchronized来修饰 * @return */ public static synchronized GPSInfoProvider getInstance(Context context) { if(gpsInfoProvider == null) { gpsInfoProvider = new GPSInfoProvider(); GPSInfoProvider.context = context; } return gpsInfoProvider; } /** * 获取位置 * @return */ public String getLocation() { locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); String provider = getBestProvider(); //这个方法是位置更新的的操作,有四个参数 //第一个参数就是使用的定位设备啊,如gps,基站定位啊 //第二个参数就是多长时间更新一次定位信息,太频繁了会很耗电,根据自己程序的实际需要来进行确定 //第三个参数就是用户位移了多少米之后,就重新获取一次定位信息,太频繁了会很耗电,根据自己程序的实际需要来进行确定 //最后一个参数就是在位置发生变化的回调方法 locationManager.requestLocationUpdates(provider, 60000, 50, getListener()); //locationManager.getAllProviders();//它会把所以支持的定位方式都打列出来,这样就可以知道手机所支持的定位啦 SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE); String location = sp.getString("lostLocation", ""); return location; } //停止gps public void stopGPSListener() { if(locationManager != null) { locationManager.removeUpdates(getListener()); } } private String getBestProvider() { Criteria criteria = new Criteria(); //这个是定义它的定位精度的 //Criteria.ACCURACY_COARSE 这个是一般的定位 //Criteria.ACCURACY_FINE 这个是精准定位 criteria.setAccuracy(Criteria.ACCURACY_FINE); //设置是不是对海拔敏感的 criteria.setAltitudeRequired(false); //设置对手机的耗电量,定位要求越高,越耗电 criteria.setPowerRequirement(Criteria.POWER_MEDIUM); //设置对速度变化是不是敏感 criteria.setSpeedRequired(true); //设置在定位时,是不是允许与运营商交换数据的开销 criteria.setCostAllowed(true); //这个方法是用来得到最好的定位方式的,它有两个参数,一个是Criteria(类似于Map集合),就是一些条件,比如说对加速度敏感啊,什么海拔敏感这些的 //第二个参数就是,如果我们置为false,那么我们得到的也有可能是已经关掉了的设备,如果是true那么,就只会得到已经打开了的设备 return locationManager.getBestProvider(criteria, true); } //做成单例模式 private synchronized MyLocationListener getListener() { if(listener == null) { listener = new MyLocationListener(); } return listener; } //========================================================================= private class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location location) { //手机位置发生改变时调用的方法 String latitude = "纬度:" + location.getLatitude();//纬度 String longitude = "经度:" + location.getLongitude();//经度 SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE); Editor editor = sp.edit(); editor.putString("lastLocation", latitude + " - " + longitude); editor.commit(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { //定位设备的状态发生改变的时候调用的方法,比如说用户把设备打开,或关闭,第二个参数就是设备的状态啦 } @Override public void onProviderEnabled(String provider) { //设备打开的时候调用的方法 } @Override public void onProviderDisabled(String provider) { //设备关闭的时候调用的方法 } }}