正在做一個有關googleMap+GPS的應用,之前有一個困擾近一個月的莫名問題,就是程式對googlemap初始化時出現異常之後應用便很“優雅”的掛掉,但值得注意的問題是在模擬器上跑這個應用,嘛問題也沒有,在真機上,多數的真機“掛機”,只有少數的真機正常。這個對於java程式員來說,絕不亞於uncatch exception異常的打擊。
今天仔細看書,看到如下一段代碼:
LocationManager locationManager = (LocationManager)SH.getSystemService(Context.LOCATION_SERVICE);</p><p> Criteria criteria = new Criteria();<br /> criteria.setAccuracy(Criteria.ACCURACY_COARSE);<br /> criteria.setAltitudeRequired(false);<br /> criteria.setBearingRequired(false);<br /> criteria.setCostAllowed(true);<br /> criteria.setPowerRequirement(Criteria.POWER_LOW);<br /> String provider = locationManager.getBestProvider(criteria, true);</p><p> Location location = locationManager.getLastKnownLocation(provider);
主要說說這個Criteria是個什麼玩意,Criteria直譯很明顯是“精確度”的意思,那麼在android的GPS開發中Criteria類提供若干個查詢條件:
(1) public void setAccuracy( int accuracy )
位置解析的精度,高或低,參數: Criteria. ACCURACY_FINE,精確模式;
Criteria. ACCURACY_COARSE,模糊模式;
(2) public void setAltitudeRequired(boolean altitudeRequired )
是否提供海拔高度資訊,是或否
(3) public void setBearingRequired( boolean bearingRequired )
是否提供方向資訊,是或否
(4) public void setCostAllowed( boolean costAllowed )
是否允許電訊廠商計費,是或否
(5) public void setPowerRequirement( int level )
電池消耗,無、低、中、高,參數 Criteria. NO_REQUIREMENT, Criteria. POWER_LOW, Criteria. POWER_MEDIUM, or Criteria. POWER_HIGH,
(6) public void setSpeedRequired( boolean speedRequired )
是否提供速度資訊,是或否
好,說說“ 神奇 ”的問題,早上剛開啟eclipse,上面所示代碼便映入眼帘,或許是靈光突現,想想之前莫名的錯誤,直接便把
criteria.setAccuracy(Criteria.ACCURACY_FINE);<br /> criteria.setAltitudeRequired(false);<br /> criteria.setBearingRequired(false);<br /> criteria.setCostAllowed(true);<br /> criteria.setPowerRequirement(Criteria.POWER_LOW);
這段選中給“Ctrl+/”掉,之後再幾部android測試手機上挨個跑一次,竟全部順利通過!
挨行解掉注釋行之後發現問題是出在criteria.setAccuracy(ACCURACY_FINE)這個方法上,於是索性嘗試一下將 ACCURACY_FINE更改為 Criteria.ACCURACY_COARSE,問題迎刃而解,可見問題就是在這“精確度”的問題上,把精確度設定為模糊,所有手機跑起來了。同時未解的問題來了,android手機一般都是支援精確定位的(AGPS ),這個我在各個論壇中看到有人說過,但就是不說該如何系統設定這種GPS定位元模式,你們知道嗎?