传感器综述
传感器特性
- 传感器注册后会极大地消耗性能,不是必要情况下不要注册!
- 一旦注册传感器监听器,无论你手机是否熄屏,都会一直监听,手机耗电速度加快
光学传感器
一般的,目前的主流手机都会配备光学传感器,譬如手机屏幕亮度自动调节功能,就是基于该传感器实现的
检测光强小案例
首先准备一个布局文件,一个 textview 显示光强,一个 button 获取光强并显示
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="未获取光学信息" />
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取传感器数据" />
</LinearLayout>
检测光强变化主代码,具体用法请看注释
- 先让主 activity 继承 SensorEventListener
- 依次获取 SensorManager 和光学传感器的 Sensor
- 实现监听方法,动态更新光强,把结果保存到变量 lightPower 内部
- 注册点击按钮事件,获取光强并更新到 textview 上面
class MainActivity : AppCompatActivity(), SensorEventListener {
// 延后初始化
lateinit var sensorManager: SensorManager
var mLight: Sensor? = null
// 目前光强值
var lightPower: Float = 0.0f
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 获取SensorManager以及光传感器Sensor.TYPE_LIGHT
// 这里没有检测光传感器是否存在,大家可以自行实现一下!
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)
// 按钮点击更新光强
btn.setOnClickListener {
text.setText(lightPower.toString())
}
}
// 光强改变监听方法
// 获取事件的value[0],即光强值
override fun onSensorChanged(event: SensorEvent?) {
lightPower = event!!.values[0]
}
// 准确度改变的监听事件,没啥用,可以不用填写具体方法
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
}
// 唤醒状态下,注册传感器监听器
override fun onResume() {
super.onResume()
mLight?.also {
sensorManager.registerListener(this, it, SensorManager.SENSOR_DELAY_NORMAL)
}
}
// 一旦挂起到后台,就把光传感器注销掉
override fun onPause() {
super.onPause()
sensorManager.unregisterListener(this)
}
}