Home » Android » Android GPS ACCURACY_HIGH causes force close?

Android GPS ACCURACY_HIGH causes force close?

Posted by: admin June 15, 2020 Leave a comment

Questions:

I am working on a GPS portion and for criteria, I can set the accuracy to ACCURACY_FINE, ACCURACY_MEDIUM etc. However, for some reason I keep getting a force close error If i set it the Criteria to ACCURACY_HIGH. any ideas on what might be causing it?

Heres my Manifest, im pretty sure everything is ok, since I am able to use different Criterias:

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

Here are my logs:

 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 am developing using Android 2.3.5 firmware. Thanks!

How to&Answers:

The android Criteria has two separate groups of accuracy constants. ACCURACY_FINE and ACCURACY_COARSE are for general location, while ACCURACY_LOW, ACCURACY_MEDIUM, and ACCURACY_HIGH “may be used for horizontal, altitude, speed or bearing accuracy.” If you are talking about general GPS location you should use coarse or fine.

Answer:

To clarify matt5784’s answer a little more, here’s an example of how to use the new constants:

    //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);

Answer:

ACCURACY_FINE is grouped with ACCURACY_COARSE with constant values of 1 & 2 respectively. ACCURACY_LOW, MEDIUM and HIGH are grouped together with constant values 1, 2 & 3.

It seems that setAccuracy expects and returns either COARSE or FINE, while setVerticalAccuracy, setHorizontalAccuracy, setSpeedAccuracy and setBearingAccuracy expect LOW, MEDIUM or HIGH. Furthermore, when you call setAccuracy, it sets horizontal accuracy like so:

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, use ACCURACY_FINE. I agree this should be better documented.