目前android 从基本的WIFI, GPS, 到加速度感应器,应用无处不在。
。
传感器名称如下:
加速度传感器(accelerometer)
陀螺仪传感器(gyroscope)
环境光照传感器(light)
磁力传感器(magnetic field)
方向传感器(orientation)
压力传感器(pressure)
距离传感器(proximity)
温度传感器(temperature)
方向: SensorManager.SENSOR_ORIENTATION,
加速表: SensorManager.SENSOR_ACCELEROMETER
光线: SensorManager.SENSOR_LIGHT
磁场: SensorManager.SENSOR_MAGNETIC_FIELD
临近性: SensorManager.SENSOR_PROXIMITY
温度: SensorManager.SENSOR_TEMPERATURE
1.加速度传感器
加速度传感器可以感知内容有重力、手机的静态姿态以及运动方向等。第二,装有加速度传感器的手机屏幕会随着角度的不同智能旋转,手机中甩歌功能、微信中摇一摇都是利用它实现的。此外,游戏中也经常需要用到它,赛车中的漂移触发就是来源于此
2.陀螺仪传感器
是平衡传感器,一般那些开赛车的游戏左右晃手机就能控制方向,
3 加速度传感器
加速度传感器又叫G-sensor,返回x、y、z三轴的加速度数值。
该数值包含地心引力的影响,单位是m/s^2。
将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认9.81。
将手机朝下放在桌面上,z轴为-9.81。
将手机向左倾斜,x轴为正值。
将手机向右倾斜,x轴为负值。
将手机向上倾斜,y轴为负值。
将手机向下倾斜,y轴为正值。
加速度传感器可能是最为成熟的一种mems产品,市场上的加速度传感器种类很多。
手机中常用的加速度传感器有BOSCH(博世)的BMA系列,AMK的897X系列,ST的LIS3X系列等。
这些传感器一般提供±2G至±16G的加速度测量范围,采用I2C或SPI接口和MCU相连,数据精度小于16bit。
4 方向传感器
方向传感器简称为O-sensor,返回三轴的角度数据,方向数据的单位是角度。
为了得到精确的角度数据,E-compass需要获取G-sensor的数据,
经过计算生产O-sensor数据,否则只能获取水平方向的角度。
方向传感器提供三个数据,分别为azimuth、pitch和roll。
azimuth:方位,返回水平时磁北极和Y轴的夹角,范围为0°至360°。
0°=北,90°=东,180°=南,270°=西。
pitch:x轴和水平面的夹角,范围为-180°至180°。
当z轴向y轴转动时,角度为正值。
roll:y轴和水平面的夹角,由于历史原因,范围为-90°至90°。
当x轴向z轴移动时,角度为正值。
5 陀螺仪传感器
陀螺仪传感器叫做Gyro-sensor,返回x、y、z三轴的角加速度数据。
角加速度的单位是radians/second。
根据Nexus S手机实测:
水平逆时针旋转,Z轴为正。
水平逆时针旋转,z轴为负。
向左旋转,y轴为负。
向右旋转,y轴为正。
向上旋转,x轴为负。
向下旋转,x轴为正。
ST的L3G系列的陀螺仪传感器比较流行,iphone4和google的nexus s中使用该种传感器
6接近传感器
接近传感器检测物体与手机的距离,单位是厘米。
一些接近传感器只能返回远和近两个状态,
因此,接近传感器将最大距离返回远状态,小于最大距离返回近状态。
接近传感器可用于接听电话时自动关闭LCD屏幕以节省电量。
一些芯片集成了接近传感器和光线传感器两者功能。
7 重力传感器
重力传感器简称GV-sensor,输出重力数据。
在地球上,重力数值为9.8,单位是m/s^2。
坐标系统与加速度传感器相同。
当设备复位时,重力传感器的输出与加速度传感器相同。
android 提供的接口:
1.
//从系统服务中获得传感器管理器
24
SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
2.
26 | //从传感器管理器中获得全部的传感器列表 |
27 |
|
3.
//显示有多少个传感器
30 | tx1.setText( "经检测该手机有" + allSensors.size() + "个传感器,他们分别是:/n" ); |
4.
088 | // 获取传感器管理器 |
089 | SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); |
090 | // 获取加速度传感器 |
091 | Sensor acceleromererSensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); |
092 |
093 | // 定义传感器事件监听器 |
094 | SensorEventListener acceleromererListener = new SensorEventListener() { |
095 |
096 | @Override |
097 | public void onAccuracyChanged(Sensor sensor, int accuracy) { |
098 | //什么也不干 |
099 | } |
100 |
101 | //传感器数据变动事件 |
102 | @Override |
103 | public void onSensorChanged(SensorEvent event) { |
104 |
105 | //如果没有开始录音的话可以监听是否有摇动事件,如果有摇动事件可以开始录音 |
106 | if (!isRecoding){ |
107 | //获取加速度传感器的三个参数 |
108 | float x = event.values[SensorManager.DATA_X]; |
109 | float y = event.values[SensorManager.DATA_Y]; |
110 | float z = event.values[SensorManager.DATA_Z]; |
111 |
112 | //获取当前时刻的毫秒数 |
113 | curTime = System.currentTimeMillis(); |
114 |
115 | //100毫秒检测一次 |
116 | if ((curTime - lastTime) > 100 ) { |
117 |
118 | duration = (curTime - lastTime); |
119 |
120 | // 看是不是刚开始晃动 |
121 | if (last_x == 0 .0f && last_y == 0 .0f && last_z == 0 .0f) { |
122 | //last_x、last_y、last_z同时为0时,表示刚刚开始记录 |
123 | initTime = System.currentTimeMillis(); |
124 | } else { |
125 | // 单次晃动幅度 |
126 | shake = (Math.abs(x - last_x) + Math.abs(y - last_y) + Math.abs(z - last_z)) / duration * 100 ; |
127 | } |
128 |
129 | //把每次的晃动幅度相加,得到总体晃动幅度 |
130 | totalShake += shake; |
131 |
132 | // 判断是否为摇动,这是我自己写的标准,不准确,只是用来做教学示例,别误会了^_^ |
133 | if (totalShake > 10 && totalShake / (curTime - initTime) * 1000 > 10 ) { |
134 | startRecord(); |
135 | initShake(); |
136 | } |
137 |
138 | tx1.setText( "总体晃动幅度=" +totalShake+ "/n平均晃动幅度=" +totalShake / (curTime - initTime) * 1000 ); |
139 | } |
140 |
141 | last_x = x; |
142 | last_y = y; |
143 | last_z = z; |
144 | lastTime = curTime; |
145 | } |
146 | } |
147 |
148 | }; |
149 |
150 | //在传感器管理器中注册监听器 |
151 | sm.registerListener(acceleromererListener, acceleromererSensor, SensorManager.SENSOR_DELAY_NORMAL); |
152 |
153 | } |