Kotlin中如何检测设备是否支持指南针传感器及空指针报错解决
问题原因与解决方案
错误根因
你遇到的报错主要来自两个问题:
- Kotlin非空类型校验触发:你的
sensor变量声明时使用了非空类型Sensor,而getDefaultSensor本身的返回值是可空类型,当方法返回null时,赋值给非空变量的操作会直接抛出异常,这个校验发生在你的if空判断执行之前,所以你的分支逻辑根本没有生效。 - 传感器常量已废弃:
Sensor.TYPE_ORIENTATION从API 8开始就被官方废弃,绝大多数新设备不会返回该类型的传感器实例,哪怕设备本身支持方向感应功能,调用该方法也大概率返回null。
修复方案
- 首先将
sensor变量声明为可空类型Sensor? - 用官方推荐的
Sensor.TYPE_ROTATION_VECTOR替代废弃的方向传感器常量,它是当前安卓设备获取方向数据的标准实现 - 完整实现代码如下:
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager // 优先使用官方推荐的旋转矢量传感器判断设备是否支持方向感应 val sensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR) if (sensor != null) { startActivity(Intent(this, MainActivity::class.java)) } else { // 部分极旧设备可能只支持废弃的方向传感器,可加一层兼容判断 val legacySensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION) if (legacySensor != null) { startActivity(Intent(this, MainActivity::class.java)) } else { startActivity(Intent(this, SetProfileActivity::class.java)) } }
如果不需要兼容API 20以下的旧设备,直接省略legacySensor的兼容判断即可。
内容的提问来源于stack exchange,提问作者Enigma
相关产品推荐
相关产品推荐

