2012-07-05 75 views
7

我正在研究GPS部分和標準,我可以將精度設置爲ACCURACY_FINE,ACCURACY_MEDIUM等。但是,由於某些原因,我不斷收到強制關閉錯誤如果將其設置爲ACCURACY_HIGH的標準。關於什麼可能導致它的任何想法?Android GPS ACCURACY_HIGH會導致關閉?

我的繼承人清單,即時通訊相當確信一切正常,因爲我可以使用不同的標準:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 

這裏是我的日誌:

07-05 08:51:48.641: W/dalvikvm(1040): threadid=1: thread exiting with uncaught exception (group=0x40015578) 
07-05 08:51:48.657: E/AndroidRuntime(1040): FATAL EXCEPTION: main 
07-05 08:51:48.657: E/AndroidRuntime(1040): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jetdelivery.mobile/com.jetdelivery.mobile.statuspage}: java.lang.IllegalArgumentException: accuracy=3 
07-05 08:51:48.657: E/AndroidRuntime(1040): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651) 
07-05 08:51:48.657: E/AndroidRuntime(1040): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 
07-05 08:51:48.657: E/AndroidRuntime(1040): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
07-05 08:51:48.657: E/AndroidRuntime(1040): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
07-05 08:51:48.657: E/AndroidRuntime(1040): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-05 08:51:48.657: E/AndroidRuntime(1040): at android.os.Looper.loop(Looper.java:130) 
07-05 08:51:48.657: E/AndroidRuntime(1040): at android.app.ActivityThread.main(ActivityThread.java:3687) 
07-05 08:51:48.657: E/AndroidRuntime(1040): at java.lang.reflect.Method.invokeNative(Native Method) 
07-05 08:51:48.657: E/AndroidRuntime(1040): at java.lang.reflect.Method.invoke(Method.java:507) 
07-05 08:51:48.657: E/AndroidRuntime(1040): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
07-05 08:51:48.657: E/AndroidRuntime(1040): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
07-05 08:51:48.657: E/AndroidRuntime(1040): at dalvik.system.NativeStart.main(Native Method) 
07-05 08:51:48.657: E/AndroidRuntime(1040): Caused by: java.lang.IllegalArgumentException: accuracy=3 
07-05 08:51:48.657: E/AndroidRuntime(1040): at android.location.Criteria.setAccuracy(Criteria.java:223) 
07-05 08:51:48.657: E/AndroidRuntime(1040): at com.jetdelivery.mobile.statuspage.onCreate(statuspage.java:125) 
07-05 08:51:48.657: E/AndroidRuntime(1040): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
07-05 08:51:48.657: E/AndroidRuntime(1040): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 
07-05 08:51:48.657: E/AndroidRuntime(1040): ... 11 more 

我使用的是Android 2.3開發。 5固件。謝謝!

回答

19

android Criteria有兩個獨立的精度常數組。 ACCURACY_FINEACCURACY_COARSE用於一般位置,而ACCURACY_LOW,ACCURACY_MEDIUMACCURACY_HIGH「可用於水平,高度,速度或軸承精度。」如果你正在談論一般的GPS位置,你應該使用粗糙或罰款。

+0

嗯,也許我錯誤地使用了ACCURACY_HIGH。我想問你爲什麼ACCURACY_MEDIUM適合我,但ACCURACY_HIGH不? – 2012-07-05 19:22:21

+3

'ACCURACY_MEDIUM'是'0x00000002',所以'ACCURACY_COARSE'; 'ACCURACY_LOW'是'0x00000001','ACCURACY_FINE'也是。 鑑於'ACCURACY_HIGH'是'0x00000003' – nullpotent 2012-07-05 19:25:26

+1

的確如此,但僅僅因爲它們是具有等價值的常量並不意味着您應該使用錯誤的...這種路徑會導致混淆和不可讀。 COARSE和FINE用於一般位置,而其他用於高度,速度等。 – matt5784 2012-07-05 20:49:57

17

澄清matt5784的回答多一點,這裏有一個如何使用新的常量的例子:

//All your normal criteria setup 
    Criteria criteria = new Criteria(); 
    //Use FINE or COARSE (or NO_REQUIREMENT) here 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); 
    criteria.setPowerRequirement(Criteria.POWER_LOW); 
    criteria.setAltitudeRequired(true); 
    criteria.setSpeedRequired(true); 
    criteria.setCostAllowed(true); 
    criteria.setBearingRequired(true); 

    //API level 9 and up 
    criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH); 
    criteria.setVerticalAccuracy(Criteria.ACCURACY_HIGH); 
    criteria.setBearingAccuracy(Criteria.ACCURACY_LOW); 
    criteria.setSpeedAccuracy(Criteria.ACCURACY_MEDIUM); 
2

ACCURACY_FINE進行分組與ACCURACY_COARSE分別爲1 & 2的恆定值。 ACCURACY_LOWMEDIUMHIGH與恆定值1一起分組,2 & 3.

似乎setAccuracy期望並傳回COARSEFINE,而setVerticalAccuracy,setHorizo​​ntalAccuracy,setSpeedAccuracy和setBearingAccuracy期望LOW,或MEDIUMHIGH。此外,當你調用setAccuracy,它設置水平精度,像這樣:

public void setAccuracy(int accuracy) { 
    if (accuracy < NO_REQUIREMENT || accuracy > ACCURACY_COARSE) { 
     throw new IllegalArgumentException("accuracy=" + accuracy); 
    } 
    if (accuracy == ACCURACY_FINE) { 
     mHorizontalAccuracy = ACCURACY_HIGH; 
    } else { 
     mHorizontalAccuracy = ACCURACY_LOW; 
    } 
} 

因此,使用ACCURACY_FINE。我同意這應該更好地記錄。

相關問題