【问题标题】:Proximity sensor reports values like "38,654,705,664"接近传感器报告诸如“38,654,705,664”之类的值
【发布时间】:2013-08-23 10:40:42
【问题描述】:

我的应用在应用的主 Activity 上使用接近传感器打开/关闭屏幕。这工作正常,但是我收到了来自 HTC One S 用户的崩溃报告:

08-23 11:25:04.754 E/AndroidRuntime(30499): 致命异常: main 08-23 11:25:04.754 E/AndroidRuntime(30499): java.lang.NumberFormatException: Invalid 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) 08-23 11: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”?

【问题讨论】:

  • 为什么不直接打电话给int dis = (int) sensor;
  • stacktrace 中的值 (38,654,705,664) 超过了 int 的最大可能值 (2,147,483,647),所以这无济于事。我可以使用long,但 38,654,705,664 显然不是“真正的”邻近值,所以我不知道这里发生了什么。
  • 在您的代码中,您将浮点数转换为字符串,然后将字符串转换为 int。如果 float 超过最大 int 值,您希望在日志中看到什么?
  • 你是对的,浮动 --> 字符串步骤没有任何意义。然而,即使int dis = (int) sensor; 在这种情况下也会引发异常,对吧?我正在询问更多关于为什么传感器值在第一种情况下到达的信息 - 它是用户端的传感器错误校准,还是我应该尝试/捕获的临时“侥幸”值(和除了这样的“坏”值之外,传感器应该可以正常工作)?
  • float 转换为int 不会导致异常。在像您这样的情况下,我们只是失去了准确性。如果您需要一个完整的值,您应该使用 float 并且不要尝试强制转换它。与传感器 api 的错误值无关。他们总是可以来的。如果您能识别它们,您可以将它们排除在计算之外。如果这是一个硬性要求,您可以实现一些统计过滤器。希望这会有所帮助。

标签: android proximity proximitysensor


【解决方案1】:

float 转换为int 不会导致异常。在像您这样的情况下,我们只是失去了准确性。如果您需要“完整”值,您应该使用 float 并且不要尝试强制转换它。现在关于传感器 API 的错误值。他们总是可以来的。如果您能识别它们,您可以将它们排除在计算之外。如果这是必须的要求,您可以实现一些统计过滤器。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-09
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多