Android硬件之传感器
传感器是Android重要的一部分,大多数设备都会支持某部分传感器。例如:方向传感器(电子罗盘)、重力传感器(狂野飙车,极品飞车、屏幕翻转等)
Android SDK 提供了 Android sensor framework 安卓传感器框架,可以用来访问当前Android设备内置的传感器。
所有常量在Sensor类中定义
1. TYPE_ACCELEROMETER : 加速传感器(硬件传感器)
2.
TYPE_AMBIENT_TEMPERATURE : 温度传感器
(硬件传感器),Android 4.0( API Level = 14)之后使用这个,在此之前使用的是TYPE_TEMPERATURE
3.
TYPE_GRAVITY :重力传感器
(硬件或软件传感器)
4.
TYPE_GYROSCOPE :陀螺仪传感器
(硬件传感器)
5.
TYPE_LIGHT :光线传感器
(硬件传感器)
6.
TYPE_LINEAR_ACCELERATION :线性加速传感器
(硬件或软件传感器)
7.
TYPE_MAGNETIC_FIELD :磁场传感器
(硬件传感器)
8.
TYPE_ORIENTATION :方向传感器
(软件传感器),数据来自重力和磁场传感器
9.
TYPE_PRESSURE:压力传感器
(硬件传感器)
10.
TYPE_PROXIMITY :临近传感器
(硬件传感器)
11.
TYPE_RELATIVE_HUMIDITY :湿度传感器
(硬件传感器)
12.
TYPE_ROTATION_VECTOR :旋转向量传感器
(硬件或软件传感器)
一些常用类:
- SensorManager :用于创建sensor service的实例。该类提供了许多用于访问和枚举传感器,注册和注销传感器监听的方法。还提供了与传感器精度、扫描频率、校正有关的常量。
- Sensor:提供了一些用户获取传感器技术参数的方法。如:版本、类型、生产商等。
- SensorEvent :系统使用该类创建传感器对象。该对象可以提供与传感器事件有关的信息。传感器事件对象包括的信息有原始的传感器回传数据、传感器类型、数据的精度以及触发事件的时间。
- SensorEventListener : 该接口包含两个回调方法,当传感器的回传值发生改变或者精度变化时,系统会调用这两个回调方法。
例子:获取本机所有的传感器
public class MainActivity extends AppCompatActivity {
private TextView tvSensors;
private SensorManager sensorManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvSensors = (TextView) findViewById(R.id.tvSensors);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
List sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
for (Sensor sensor : sensors)
{
tvSensors.append(sensor.getName() + "\n");
}
}
}
动作传感器
动作传感器包含5个:其中两个(加速传感器和陀螺仪传感器)是纯的硬件传感器。另外三个传感器(重力传感器、线性加速传感器和旋转向量传感器)可能是硬件传感器,也可能是软件传感器。
动作传感器对于检测设备的移动非常有用,例如:倾斜、震动、旋转、摆动等。这些通常也算做对用户输入的直接反应。(比如:在极品飞车中飙车,或者控制一个移动的小球什么的)
动作传感器会返回三个浮点数的值(通常为长度为3的数组返回),但是对于不同的传感器,这三个值的意义也不用。例如,对于加速传感器,会返回三个坐标轴的数据。对于陀螺仪传感器,会返回三个坐标轴的旋转角度。
例子:通过获取重力传感器和加速度传感器的值,动态监测X,Y,Z的返回值。
public class MainActivity extends AppCompatActivity implements SensorEventListener{
private TextView tvAccelerometer;
private SensorManager mSensorManager;
private float[] gravity = new float[3];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvAccelerometer = (TextView) findViewById(R.id.tvAccelerometer);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
}
//数据改变时需要重写的方法
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
switch (sensorEvent.sensor.getType())
{
case Sensor.TYPE_ACCELEROMETER: //加速度传感器
//因为受到重力所产生的影响
final float g = (float) 0.98;
gravity[0] = g * gravity[0] + ( 1 - g ) * sensorEvent.values[0];
gravity[1] = g * gravity[1] + ( 1 - g ) * sensorEvent.values[1];
gravity[2] = g * gravity[2] + ( 1 - g ) * sensorEvent.values[2];
//减去所受重力的影响
String accelermoeter = "加速度:\n" +
"X:" + (sensorEvent.values[0] - gravity[0])+ "\n" +
"Y:" + (sensorEvent.values[1] - gravity[1])+ "\n" +
"Z:" + (sensorEvent.values[2] - gravity[2])+ "\n" ;
tvAccelerometer.setText(accelermoeter); //此时可以看到真机上x,y,z的值,你移动就会在动态改变
break;
case Sensor.TYPE_GRAVITY:
gravity[0] = sensorEvent.values[0];
gravity[1] = sensorEvent.values[1];
gravity[2] = sensorEvent.values[2];
break;
}
}
//精度改变时需要重写的方法
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
//当显示或重新获取焦点时,注册传感器
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),
SensorManager.SENSOR_DELAY_FASTEST);
}
//当此Activity关闭或覆盖时,就不再结果此传感数据
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
}
位置传感器
Android提供了两个传感器用于确定设备的位置,这两个传感器是磁场传感器和方向传感器。
还有一个比较特殊的测量设备正面到某一个邻近物体距离的传感器(邻近传感器)。
磁场传感器和邻近传感器是基于硬件的传感器。大多数Android手机和平板都是有磁场传感器的。
邻近传感器在手机上比较常见,比如你的大脸接听电话的时候,离手机屏幕有多远,可以在贴近耳朵接听电话时完成某些工作。
方向传感器是基与软件的,该传感器的回传数据来自于加速度传感器和磁场传感器。
位置传感器对于确定设备在真是世界中的物理位置非常有用。例如,可以组合磁场传感器和加速度传感器测量设备相对于地磁北极的位置,还可以利用方向传感器确定当前设备相对于自身参照系的位置。
磁场传感器和方向传感器都返回三个值(SensorEvent.values),而邻近传感器只返回一个值。
方向传感器的三个值:
- SensorEvent.values[0]:绕着Z轴旋转的角度。如果Y轴正对着北方,该值是0,指向东方,该值是90,指向南方,该值是180,指向西方,该值是270。
- SensorEvent.values[1]:绕着X轴旋转的度数。当从Z轴正方向朝向Y轴正方向,该值为正值。反之,为负值。该值在 -180~180之间变动。
- SensorEvent.values[2]:绕着Y轴旋转的度数。当从Z轴正方向朝向X轴正方向,该值为正值。反之,为负值。该值在 -180~180之间变动。
邻近传感器的一个值:
SensorEvent.values[0]:手机正面距离邻近物理的距离(cm)
使用方法同上面的差不多:
mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),
SensorManager.SENSOR_DELAY_UI);
环境传感器
Android提供了4个传感器用于监测不同的外部环境。我们可以使用这些传感器监测周围。例如,可以监测周围空气的湿度、光线、空气的压强和温度。这4个传感器都是基于硬件的传感器。除了光线传感器外,其他3个传感器在普通的设备中比较少见。
所有的环境传感器都只有一个返回值。例如:温度传感器就返回摄氏度、压力传感器就返回压强值。
环境传感器很少受到其他因素的干扰。
光线的大约数值:
public static final float LIGHT =
120000.0f;
//最强的光线强度(沙漠地带什么的这种)
110000.0f;
//万里无云时的阳光直射强度
20000.0f;
//有阳光,但被云彩抵消了部分光线时的强度
10000.0f;
//多云时的光线强度
400.0f;
//太阳刚刚升起时日出的光线强度
100.0f;
//在阴雨天,没有太阳时的强度
0.25f;
//在夜晚有月亮时的光线强度
0.001f;
//在夜晚没有月亮时(漆黑一片没有路灯)的光线强度