2013-08-23 6 views
0

내 앱은 근접 센서를 사용하여 앱의 주요 활동 동안 화면을 켜거나 끕니다.근접 센서가 "38,654,705,664"와 같은 값을보고합니다.

11월 8일에서 23일까지 : 25 : 04.754 E/AndroidRuntime (30499) : 치명적인 예외 : 주요 11월 8일에서 23일까지 그러나 이것은 내가 HTC 하나 S 사용자로부터 충돌 보고서를받은, 잘 작동 : 25 : 04.754 E/AndroidRuntime (30499) : java.lang.NumberFormatException : 유효하지 않은 int : "38,654,705,664" 08-23 11 : 25 : 04.754 E/AndroidRuntime (30499) : java.lang.Integer.invalidInt (Integer.java) : 138) 08-23 11 : 25 : 04.754 E/AndroidRuntime (30499) : 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) : 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); 
} 

사용자의 센서 교정 문제입니까? 아니면 "38,654,705,664"와 같은 잘못된 값을 피하기 위해 정수 구문 분석을 try/catch로 둘러 쌀 수 있습니까?

+0

단순히 'int dis = (int) sensor;'를 호출하지 않는 이유는 무엇입니까? –

+0

stacktrace (38,654,705,664)의 값이 int의 가장 큰 가능한 값 (2,147,483,647)을 초과하므로 도움이되지 않습니다. 'long '을 사용할 수는 있지만 38,654,705,664는 분명히 "근접한"근접 값이 아니므로 여기서 무슨 일이 일어나고 있는지 모르겠습니다. – Nick

+0

코드에서 float을 string으로 변환 한 다음 int를 string으로 변환합니다. float가 최대 int 값을 초과하면 log에 무엇을 나타낼 것으로 예상합니까? –

답변

2

주조 형식 float ~ int은 예외를 발생시키지 않습니다. 우리는 당신 같은 경우에 정밀도를 잃어 버립니다. "전체"값이 필요한 경우 float을 사용하고 캐스팅하지 마십시오. 이제는 센서 API의 잘못된 값에 대해 설명합니다. 그들은 언제나 올 수 있습니다. 당신이 그들을 인식 할 수 있다면, 당신은 계산에서 그들을 제외시킬 수 있습니다. 필수 조건 인 경우 통계 필터를 구현할 수 있습니다. 희망이 도움이됩니다.