4、获取默认陀螺仪:使用 getDefaultSensor(Sensor.TYPE_GYROSCOPE) 获取陀螺仪
好,咱们接着往下走。上一节我们聊了怎么判断手机有没有陀螺仪,这一节就进入实操环节——把陀螺仪这个传感器对象拿到手。
说白了,就是一行代码的事:
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor gyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
嗯,就这么简单。但你别小看这行代码,里面有几个坑,我一个个给你说清楚。
4.1 getDefaultSensor 到底干了什么?
这个方法的名字起得很直白——「获取默认传感器」。但什么是「默认」?
我打个比方:你家有好几把螺丝刀,有十字的、有一字的、有梅花形的。但平时用得最多的那把,就是「默认」的那把。Android 系统也是这样,如果手机里有多个陀螺仪芯片(这种情况很少见,但确实存在),getDefaultSensor 会返回系统认为最合适的那一个。
我个人习惯是,拿到传感器后先做个非空判断:
if (gyroscope != null) {
// 有陀螺仪,可以干活了
} else {
// 没有陀螺仪,或者获取失败
}
为什么?因为 getDefaultSensor 有可能返回 null。我在项目中遇到过,某款低端平板明明有陀螺仪硬件,但系统没注册对应的驱动,结果返回了 null。你想想看,如果不做判断直接往下走,NullPointerException 就等着你了。
4.2 参数 TYPE_GYROSCOPE 的含义
这个参数告诉系统:我要的是陀螺仪,不是加速度计,也不是磁力计。
Android 传感器框架里,每种传感器都有一个对应的 int 常量:
| 传感器类型 | 常量值 | 说明 |
|---|---|---|
| TYPE_GYROSCOPE | 4 | 标准陀螺仪(未校准) |
| TYPE_GYROSCOPE_UNCALIBRATED | 16 | 未校准陀螺仪(含漂移数据) |
| TYPE_ACCELEROMETER | 1 | 加速度计 |
这里有个细节:TYPE_GYROSCOPE 返回的是经过校准的数据。什么叫校准?就是系统内部已经把零偏误差给去掉了。而 TYPE_GYROSCOPE_UNCALIBRATED 会给你原始数据,包括漂移估计值。对于大多数入门场景,用 TYPE_GYROSCOPE 就够了。
4.3 获取 SensorManager 的两种方式
刚才的代码里,第一步是获取 SensorManager。这个对象是传感器系统的入口,没有它什么都干不了。
获取方式有两种:
- 在 Activity 中: 直接调用
getSystemService(Context.SENSOR_SERVICE) - 在 Fragment 或非 Activity 类中: 需要先拿到 Context,比如
context.getSystemService(Context.SENSOR_SERVICE)
我曾经犯过一个低级错误——在 Service 的构造函数里直接调用 getSystemService,结果崩溃了。后来才想起来,Service 的 onCreate 方法执行之后才能拿到 Context。嗯,这里要注意,别在构造方法里搞这些。
4.4 完整代码示例
把上面这些串起来,一个完整的获取陀螺仪的代码长这样:
public class GyroscopeHelper {
private SensorManager sensorManager;
private Sensor gyroscope;
public GyroscopeHelper(Context context) {
// 第一步:获取 SensorManager
sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
// 第二步:获取默认陀螺仪
gyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
// 第三步:检查是否获取成功
if (gyroscope == null) {
// 处理没有陀螺仪的情况
Log.w("GyroscopeHelper", "设备不支持陀螺仪");
} else {
Log.i("GyroscopeHelper", "陀螺仪获取成功: " + gyroscope.getName());
}
}
public Sensor getGyroscope() {
return gyroscope;
}
public boolean hasGyroscope() {
return gyroscope != null;
}
}
4.5 避坑指南
我总结几个常见的坑,你遇到了可以少走弯路:
- 不要在主线程做耗时操作: 获取 SensorManager 和 Sensor 本身很快,但注册监听器后的回调是在主线程执行的。如果你的回调里有复杂计算,记得开子线程。
- 记得在 onPause 或 onStop 中注销监听器: 这个后面会细讲,但提前提醒你——不注销的话,传感器会一直工作,耗电很快。
- 模拟器上可能获取不到: 我在 Android Studio 模拟器上测试过,默认没有陀螺仪传感器。你可以用
sensorManager.getSensorList(Sensor.TYPE_ALL)看看模拟器支持哪些传感器。
4.6 知识体系图
下面这张图帮你理清获取陀螺仪的整个流程:
这张图把整个流程拆成了三步:获取管理器 → 调用方法 → 检查结果。你跟着这个流程走,基本不会出错。
GyroscopeHelper 一样。这样在多个 Activity 或 Fragment 里复用起来特别方便,而且只要改一个地方就能统一处理异常情况。
好了,这一节的内容就到这里。记住,拿到 Sensor 对象只是第一步,真正的数据流还没开始。下一节我们会聊怎么让陀螺仪真正「转」起来——注册监听器。
公众号:蓝海资料掘金营,微信deep3321