Does Android GPS ACCURACY_HIGH force force close?

I work on the GPS part and according to the criteria, I can set the accuracy ACCURACY_FINE, ACCURACY_MEDIUM, etc. However, for some reason, I keep getting a strong closing error. If I set it for ACCURACY_HIGH criteria. any ideas on what might cause this?

Here is my manifest, I am sure that everything is in order, since I can use different criteria:

<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!

+7
source share
3 answers

Android Criteria has two separate groups of precision constants. ACCURACY_FINE and ACCURACY_COARSE are for general layout, while ACCURACY_LOW , ACCURACY_MEDIUM and ACCURACY_HIGH "can be used for horizontal, height, speed or precision bearings." If you are talking about a general GPS location, you should use coarse or subtle.

+19
source

To clarify matt5784, answer a little more, here is an example of using 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); 
+17
source

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

It seems setAccuracy expects and returns either COARSE or FINE , while setVerticalAccuracy, setHorizontalAccuracy, setSpeedAccuracy and setBearingAccuracy expect LOW , MEDIUM or HIGH . In addition, when you call setAccuracy, it sets horizontal precision like this:

 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 that this should be better documented.

+2
source

All Articles