2012-07-05 8 views
7

Ich arbeite an einem GPS-Teil und für Kriterien kann ich die Genauigkeit auf ACCURACY_FINE, ACCURACY_MEDIUM etc. einstellen. Aus irgendeinem Grund bekomme ich immer einen Force-Close-Fehler, wenn ich die Kriterien auf ACCURACY_HIGH setze. irgendwelche Ideen zu was könnte es verursachen?Android GPS ACCURACY_HIGH verursacht Force schließen?

Heres mein Manifest, im ziemlich sicher, dass alles in Ordnung ist, da ich in der Lage bin anders Kriterien zu verwenden:

<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" /> 

Hier sind meine Protokolle:

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 

I Android 2.3 mit entwickle. 5 Firmware. Vielen Dank!

Antwort

19

Der Android Criteria hat zwei separate Gruppen von Genauigkeitskonstanten. ACCURACY_FINE und ACCURACY_COARSE sind für den allgemeinen Standort, während ACCURACY_LOW, ACCURACY_MEDIUM und ACCURACY_HIGH "kann für horizontale, Höhe, Geschwindigkeit oder Peilgenauigkeit verwendet werden." Wenn Sie über allgemeine GPS-Position sprechen, sollten Sie grob oder fein verwenden.

+0

Hmmm, vielleicht verwende ich ACCURACY_HIGH falsch. Ich möchte Sie fragen, warum ACCURACY_MEDIUM für mich funktioniert, aber ACCURACY_HIGH nicht? –

+3

'ACCURACY_MEDIUM' ist' 0x00000002' also ist 'ACCURACY_COARSE'; 'ACCURACY_LOW' ist' 0x00000001', also 'ACCURACY_FINE'. Während 'ACCURACY_HIGH' ist '0x00000003' – nullpotent

+1

Das stimmt, aber nur weil sie Konstanten mit äquivalenten Werten sind bedeutet nicht, dass Sie die falsche verwenden sollten ... dieser Pfad führt zu Verwirrung und Unlesbarkeit. COARSE und FINE sind für den allgemeinen Standort bestimmt, während die anderen für Höhe, Geschwindigkeit usw. bestimmt sind. – matt5784

17

Um matt5784 Antwort ein wenig mehr zu klären, hier ist ein Beispiel dafür, wie die neuen Konstanten zu verwenden:

//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 mit ACCURACY_COARSE mit konstanten Werten von 1 & 2 jeweils gruppiert ist. ACCURACY_LOW, MEDIUM und HIGH gruppiert zusammen mit konstanten Werten 1, 2 & 3.

Es scheint, dass setAccuracy erwartet und kehrt entweder COARSE oder FINE, während setVerticalAccuracy, setHorizontalAccuracy, setSpeedAccuracy und setBearingAccuracy erwarten LOW, MEDIUM oder HIGH. Darüber hinaus, wenn Sie setAccuracy nennen, setzt es horizontale Genauigkeit wie folgt:

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; 
    } 
} 

So ACCURACY_FINE verwenden. Ich stimme zu, dass dies besser dokumentiert werden sollte.