2013-08-23 96 views
0

我的應用程序使用接近傳感器在應用程序的主要活動時打開/關閉屏幕。這工作得很好,但是我已經從一個的HTC One S的用戶收到的崩潰報告:接近傳感器報告值「38,654,705,664」

11月8日至23日:25:04.754 E/AndroidRuntime(30499):致命異常:主要 11月8日至23日: 25:04.754 E/AndroidRuntime(30499):java.lang.NumberFormatException:無效int:「38,654,705,664」 08-23 11:25:04.754 E/AndroidRuntime(30499):at java.lang.Integer.invalidInt(Integer.java :138) 08-23 11:25:04.754 E/AndroidRuntime(30499):at java.lang.Integer.parse(Integer.java:375) 08-23 11:25:04.754 E/AndroidRuntime(30499):在java.lang.Integer.decode(Integer.java:188) 08-23 11:25:04.754 E/AndroidRuntime(30499):at com.myapp.MyActivity.onSensorChanged(NotificationActivity.java:793) 11月8日至23日:25:04.754 E/AndroidRuntime(30499):在android.hardware.SystemSensorManager $ ListenerDelegate $ 1.handleMessage(SystemSensorManager.java:204)

我正在使用的代碼是

private NumberFormat numForm = new DecimalFormat(); 

@Override 
public void onSensorChanged(SensorEvent event) { 
    float sensor = event.values[0]; 
    String cm = numForm.format(sensor); 
    int dis = Integer.decode(cm); 

    Log.i(TAG, "Proximity distance: " + dis); 
} 

這是用戶端的傳感器校準問題,還是我可以簡單地用try/catch來包圍整數解析,以避免出現像「38,654,705,664」這樣明顯錯誤的值?

+0

爲什麼不簡單地調用'int dis =(int)sensor;'? –

+0

堆棧跟蹤(38,654,705,664)中的值超出了int的最大可能值(2,147,483,647),所以這沒有幫助。我可以使用'長',但38,654,705,664顯然不是一個「真正的」接近值,所以我不知道這裏發生了什麼。 – Nick

+0

在您的代碼中,您將float轉換爲字符串,然後將字符串轉換爲int。如果float超出max int值,你期望在日誌中看到什麼? –

回答

2

鑄造表格floatint不會導致異常。在像你這樣的情況下,我們會失去精確度。如果你需要一個「完整」值,你應該寧願與float一起工作,也不要試圖施放它。現在關於傳感器API的錯誤值。他們總是可以來。如果你能識別它們,你可以從計算中排除它們。如果這是必須要求的,你可以實現一些統計過濾器。希望這可以幫助。