標籤:
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 = 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 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 @Override15 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_PROVIDERLocation location = locationManager.getLastKnownLocation(provider);// 通過GPS擷取位置updateToNewLocation(location);
Android GPS 取經緯度