安卓设备内置多种传感器(如加速度计、陀螺仪、光线传感器等),通过SensorManager
统一管理,每个传感器对应唯一的Sensor
对象,包含以下核心属性:
属性名 | 说明 |
---|---|
name |
传感器名称(如”Accelerometer”) |
vendor |
硬件厂商信息 |
type |
传感器类型常量(如Sensor.TYPE_ACCELEROMETER ) |
maximumRange |
最大测量值范围 |
resolution |
最小分辨率 |
power |
耗电量等级(值越小越省电) |
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
注:部分传感器(如GPS)需要定位权限,普通传感器(如加速度计)无需额外权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE); }
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 获取加速度计传感器 Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); // 检查传感器是否存在 if (accelerometer == null) { Toast.makeText(this, "设备不支持加速度计", Toast.LENGTH_SHORT).show(); }
SensorEventListener listener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { float x = event.values[0]; // X轴数据 float y = event.values[1]; // Y轴数据 float z = event.values[2]; // Z轴数据 // 处理传感器数据... } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // 精度变化处理(可选) } }; // 注册监听器(第二个参数控制数据采样频率) sensorManager.registerListener(listener, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
传感器类型 | 返回值说明 | 典型应用场景 |
---|---|---|
TYPE_ACCELEROMETER |
三轴加速度(m/s²) | 检测设备方向、摇一摇功能 |
TYPE_GYROSCOPE |
三轴角速度(rad/s) | 3D游戏姿态控制 |
TYPE_MAGNETIC_FIELD |
三轴磁场强度(μT) | 电子罗盘实现 |
TYPE_LIGHT |
环境光强度(lux) | 自动亮度调节 |
TYPE_PROXIMITY |
距离值(cm) | 通话时距离检测 |
TYPE_LINEAR_ACCELERATION |
线性加速度(m/s²,剔除重力影响) | 步数检测 |
sensorManager.unregisterListener(listener);
问题描述 | 解决方案 |
---|---|
传感器数据始终为0 | 检查是否成功调用registerListener ,确认传感器存在且已授权 |
数据更新频率不稳定 | 使用SENSOR_DELAY_FASTEST 或自定义延迟参数(需权衡功耗) |
不同设备数据差异大 | 标准化处理(如将加速度值除以Sensor.GRAVITY_EARTH 转换为g单位) |
横屏/竖屏状态影响数据 | 使用Display.getRotation() 配合坐标变换 |
A:通过SensorManager.getDefaultSensor()
返回值判断,若返回null
则表示不支持,推荐代码:
boolean hasGyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) != null;
A:不同传感器需要不同的转换方式:
m/s²
转g
单位 → value / SensorManager.GRAVITY_EARTH
μT
转gauss
→ value / 1000
(1gauss=1000μT)rad/s
转°/s
→ `value (180/Math.PI)