2012-07-05 78 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。我同意这应该更好地记录。

相关问题