1 // 获取位置管理服务 2 private LocationManager locationManager;
3 String mProviderName = "";
1 private void onCreate(){ 2 locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 3 }
3.在onStart()
1 @Override 2 public void onStart() { 3 super.onStart(); 4 if (getIntent() == null || getIntent().getStringExtra("city") == null 5 || "".equals(getIntent().getStringExtra("city"))) { 6 if (openGPSSettings()) { 7 Location lastKnownLocation = null; 8 lastKnownLocation = locationManager 9 .getLastKnownLocation(LocationManager.GPS_PROVIDER); 10 mProviderName = LocationManager.GPS_PROVIDER; 11 if (lastKnownLocation == null) { 12 lastKnownLocation = locationManager 13 .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 14 mProviderName = LocationManager.NETWORK_PROVIDER; 15 } 16 if (mProviderName != null && !"".equals(mProviderName)) { 17 locationManager.requestLocationUpdates(mProviderName, 1000, 18 1, locationListener); 19 } 20 } 21 } 22 }
判断是否开启GPS:
1 /** GPS模块是否存在或者是开启 **/ 2 private boolean openGPSSettings() { 3 LocationManager alm = (LocationManager) this 4 .getSystemService(Context.LOCATION_SERVICE); 5 if (alm.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) { 6 Toast.makeText(this, "GPS模块正常", Toast.LENGTH_SHORT).show(); 7 return true; 8 } 9 10 Toast.makeText(this, "请开启GPS!", Toast.LENGTH_SHORT).show(); 11 Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS); 12 startActivityForResult(intent, 0); // 此为设置完成后返回到获取界面 13 return false; 14 }
在onPause、onResume中处理locationManager
1 /** 2 * 这里一定要对LocationManager进行重新设置监听 mgr获取provider的过程不是一次就能成功的 3 * mgr.getLastKnownLocation很可能返回null 如果只在initProvider()中注册一次监听则基本很难成功 4 */ 5 @Override 6 public void onResume() { 7 super.onResume(); 8 if (locationManager != null && !Utils.isEmpty(mProviderName)) { 9 locationManager.requestLocationUpdates(mProviderName, 1000, 1, 10 locationListener); 11 } 12 } 13 14 @Override 15 public void onPause() { 16 super.onPause(); 17 // 取消注册监听 18 if (locationManager != null) { 19 locationManager.removeUpdates(locationListener); 20 } 21 }
监听位置变化:
1 private LocationListener locationListener = new LocationListener() { 2 3 /** 4 * 位置信息变化时触发 5 */ 6 public void onLocationChanged(Location location) { 7 8 updateToNewLocation(location); 9 } 10 11 /** 12 * GPS状态变化时触发 13 */ 14 public void onStatusChanged(String provider, int status, Bundle extras) { 15 switch (status) { 16 // GPS状态为可见时 17 case LocationProvider.AVAILABLE: 18 // 当前GPS状态为可见状态 19 break; 20 // GPS状态为服务区外时 21 case LocationProvider.OUT_OF_SERVICE: 22 // 当前GPS状态为服务区外状态 23 break; 24 // GPS状态为暂停服务时 25 case LocationProvider.TEMPORARILY_UNAVAILABLE: 26 // 当前GPS状态为暂停服务状态 27 break; 28 } 29 } 30 31 /** 32 * GPS开启时触发 33 */ 34 public void onProviderEnabled(String provider) { 35 Location location = locationManager.getLastKnownLocation(provider); 36 updateToNewLocation(location); 37 } 38 39 /** 40 * GPS禁用时触发 41 */ 42 public void onProviderDisabled(String provider) { 43 updateToNewLocation(null); 44 } 45 };
/** 服务管理对象的监听器 */
// 绑定监听,有4个参数
// 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种
// 参数2,位置信息更新周期,单位毫秒
// 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息
// 参数4,监听
// 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新
// 1秒更新一次,或最小位移变化超过1米更新一次;
// 注意:此处更新准确度非常低,推荐在service里面启动一个Thread,在run中sleep(10000);然后执行handler.sendMessage(),更新位置
// 设置监听器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米
处理经纬度信息,可以请求baidu获取详细地址信息。
1 public void updateToNewLocation(final Location location) { 2 if (location == null) { 3 Toast.makeText(getApplicationContext(), "GPS定位失败", 4 Toast.LENGTH_SHORT).show(); 5 return; 6 } 7 8 Log.i("", "经度:" + location.getLongitude()); 9 Log.i("", "纬度:" + location.getLatitude());38 }
开始启动监听位置变化时,可设置:
1 String serviceName = Context.LOCATION_SERVICE; 2 locationManager = (LocationManager) this.getSystemService(serviceName); 3 // 查找到服务信息 4 Criteria criteria = new Criteria(); 5 // 设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细 6 criteria.setAccuracy(Criteria.ACCURACY_FINE); 7 // 设置是否要求速度 8 criteria.setSpeedRequired(false); 9 // 设置是否需要海拔信息 10 criteria.setAltitudeRequired(false); 11 // 设置是否需要方位信息 12 criteria.setBearingRequired(false); 13 // 设置是否允许运营商收费 14 criteria.setCostAllowed(true); 15 // 设置对电源的需求 16 criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗 17 18 // 为获取地理位置信息时设置查询条件 19 String provider = locationManager.getBestProvider(criteria, true); // 获取GPS信息
//如果不设置查询要求,getLastKnownLocation方法传人的参数为LocationManager.GPS_PROVIDER Location location = locationManager.getLastKnownLocation(provider); // 通过GPS获取位置 updateToNewLocation(location);