Android Studio开发温度显示App报错:SensorManager停止运行求助
问题分析与修复方案
核心问题1:空指针异常导致崩溃
大部分消费级Android设备没有环境温度传感器(Sensor.TYPE_AMBIENT_TEMPERATURE),调用sensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE)会返回null。后续在onResume中传入null的传感器对象注册监听,直接触发空指针异常,导致App崩溃。
核心问题2:setText参数类型错误
tempValues.setText((int) event.values[0]);中,传入整数会被Android当作字符串资源ID处理,而非直接显示温度数值,这会导致要么显示错误内容,要么触发资源未找到异常。
修复后的完整代码
MainActivity.java
package com.zybooks.sensormanager; import androidx.appcompat.app.AppCompatActivity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements SensorEventListener { private SensorManager sensorManager; private Sensor thermometer; private TextView tempValues; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); thermometer = sensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE); tempValues = findViewById(R.id.temperatureValues); // 提前检查传感器是否存在,给用户明确提示 if (thermometer == null) { tempValues.setText("设备无环境温度传感器"); } } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // 传感器精度变化时的处理(按需实现) } @Override public final void onSensorChanged(SensorEvent event) { // 将温度值转为字符串后设置,保留一位小数更直观 float temperature = event.values[0]; tempValues.setText(String.format("当前温度:%.1f°C", temperature)); } @Override protected void onResume() { super.onResume(); // 仅在传感器存在时注册监听,避免空指针 if (thermometer != null) { sensorManager.registerListener(this, thermometer, SensorManager.SENSOR_DELAY_NORMAL); } } @Override protected void onPause() { super.onPause(); // 传感器存在时才取消注册,避免空指针 if (thermometer != null) { sensorManager.unregisterListener(this, thermometer); } } }
额外提示
如果你的设备确实没有环境温度传感器,可尝试使用已弃用的Sensor.TYPE_TEMPERATURE(该传感器通常返回电池/CPU的温度,并非环境温度),替代代码如下:
thermometer = sensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE);
注意:此API已被标记为弃用,仅作为临时测试方案,不推荐正式使用。
内容的提问来源于stack exchange,提问作者FireMonkey
相关产品推荐
相关产品推荐

