大多数主流的android手机都有内置的传感器,可以用来测方向,位置,环境。通常精确度都很高,应用的领域也自然很广泛。例如重力传感器,很多的游戏都需要靠它来操作,通过检测重力系统的变化很精确的反映到游戏操作中;又如微信的“摇一摇”靠加速度传感器来检测在不同方向的加速度来实现的,还有很多不是很常用的传感器,通过查看API大概找到如下的一些android系统中的传感器类型:
1.TYPE_ACCELEROMETER:加速度传感器,单位是m/s²,测量应用于设备X、Y、Z轴上的加速度,又叫做G-sensor
2.TYPE_AMBIENT_TEMPERATURE:温度传感器,单位是℃,测量返回当前的温度。
3.TYPE_GRAVITY:重力传感器,单位是m/s²,测量应用于设备X、Y、Z轴上的重力,也叫GV-sensor,地球上的数值是9.8m/s²,也可以设置其他星球(呃,目测平时用不到吧)
4.TYPE_GYROSCOPE:陀螺仪传感器,单位是rad/s,测量设备x、y、z三轴的角加速度数据。
5.TYPE_LIGHT:光线感应传感器,单位lx,检测周围的光线强度,手机系统中主要是调节LCD亮度。
6.TYPE_LINEAR_ACCELERATION:线性加速度传感器,单位是m/s²,该传感器是获取加速度传感器去除重力的影响得到的数据。
7.TYPE_MAGNETIC_FIELD:磁力传感器,单位是uT(微特斯拉),测量设备周围三个物理轴(x,y,z)的磁场(个人不了解哪些App上有应用)。
8.TYPE_ORIENTATION:方向传感器,测量设备围绕三个物理轴(x,y,z)的旋转角度,API显示使用 SensorManager.getOrientation()替代掉了。
9.TYPE_PRESSURE:压力传感器,单位是hPa(百帕斯卡),返回当前环境下的压强。
10.TYPE_PROXIMITY:距离传感器,单位是cm,用来测量某个对象到屏幕的距离,可用于打电话时判断人耳到电话屏幕距离来进行关闭屏幕的省电功能。
11.TYPE_RELATIVE_HUMIDITY:湿度传感器,单位是%,来测量周围环境的相对湿度(估计很少设备有吧)。
12.TYPE_ROTATION_VECTOR:旋转矢量传感器,旋转矢量代表设备的方向,是一个将坐标轴和角度混合计算得到的数据(具体咋用不了解)。
13.TYPE_TEMPERATURE:温度传感器,新版本中被TYPE_AMBIENT_TEMPERATURE替换掉了。
目前应该还没有哪款设备拥有以上所有的传感器吧?大多数设备会有加速度传感器,重力传感器,光线传感器,距离传感器等,不同的设备配备的硬件也不同,当然模拟器上是无法使用传感器的,即使能也只是模拟,我们可以通过下面的方法自己检测一下手中的设备都包含哪些传感器:
package com.example.sensorlistdemo;
import java.util.List;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.widget.TextView;
public class MainA extends Activity {
private TextView txt;
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txt = (TextView) findViewById(R.id.txt);
// 从系统服务中获得传感器管理器
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 从传感器管理器中获得全部的传感器列表
List<Sensor> allSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
// 显示有多少个传感器
txt.setText("经检测该手机有" + allSensors.size() + "个传感器,他们分别是:\n");
// 显示每个传感器的具体信息
for (Sensor s : allSensors) {
String tempString = "\n" + " 设备名称:" + s.getName() + "\n"
+ " 设备版本:" + s.getVersion() + "\n" + " 供应商:"
+ s.getVendor() + "\n";
switch (s.getType()) {
case Sensor.TYPE_ACCELEROMETER:
txt.setText(txt.getText().toString() + s.getType()
+ " 加速度传感器accelerometer" + tempString);
break;
case Sensor.TYPE_AMBIENT_TEMPERATURE:
txt.setText(txt.getText().toString() + s.getType()
+ " 温度传感器temperature" + tempString);
break;
case Sensor.TYPE_GRAVITY:
txt.setText(txt.getText().toString() + s.getType()
+ " 重力传感器gravity" + tempString);
break;
case Sensor.TYPE_GYROSCOPE:
txt.setText(txt.getText().toString() + s.getType()
+ " 陀螺仪传感器gyroscope" + tempString);
break;
case Sensor.TYPE_LIGHT:
txt.setText(txt.getText().toString() + s.getType()
+ " 环境光线传感器light" + tempString);
break;
case Sensor.TYPE_LINEAR_ACCELERATION:
txt.setText(txt.getText().toString() + s.getType()
+ " 线性加速度传感器linear_accelerometer" + tempString);
break;
case Sensor.TYPE_MAGNETIC_FIELD:
txt.setText(txt.getText().toString() + s.getType()
+ " 电磁场传感器magnetic field" + tempString);
break;
case Sensor.TYPE_ORIENTATION:
txt.setText(txt.getText().toString() + s.getType()
+ " 方向传感器orientation" + tempString);
break;
case Sensor.TYPE_PRESSURE:
txt.setText(txt.getText().toString() + s.getType()
+ " 压力传感器pressure" + tempString);
break;
case Sensor.TYPE_PROXIMITY:
txt.setText(txt.getText().toString() + s.getType()
+ " 距离传感器proximity" + tempString);
break;
case Sensor.TYPE_RELATIVE_HUMIDITY:
txt.setText(txt.getText().toString() + s.getType()
+ " 湿度传感器relative_humidity" + tempString);
break;
case Sensor.TYPE_ROTATION_VECTOR:
txt.setText(txt.getText().toString() + s.getType()
+ " 旋转矢量传感器rotation_vector" + tempString);
break;
case Sensor.TYPE_TEMPERATURE:
txt.setText(txt.getText().toString() + s.getType()
+ " 温度传感器temperature" + tempString);
break;
default:
txt.setText(txt.getText().toString() + s.getType() + " 未知传感器"
+ tempString);
break;
}
}
}
}
以上代码在android4.0环境下编写的,可以获取到所有类型的传感器TYPE,经测试,我的破测试机只有如下三个传感器,比较悲剧的低端机: