获取传感器管理器
通过 SensorManager
统一管理设备传感器。
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
获取目标传感器
根据传感器类型常量获取对应传感器实例。
Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
实现传感器事件监听器
需实现 SensorEventListener
接口,处理数据更新。
SensorEventListener listener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { // 处理传感器数据 float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // 处理精度变化(可选) } };
注册监听器
指定采样周期(延迟等级)后注册监听器。
sensorManager.registerListener(listener, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
解注册监听器
在生命周期结束时释放资源,避免内存泄漏。
@Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(listener); }
传感器类型常量 | 名称 | 数据维度 | 典型用途 |
---|---|---|---|
TYPE_ACCELEROMETER |
加速度传感器 | 3轴(x/y/z) | 检测设备方向、摇动动作 |
TYPE_GYROSCOPE |
陀螺仪 | 3轴(x/y/z) | 检测旋转角度、游戏控制 |
TYPE_LIGHT |
光线传感器 | 1维 | 环境亮度检测、自动亮度调节 |
TYPE_MAGNETIC_FIELD |
磁场传感器 | 3轴(x/y/z) | 电子罗盘、方向定位 |
TYPE_PROXIMITY |
距离传感器 | 1维 | 通话时近距离锁屏 |
public class SensorActivity extends AppCompatActivity { private SensorManager sensorManager; private Sensor accelerometer; private TextView dataTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sensor); dataTextView = findViewById(R.id.data_text); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } @Override protected void onResume() { super.onResume(); SensorEventListener listener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { String data = String.format("X: %.2f, Y: %.2f, Z: %.2f", event.values[0], event.values[1], event.values[2]); dataTextView.setText(data); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }; sensorManager.registerListener(listener, accelerometer, SensorManager.SENSOR_DELAY_FASTEST); } @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(listener); // 需声明为成员变量或局部最终变量 } }
问题1:如何判断设备是否支持某类传感器?
答:通过 getDefaultSensor()
方法获取传感器实例,若返回 null
则表示设备不支持该传感器。
if (sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) == null) { // 提示用户设备不支持陀螺仪 }
问题2:如何处理多个传感器的并发数据?
答:为每个传感器单独注册监听器,并在回调中通过 event.sensor.getType()
区分来源。
@Override public void onSensorChanged(SensorEvent event) { switch (event.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: // 处理加速度数据 break; case Sensor.TYPE_GYROSCOPE: // 处理陀螺仪数据 break; } }