2012-07-05 16 views
7

Estoy trabajando en una porción de GPS y, como criterio, puedo establecer la precisión en ACCURACY_FINE, ACCURACY_MEDIUM, etc. Sin embargo, por algún motivo sigo recibiendo un error de cierre forzado si lo configuro con los criterios de ACCURACY_HIGH. alguna idea sobre lo que podría estar causando?Android GPS ACCURACY_HIGH provoca la fuerza cerca?

Heres mi manifiesto, estoy bastante seguro de que todo está bien, ya que soy capaz de utilizar criterios:

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

Éstos son mis registros:

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 

Estoy desarrollando el uso de Android 2.3. 5 firmware. ¡Gracias!

Respuesta

19

El android Criteria tiene dos grupos separados de constantes de precisión. ACCURACY_FINE y ACCURACY_COARSE son para la ubicación general, mientras que ACCURACY_LOW, ACCURACY_MEDIUM y ACCURACY_HIGH "se pueden utilizar para precisión horizontal, altitud, velocidad o rumbo". Si está hablando de una ubicación GPS general, debe usar grosor o multa.

+0

Hmmm, tal vez estoy usando ACCURACY_HIGH incorrectamente. Me gustaría preguntarte por qué ACCURACY_MEDIUM funciona para mí, pero ACCURACY_HIGH no? –

+3

'ACCURACY_MEDIUM' es' 0x00000002' así que es 'ACCURACY_COARSE'; 'ACCURACY_LOW' es' 0x00000001' así es 'ACCURACY_FINE'. Considerando que 'ACCURACY_HIGH' es' 0x00000003' – nullpotent

+1

Eso es cierto, pero el hecho de que sean constantes con valores equivalentes no significa que deba usar el incorrecto ... esa ruta conduce a la confusión y la ilegibilidad. COARSE y FINE están destinados a la ubicación general, mientras que los demás están destinados a la altitud, velocidad, etc. – matt5784

17

Para aclarar de matt5784 responda a un poco más, aquí es un ejemplo de cómo utilizar las nuevas constantes:

//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 se agrupa con ACCURACY_COARSE con valores constantes de 1 & 2 respectivamente. ACCURACY_LOW, MEDIUM y HIGH se agrupan junto con valores constantes 1, 2 & 3.

Parece que setAccuracy espera y vuelve ya sea COARSE o FINE, mientras setVerticalAccuracy, setHorizontalAccuracy, setSpeedAccuracy y setBearingAccuracy esperan LOW, MEDIUM o HIGH. Por otra parte, cuando se llama setAccuracy, establece precisión horizontal de este modo:

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

lo tanto, utilizar ACCURACY_FINE. Estoy de acuerdo en que esto debería estar mejor documentado.