3、获取传感器服务:通过 getSystemService 获取 SensorManager 实例

好,咱们继续往下走。

上一节我们聊了传感器有哪些类型,怎么判断手机支不支持。但有个前提——你得先拿到传感器的「管家」,也就是 SensorManager。没有它,你连传感器的门都摸不着。

3.1 SensorManager 是什么?

说白了,SensorManager 就是 Android 系统里负责管理所有传感器的核心类。你想注册监听、获取传感器列表、读取数据,都得通过它。

我个人习惯把它比作「传感器的大管家」。你想想看,手机里那么多传感器——陀螺仪、加速度计、磁力计……总得有个统一调度的地方吧?SensorManager 就是干这个的。

核心要点: 在 Android 中,获取 SensorManager 的唯一方式就是通过 getSystemService() 方法。

3.2 怎么获取?代码很简单

获取方式其实就一行代码。但这一行代码背后,藏着不少细节。

SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

嗯,就这么简单。但我要提醒你——千万别在 Activity 的构造函数里写这行代码。为什么?因为那时候 Context 还没准备好。我刚开始做 Android 开发时就踩过这个坑,一运行就崩,查了半天才发现是调用时机不对。

我的建议:onCreate() 方法里获取 SensorManager,或者在 onResume() 里获取也行。总之,确保 Activity 已经初始化完毕。

3.3 获取之后能干什么?

拿到 SensorManager 实例后,你就可以做三件核心事了:

  • 获取传感器列表 —— 看看手机上有哪些传感器
  • 获取某个传感器的实例 —— 比如拿到陀螺仪
  • 注册/注销监听器 —— 开始接收数据,或者停止接收

这三件事,基本覆盖了你 90% 的传感器开发场景。

3.4 一个完整的获取流程

我一般会这样写,你可以参考一下:

public class MainActivity extends AppCompatActivity {
    private SensorManager sensorManager;
    private Sensor gyroscopeSensor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 第一步:获取 SensorManager
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

        // 第二步:获取陀螺仪传感器
        if (sensorManager != null) {
            gyroscopeSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        }

        // 第三步:检查是否获取成功
        if (gyroscopeSensor == null) {
            // 处理没有陀螺仪的情况
            // 我曾经在平板上遇到过,有些平板确实没有陀螺仪
        }
    }
}
注意: getDefaultSensor() 可能返回 null。别问我怎么知道的——我在一台老款手机上调试时,明明写着支持陀螺仪,结果返回 null。后来发现是系统版本太旧,驱动没加载。所以,一定要做空指针检查

3.5 关于 Context 的一点补充

你可能注意到了,getSystemService() 是 Context 的方法。在 Activity 里可以直接调用,因为 Activity 本身就是 Context 的子类。

但如果你在自定义 View 或者工具类里呢?那就得把 Context 传进去。我个人习惯在 Application 类里持有一个全局 Context,这样哪里都能用。

// 在 Application 中
public class MyApp extends Application {
    private static Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
    }

    public static SensorManager getSensorManager() {
        return (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
    }
}

这样写的好处是,你不需要在每个 Activity 里都重复获取 SensorManager。但要注意——别在 Application 的 onCreate 之前调用,否则会报空指针。

3.6 核心逻辑流程图

下面这张图,把整个获取流程串起来了。你看一眼就明白了:

获取 SensorManager 核心流程 调用 getSystemService() 获取 SensorManager 实例 是否为空? 不为空 → 获取传感器 调用 getDefaultSensor() 为空 → 处理异常 提示用户不支持 注意:getDefaultSensor() 可能返回 null,务必做空指针检查

3.7 常见问题与避坑

问题 原因 解决办法
getSystemService 返回 null Context 未初始化或传入 null 确保在 Activity 的 onCreate 之后调用
getDefaultSensor 返回 null 设备确实没有该传感器 做空指针检查,并给出友好提示
在非 UI 线程调用 某些系统服务不允许 在主线程获取,或者使用 Handler
内存泄漏 忘记注销监听器 在 onPause 或 onDestroy 中注销
一个小技巧: 如果你不确定设备支持哪些传感器,可以先用 getSensorList(Sensor.TYPE_ALL) 打印出来看看。我经常用这招来排查问题,比猜靠谱多了。

好了,拿到 SensorManager 之后,下一步就是注册监听器,开始接收陀螺仪的数据了。不过别急,先把这一步吃透——基础打牢了,后面才不容易翻车。

公众号:蓝海资料掘金营,微信deep3321