1 //获取位置管理服务
2 private LocationManager locationManager;
3 String mProviderName = "";
1 private voidonCreate(){2 locationManager =(LocationManager) getSystemService(Context.LOCATION_SERVICE);3 }

3.在onStart()

1 @Override2 public voidonStart() {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 =locationManager9 .getLastKnownLocation(LocationManager.GPS_PROVIDER);10 mProviderName =LocationManager.GPS_PROVIDER;11 if (lastKnownLocation == null) {12 lastKnownLocation =locationManager13 .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 booleanopenGPSSettings() {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 = newIntent(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 @Override6 public voidonResume() {7 super.onResume();8 if (locationManager != null && !Utils.isEmpty(mProviderName)) {9 locationManager.requestLocationUpdates(mProviderName, 1000, 1,10 locationListener);11 }12 }13
14 @Override15 public voidonPause() {16 super.onPause();17 //取消注册监听
18 if (locationManager != null) {19 locationManager.removeUpdates(locationListener);20 }21 }

监听位置变化:

1 private LocationListener locationListener = newLocationListener() {2
3 /**
4 * 位置信息变化时触发5 */
6 public voidonLocationChanged(Location location) {7
8 updateToNewLocation(location);9 }10
11 /**
12 * GPS状态变化时触发13 */
14 public void onStatusChanged(String provider, intstatus, Bundle extras) {15 switch(status) {16 //GPS状态为可见时
17 caseLocationProvider.AVAILABLE:18 //当前GPS状态为可见状态
19 break;20 //GPS状态为服务区外时
21 caseLocationProvider.OUT_OF_SERVICE:22 //当前GPS状态为服务区外状态
23 break;24 //GPS状态为暂停服务时
25 caseLocationProvider.TEMPORARILY_UNAVAILABLE:26 //当前GPS状态为暂停服务状态
27 break;28 }29 }30
31 /**
32 * GPS开启时触发33 */
34 public voidonProviderEnabled(String provider) {35 Location location =locationManager.getLastKnownLocation(provider);36 updateToNewLocation(location);37 }38
39 /**
40 * GPS禁用时触发41 */
42 public voidonProviderDisabled(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(finalLocation 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 = newCriteria();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);