Android Sensors (2) 传感器API的使用
识别传感器和传感器能力
Android sensor framework提供了一些方法,使得你在运行时可以方便地查看设备上都有哪些传感器。
API也提供了一些让你获取每个传感器性能的方法。
首先,你需要获取sensor service的一个引用;即通过向 getSystemService()
方法中传入SENSOR_SERVICE
参数来创建一个SensorManager类的实例。
private SensorManager mSensorManager; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
然后,你可以通过在getSensorList() 方法中传入TYPE_ALL
来获取设备上的所有传感器。
List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
如果你想要获取指定类型的一系列传感器,你可以使用参数TYPE_GYROSCOPE,TYPE_LINEAR_ACCELERATION或TYPE_GRAVITY等。
如果对于某种特定类型的传感器来说,设备上含有不止一个这种传感器,那么这些传感器中的一个将被指定为这种类型的默认传感器。
使用getDefaultSensor()方法并且传入特定的传感器类型,可以得到此类型的默认传感器。
如果此类型的默认传感器不存在,那么这个方法将会返回null,这就意味着这个设备不含此类型的传感器。
除了列出设备上的传感器,你可以利用Sensor 类中的方法去获得传感器的性能及属性。当你需要你的应用在不同的设备环境下有不同的行为时,这样做是很有用的。
监测传感器事件
为了检测传感器数据,你需要实现SensorEventListener
接口中的两个回调方法:onAccuracyChanged()
和 onSensorChanged()
。
当传感器的精度改变时:
系统调用 onAccuracyChanged()
方法,为你提供Sensor对象的引用和新的精度值。
精度值一般由下面四个状态常量之一表示:SENSOR_STATUS_ACCURACY_LOW, SENSOR_STATUS_ACCURACY_MEDIUM,SENSOR_STATUS_ACCURACY_HIGH, or SENSOR_STATUS_UNRELIABLE。
当传感器报告一个新的值时:
系统调用onSensorChanged()
方法,为你提供一个SensorEvent对象。
一个检测传感器事件的例子
如下面这个例子:
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager mSensorManager; private Sensor mLight; @Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. } @Override public final void onSensorChanged(SensorEvent event) { // The light sensor returns a single value. // Many sensors return 3 values, one for each axis. float lux = event.values[0]; // Do something with this sensor value. } @Override protected void onResume() { super.onResume(); mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this); } }
关于数据延迟
在这个例子中,用 registerListener()
注册时使用了默认的数据延迟SENSOR_DELAY_NORMAL
。
数据延迟(或叫采样率)控制着通过onSensorChanged()
方法传递传感器事件的间隔。
默认的数据延迟(200,000 microseconds)对于监控屏幕方向改变比较合适;其他的:
SENSOR_DELAY_GAME (20,000 microsecond delay), SENSOR_DELAY_UI (60,000 microsecond delay),
SENSOR_DELAY_FASTEST (0 microsecond delay),另外Android 3.0 (API Level 11)可以使用绝对值来设置数据延迟(单位是毫秒)。
你设定的延迟只是一个建议性的延迟,Android系统或其他应用可以改变这个延迟。
最好的实践经验是,你指定可用的最大延迟,因为系统通常是用一个比你指定的值小一些的值。
这即是说,你需要指定满足你应用需求的最低的采样率。用比较大的延迟可以使处理器负载较轻,从而消耗更少的能量。
没有指定sensor framework向应用发送sensor event频率的public的方法,但是,你可以利用每一个sensor event的时间戳去计算几个事件的采样率。
一旦设定后,你不必改变采样率;如果因为某种理由你必须改变采样率,你必须注销(unregister)然后重新注册(reregister)这个sensor listener。
注册和注销位置
这个例子中使用了 onResume()
和onPause() 回调函数来注册和注销传感器事件监听器。
最佳实践:当你不需要传感器时你应该关闭它,特别是你的activity暂停的时候。
如果不这么做你的电池会很快消耗完,系统不会在屏幕关闭的时候自动关闭传感器。
参考资料
API Guides:Sensors Overview
http://developer.android.com/guide/topics/sensors/sensors_overview.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了