Android GPS 取经纬度

时间:2021-06-30 19:51:12
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);