(1)前景介绍

在使用Android传感器之前,我们首先要弄清楚当前Android设备支持哪些传感器,只有这样我们才能继续操作。
而一般手机不会集成所有的传感器, 大部分只支持一部分传感器:方向传感器、重力传感器等。

传感器大致可分为三类:

  • 动作(Motion)传感器
  • 环境(Environmental)传感器
  • 位置(Position)传感器

(A)动作传感器:这类传感器在三个轴(X、Y、Z)上测量加速度和旋转角度。

  • 加速(accelerometer)传感器
  • 陀螺仪(gyroscope)传感器
  • 重力(gravity)传感器
  • 线性加速(linear acceleration)传感器
  • 旋转向量(rotational vector)传感器

(B)环境传感器:这类传感器可以测量不同环境的参数,例如周围环境的空气温度和压强、光照强度和湿度。

  • 温度(thermometer)传感器
  • 湿度(humidity)传感器
  • 光线(photometer)传感器
  • 压力(pressure)传感器

(C)位置传感器:这类传感器可以测量设备的物理位置。

  • 方向(orientation)传感器(数据来自加速传感器和磁场传感器)
  • 磁场(magnetic)传感器

以上传感器只是部分,后面将用代码获取到手机所支持的传感器类型。我们顺便了解一下Android SDK提供的Android sensor framework(Android传感器框架),其作用是用来访问当前Android设备内置的传感器,帮助我们完成各种与传感器有关的任务。

TYPE_ACCELEROMETER         //加速度传感器(硬件)
TYPE_MAGNETIC_FIELD        //磁场传感器(硬件)
TYPE_ORIENTATION           //方向传感器(软件传感器,数据来自重力和磁场传感器)
TYPE_GYROSCOPE             //陀螺仪传感器(硬件)
TYPE_LIGHT                 //光线传感器(硬件)
TYPE_PRESSURE              //压力传感器(硬件)
TYPE_PROXIMITY             //临近传感器(硬件)
TYPE_GRAVITY               //重场传感器(硬件或软件)
TYPE_LINEAR_ACCELERATION   //线性加速度传感器(硬件或软件)
TYPE_ROTATION_VECTOR       //旋转矢量传感器(硬件或软件)
TYPE_RELATIVE_HUMIDITY     //湿度传感器(硬件)
TYPE_AMBIENT_TEMPERATURE   //温度传感器(硬件)

(2)Demo

(A)主要类和接口:

  • SensorManager类:用于创建sensor service的实例。该类提供了很多用于访问和枚举传感器、注册和注销传感器监听器的方法(具体实现为SystemSensorManager);
  • Sensor类:提供了一些用于获取传感器技术参数的方法。如版本、类型、生产商等;
  • SensorEvent类:系统使用该类创建传感器事件对象,该对象可以提供与传感器相关的信息;
  • SensorEventListener接口:该接口包含两个回调方法,当传感器的回传值或精度发生变化时,系统会调用这两个回调方法;

    (B)获取系统所有支持的传感器
public class MainActivity extends Activity {private TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv = (TextView) findViewById(R.id.tv);SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);  //获取系统的传感器服务并创建实例List<Sensor> list = sm.getSensorList(Sensor.TYPE_ALL);  //获取传感器的集合for (Sensor sensor:list){tv.append(sensor.getName() + "\n");  //把传感器种类显示在TextView中} }
}

(C)获得加速度传感器数据

 public class SensorActivity extends Activity implements SensorEventListener {private final SensorManager mSensorManager;private final Sensor mAccelerometer;public SensorActivity() {mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);}protected void onResume() {super.onResume();mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);}protected void onPause() {super.onPause();mSensorManager.unregisterListener(this);}public void onAccuracyChanged(Sensor sensor, int accuracy) {}public void onSensorChanged(SensorEvent event) {}}

(3)源码解析

(A)

//frameworks/base/core/java/android/hardware/
public interface SensorEventListener {public void onSensorChanged(SensorEvent event);public void onAccuracyChanged(Sensor sensor, int accuracy);
}

(B)

//frameworks/base/core/java/android/hardware/
@SystemService(Context.SENSOR_SERVICE)
public abstract class SensorManager {public boolean registerListener(SensorEventListener listener, Sensor sensor,int samplingPeriodUs) {return registerListener(listener, sensor, samplingPeriodUs, null);}public boolean registerListener(SensorEventListener listener, Sensor sensor,int samplingPeriodUs, Handler handler) {int delay = getDelay(samplingPeriodUs);return registerListenerImpl(listener, sensor, delay, handler, 0, 0);}/** @hide */protected abstract boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,int delayUs, Handler handler, int maxReportLatencyUs, int reservedFlags);//...public void unregisterListener(SensorEventListener listener) {if (listener == null) {return;}unregisterListenerImpl(listener, null);}/** @hide */protected abstract void unregisterListenerImpl(SensorEventListener listener, Sensor sensor);
}

(C)

//frameworks/base/core/java/android/hardware/
/*** Sensor manager implementation that communicates with the built-in* system sensors.** @hide*/
public class SystemSensorManager extends SensorManager {/*** @hide*/@Overrideprotected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,int delayUs, Handler handler, int maxBatchReportLatencyUs, int reservedFlags) {}/*** @hide*/@Overrideprotected void unregisterListenerImpl(SensorEventListener listener, Sensor sensor) {}// Called from native code.@SuppressWarnings("unused")@Overrideprotected void dispatchSensorEvent(int handle, float[] values, int inAccuracy,long timestamp) {final Sensor sensor = mManager.mHandleToSensor.get(handle);if (sensor == null) {// sensor disconnectedreturn;}SensorEvent t = null;synchronized (mSensorsEvents) {t = mSensorsEvents.get(handle);}if (t == null) {// This may happen if the client has unregistered and there are pending events in// the queue waiting to be delivered. Ignore.return;}// Copy from the values array.System.arraycopy(values, 0, t.values, 0, t.values.length);t.timestamp = timestamp;t.accuracy = inAccuracy;t.sensor = sensor;// call onAccuracyChanged() only if the value changesfinal int accuracy = mSensorAccuracies.get(handle);if ((t.accuracy >= 0) && (accuracy != t.accuracy)) {mSensorAccuracies.put(handle, t.accuracy);//调用onAccuracyChangedmListener.onAccuracyChanged(t.sensor, t.accuracy);}//调用onSensorChangedmListener.onSensorChanged(t);}
}

(D)横屏竖用特例

@Overrideprotected void dispatchSensorEvent(int handle, float[] values, int inAccuracy,long timestamp) {final Sensor sensor = mManager.mHandleToSensor.get(handle);if (sensor == null) {// sensor disconnectedreturn;}//add startif(sensor.getType() == Sensor.TYPE_ACCELEROMETER ){Log.d("SensorEventQueue","x = " + values[0] + ",y = " + values[1] + ",z = " + values[2]);if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {float tmp;tmp = values[0];values[0] = values[1];values[1] = -tmp;}}//add end}

以上修改可使OrientationEventListener的竖屏方向返回的orientation=0(原本的orientation=90),从而使App可以拿到正确的Gsensor方向。

重力传感器(一)——监听数据相关推荐

  1. 安卓传感器全解:注册、注销传感器、监听传感器,距离传感器、方向传感器、陀螺仪、加速计、磁场、气压传感器

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓传感器全解:注册.注销传感器.监听传感器.距离传感器.方向传感器.陀螺仪.加速计.磁场.气压传感器. 注册.注销.监听传感器 1.自定义传感器监听 ...

  2. js给php注册网页添加实时监听,js 实现watch监听数据变化的代码

    1.js /** * @desc 属性改变监听,属性被set时出发watch的方法,类似vue的watch * @author Jason * @study https://www.jianshu.c ...

  3. 微信小程序,实现 watch 属性,监听数据变化

    转自微信小程序,实现 watch 属性,监听数据变化 目标 在微信小程序实现 watch 属性,监听 data 中的属性,当被监听属性的值改变时,执行我们指定的方法.​​ 思路 Vue 的 compu ...

  4. linux 监听数据包,linux下网络监听与发送数据包的方法(即libpcap、libnet两种类库的使用方法)...

    linux下可以用libpcap函数库实现监听数据包,使用libnet 函数库发送数据包 安装: 在命令行下apt-get install 就可以了 libpcap的使用: /*author hjj ...

  5. vue,watch监听数据,数据监听

    vue,watch监听数据,数据监听 三个值: 1.第一个handler:其值是一个回调函数.即监听到变化时应该执行的函数. 2.第二个是deep:其值是true或false:确认是否深入监听.(一般 ...

  6. JavaWeb项目监听数据表变化并通知前台(数据来源于自身)

    最近公司有些项目中需要java程序去监听数据表,当数据有变化时把新数据通知前台并且展示出来.本人也去百度上查询了好多相关知识(本意是有现成抄的就直接抄,哈哈,但无奈没有),然后根据自己的理解写了个de ...

  7. 微信小程序实现watch监听数据变化

    起因:众所周知,微信小程序的数据监听器observers只能在自定义组件中使用,如果想要在页面中实现类似的功能,就只有通过其他的方法.其一就是通过模拟vue的watch来监听数据变化. 实现如下: 1 ...

  8. 将 Flutter 应用程序连接到 BLE 设备并监听数据

    什么是低功耗蓝牙? 它是诺基亚于 2006 年创建的一种无线传输技术,是一种基于蓝牙的开放标准 [1].低功耗蓝牙 (BLE)提供 API,应用程序可以使用这些 API 来发现设备.查询服务和传输信息 ...

  9. vue之 watch 监听数据变化 watch的使用、watch监听数据加载完成后执行、watch不触发、不生效的解决办法及原理

    常用方法: watch监听数据完成后执行函数: watch: {huxing: {handler: function(newVal, oldVal) {this.huxingW();},deep: t ...

  10. curator 监听数据节点子节点的变化情况

    文章目录 PathChildrenCache API PathChildrenCache NodeCache不仅可以监听节点内容变化,还可以监听指定节点是否存在.如果原本节点不存在,那么Cache就会 ...

最新文章

  1. 网站架构探索(2)-CDN基本常识 王泽宾
  2. css text top,text-align属性(css中文本对齐属性)
  3. pyhton/Perl设置 sublime text2
  4. quartus管脚分配后需要保存吗_掉电保存数据到EEPROM
  5. [C语言] va_start和va_end详解
  6. flex 解析json文件_使用 Python 处理 JSON 格式的数据 | Linux 中国
  7. linux 切换root_Linux运维服务篇:流量监控工具iftop部署及详细参数分享
  8. 使用IntelliJ IDEA 15和Maven创建Java Web项目(转)
  9. virtualbox中windows虚拟机安装增强功能
  10. 吉林大学计算机高级程序设计笔记
  11. go grpc 异步_dubbogo 3.0:牵手 gRPC 走向云原生时代
  12. Visual Studio 2019安装MFC开发工具包
  13. CISP-PTE考试介绍
  14. excel柱状图粗细怎么调_【EXCEL图表当中的柱状图怎么加粗,太细了。】excle柱状图怎么调整...
  15. c语言flag,[求助]int flag的意思
  16. '什么意思 怎么输入
  17. 微信小程序微信授权登录,使用getPhoneNumber()部分手机无法获取动态令牌code(Taro)
  18. wifi一到晚上服务器无响应,wifi到晚上网速很慢(为啥一到晚上网速就慢)
  19. JavaScript知识点复习总结
  20. BIGEMAP如何将高程数据转成南方CASS的DAT格式

热门文章

  1. 鸟哥私房菜-基础篇小笔记
  2. 【Bug】ubuntu下sougou输入法安装以及中文字词提示栏乱码解决
  3. Xilinx MIPI CSI-2 Receiver Subsystem IP详解
  4. 基于STAN的风力发电预测(Python代码实现)
  5. 【文献学习】Demodulation of Faded Wireless Signals using Deep Convolutional Neural Networks
  6. 6个Excel快速操作小技巧,早会早下班
  7. gitlab提交记录中authored显示为unknow怎么办?
  8. S3C2440的camera接口特性及WinCE 下的驱动
  9. 拨码开关记录(没用)
  10. 前端vue:节点、树以及虚拟 DOM