`
mzqthu
  • 浏览: 76028 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android中传感器的应用

阅读更多

 

googleandroid一共提供了14种传感器。下面我就根据官方的reference以及API指南,将所有的传感器做一介绍,并附上代码例子。

大部分Android平台的设备都带有多个传感器,使你能监视其方位和运动状态的变化。 很多设备还有其它类型的传感器,让你能感知周围的环境条件,比如温度、压力、湿度和光线。 你可以利用Android的传感器框架访问这些传感器,并获取原始的传感器数据。

传感器框架提供了丰富的类和接口,能帮助你完成很多与传感器有关的工作。Android传感器框架能让你访问很多类型的传感器。有些是基于硬件的,有些则是基于软件的。 基于硬件的传感器是内置于手持或桌面设备中的物理部件。它们直接测量环境参数并发送数据,比如加速度、地磁强度、角速度等。 基于软件的传感器则没有物理设备,虽然它们也是模仿硬件传感器。基于软件的传感器数据是来自一个或多个硬件传感器,有时也被称为虚拟传感器或合成传感器。 线性加速度传感器和重力传感器就是基于软件的传感器。

传感器类型很多,能够拥有全部类型传感器的Android设备非常少见。比如,大部分手持设备和桌面设备都带有加速度和磁力传感器,但带气压计和温度计的设备就少得多了。 而且,在一台设备上某类传感器的数量也可以有多个。比如,一台设备可以带有两个重力传感器,每个传感器的量程各不相同。

传感器依照其测量类型的不通,被分为三种类型,移动型传感器(motion sensor)、位置型传感器(position sensor)以及环境型传感器(environment sensor)。

Android平台提供了5个能够监视设备移动的传感器。包括:加速度传感器、重力传感器、陀螺仪传感器、旋转矢量传感器、线性加速度传感器。其中的两个是基于硬件的(加速度传感器和陀螺仪),有三个传感器既可以是基于硬件的,也可以是基于软件的(重力传感器、线性加速度传感器和旋转矢量传感器)。例如,在某些基于软件传感器的设备上会从加速度传感器和磁力仪中提取它们的数据,但是在其他的设备上,它们也可以使用陀螺仪来提取数据。大多数Android设备都有加速度传感器和陀螺仪。基于软件的传感器的有效性是可变的,因为它们要依赖一个或多个硬件传感器来提取对应的数据。

移动传感器用于监视设备的移动,如:倾斜、振动、旋转或摆动。移动通常是直接的用户输入的反映(如,用户在游戏中操作汽车或控制一个球),但也能够是设备所处的物理环境的反映(如,驾驶汽车时的位置移动)。在第一种场景中,你要相对于设备的参照系或应用程序的参照系来监视设备的移动,在第二种场景中,你要相对于全球参照系来监视设备的移动。通常,移动传感器本身并不用于监视设备的位置,但它们能够跟其他传感器一起来使用,例如跟地磁传感器一起来判断设备相对于全球参照系统的的位置。

Android平台提供了两种用于判断设备位置的传感器:地磁场传感器和方向传感器,还提供一种判断设备的面板是否接近一个对象的传感器(即距离传感器)。地磁场传感器和距离传感器是基于硬件的。大多数手持设备和平板电脑制造商都在其设备中包含了一个地磁场传感器。同样手持设备制造商也他们的设备中包含一个距离传感器,用于判断手持设备是否靠近人脸(如,在电话呼叫期间)。方向传感器是基于软件的,并且要从加速度传感器和地磁场传感器来获取数据。

对于判断设备在全球参照系中的物理位置,位置传感器是有益的。例如,使用地磁场传感器跟加速度传感器的组合来判断设备相对于磁场北极的位置。也能够使用方向传感器(或类似于基于传感器的方位方法)来判断设备在你的应用程序的参照系统中的位置。通常,位置传感器不用于监视设备的移动或手势,如振动、倾斜或推动(更多的信息,请看Motion Sensors)。 地磁场传感器和方向传感器用SensorEvent来返回传感器值的多维数组。例如,在一个单独的传感器事件期间,方向传感器的三个坐标中每一个都提供了地磁场的强度值。同样,方向传感器在一个传感器事件期间提供了方位角(旋角)、倾斜度和晃动值。值得一提的是,方向传感器现在已经过时了,现在获取方向可以使用getOrientation()方法进行替代。

Android 平台提供了四种用于监测环境参数的传感器。你可以用这些传感器来监测 Android 设备周边环境的湿度、光照度、气压和气温。 这四种传感器都是基于硬件的,当然需要制造商置入设备时才能使用。 除了制造商用于控制屏幕亮度的光线传感器以外,其它环境传感器都不一定会内置于设备中的。 因此,在试图读取数据之前,实时验证传感器的存在性尤为重要。

与大部分运动和位置传感器返回多维数组数据不同,环境传感器在 SensorEvent 事件中返回的是单个值。比如,温度单位就是 °C,气压单位就是 hPa 而且,也不像运动和方位传感器那样常常需要高通和低通滤波处理,环境传感器一般不需要进行任何数据过滤或处理。

 

下面就各种类型传感器进行详细讲解。

<!--[if !supportLists]-->(1)       <!--[endif]-->加速度传感器  #define SENSOR_TYPE_ACCELEROMETER

加速度传感器又叫G-sensor,返回xyz三轴的加速度数值。该数值包含地心引力的影响,单位是m/s^2。将手机平放在桌面上,x轴默认为0y轴默认0z轴默认9.81

加速度传感器使用标准的传感器器坐标系统。在实践中,当设备以它自然的方向被平方在桌面时,下列条件是适用的: 

1. 如果在左边推动设备(让它向右移动),那么X轴的加速度值就是正值;

2. 如果在底部推动设备(让它向上移动),那么Y轴的加速度值就是正值; 

3. 如果向着天空,用A m/s2 的加速度来推动设备,那么Z轴的加速度值就是A+9.81,它

对应了设备的加速度(+A m/s2)减去重力作用(-9.81 m/s2)。 

4. 静止的设备的有一个+9.81的加速度值,它对应设备的加速度(0 m/s2减去重力作用,也

就是-9.81 m/s2)。 

通常,加速度传感器是一种用于监视设备移动的比较好的传感器。几乎每种Android手持设备和平板电脑都有加速度传感器,而且它的能耗要比其他的移动传感器要低10倍。唯一的缺点是,你要实现低通和高通滤波来消除重力作用和减少噪音的影响。

使用传感器时:

首先要定义: private Sensor myaccelerometer;

                  private SensorManager myManager;

这是一个传感器类型和一个传感器控制类型。

然后要获取服务

myManager = (SensorManager)getSystemService(SENSOR_SERVICE);

以及获取传感器对象

myaccelerometer = myManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

然后需要声明一个SensorEventListener 对象用于侦听Sensor 事件,重载public void onSensorChanged(SensorEvent event)方法

最后是要对SensorService进行注册,在不用时销毁注册。

 

示例代码如下:

public class Sensor1 extends Activity{

private Sensor myaccelerometer;

private SensorManager myManager;

private TextView myTextView;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.sensor1);

 

myTextView = (TextView)findViewById(R.id.textView3);

 

myManager = (SensorManager)getSystemService(SENSOR_SERVICE);

myaccelerometer = myManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

 

xyzpre[0] = 0;

xyzpre[1] = 0;

xyzpre[2] = 0;

}

 

private float xyz[] = new float[3];

private float xyzpre[] = new float[3];

 

private class Mysensorlistener implements SensorEventListener{

 

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

// TODO Auto-generated method stub

}

int temp=0;

@Override

public void onSensorChanged(SensorEvent event) {

// TODO Auto-generated method stub

temp++;

if(temp == 10)

{

xyz[0] = event.values[0]-xyzpre[0];

xyz[1] = event.values[1]-xyzpre[1];

xyz[2] = event.values[2]-xyzpre[2];

 

xyzpre[0] = event.values[0];

xyzpre[1] = event.values[1];

xyzpre[2] = event.values[2];

 

if(xyz[0] > 3.5){

 

}

 

temp = 0;

}

myTextView.setText("x:"+xyz[0]+"\n"+"y:"+xyz[1]+"\n"+"z:"+xyz[2]);

 

}

}

Mysensorlistener Mylistener = new Mysensorlistener();

 

@Override

protected void onResume() {

// TODO Auto-generated method stub

super.onResume();

 

myManager.registerListener(Mylistener, myaccelerometer,(int) 10e17);

 

}

@Override

protected void onPause() {

// TODO Auto-generated method stub

myManager.unregisterListener(Mylistener);

 

super.onPause();

}

 

<!--[if !supportLists]-->(2)       <!--[endif]-->旋转矢量传感器 #define SENSOR_TYPE_ROTATION_VECTOR

旋转矢量传感器简称RV-sensor。旋转矢量代表设备的方向,是角度和坐标轴的一个组合,通过一个角θ绕着坐标轴旋转得到。

RV-sensor输出:<x*sin(θ/2),y*sin(θ/2),z*sin(θ/2)>

sin(θ/2)RV的数量级。

RV的方向与轴旋转的方向相同。

RV的三个数值,与cos(theta/2)组成一个四元组。

RV的数据没有单位,xyz使用的坐标系与加速度相同。

参考坐标系是一个直接的标准正交基。其中:

<!--[if !supportLists]-->l  <!--[endif]-->X定义为由YZ产生,这是切向于设备的当前位置所在的地面,大致指向东。

<!--[if !supportLists]-->l  <!--[endif]-->Y是切线向于设备的当前位置的地面指向磁北极。

<!--[if !supportLists]-->l  <!--[endif]-->Z轴指向天空垂直于地面。

传感器返回五个值为:

values[0]: x*sin(θ/2)

values[1]: y*sin(θ/2)

values[2]: z*sin(θ/2)

values[3]: cos(θ/2)

values[4]: estimated heading Accuracy (in 弧度) (-1 if unavailable)

下列代码显示了如何获取默认的旋转矢量传感器的实例:

privateSensorManager mSensorManager;

privateSensor mSensor;..

.mSensorManager =(SensorManager) getSystemService(Context.SENSOR_SERVICE);

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);

 

对于移动检测和监视,旋转矢量传感器和重力传感器是使用频率最高的传感器。旋转矢量传感器尤其灵活,可广泛的应用于移动相关的任务,如,检测手势、监视角度变化、监视相对的方向变化等。例如:如果你正在开发一款使用2维或3维罗盘来增强现实感游戏,或增强相机的稳定性的应用程序,那么旋转矢量传感器是非常理想的选择。在大多场景中,使用这些传感器比使用加速度传感器和地磁传感器或方向传感器要好。

 

<!--[if !supportLists]-->(3)       <!--[endif]-->未校准的旋转矢量传感器 #define SENSOR_TYPE_GAME_ROTATION_VECTOR 

此传感器除了未使用地磁场以外,和ROTATION_VECTOR是一样的。因此它的Y轴并不指向北,而是指向其他参照,这个参照允许与陀螺仪绕漂移是同一数量级的,漂移是围绕Z轴的。

在理想情况下,一个电话旋转和回到同样的现实世界的方位应该报告相同的游戏旋转矢量(不使用地球磁场)。然而,定位可能随时间有些漂移。

这个传感器不存在value[4]这个值。

 

<!--[if !supportLists]-->(4)       <!--[endif]-->陀螺仪传感器  #define SENSOR_TYPE_GYROSCOPE

陀螺仪传感器叫做Gyro-sensor,返回xyz三轴的角速度数据。陀螺仪以rad/s(弧度/每秒)为单位围绕设备的XYZ轴来测量速率或旋转角度。下列代码显示了如何获取一个默认的陀螺仪的实例: 

private SensorManager mSensorManager; private Sensor mSensor; ... 

mSensorManager = (SensorManager) 

getSystemService(Context.SENSOR_SERVICE); 

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); 

该传感器的坐标系统与加速度传感器所使用的坐标系统是相同的。逆时针方向旋转是正值,也就是说,如果设备是逆时针旋转,那么观察者就会看到一些有关以设备原点为中心的正向的XYZ轴的位置。这是标准的正向旋转的数学定义,并且与方向传感器所使用的用于滚动的定义不同。

根据Nexus S手机实测:

水平逆时针旋转,Z轴为正。

水平顺时针旋转,z轴为负。

向左旋转,y轴为负。

向右旋转,y轴为正。(待商榷,实测为准,自己测试一下)

向上旋转,x轴为负。

向下旋转,x轴为正。

通常,陀螺仪的输出会被集成到时间上,以便计算在一定时间步长之上旋转角度的变化

示例:

// Create a constant to convert nanoseconds to seconds.
private static final float NS2S = 1.0f / 1000000000.0f;
private final float[] deltaRotationVector = new float[4]();
private float timestamp;

public void onSensorChanged(SensorEvent event) {
  // This timestep's delta rotation to be multiplied by the current rotation
  // after computing it from the gyro sample data.
  if (timestamp != 0) {
    final float dT = (event.timestamp - timestamp) * NS2S;
    // Axis of the rotation sample, not normalized yet.
    float axisX = event.values[0];
    float axisY = event.values[1];
    float axisZ = event.values[2];

    // Calculate the angular speed of the sample
    float omegaMagnitude = sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ);

    // Normalize the rotation vector if it's big enough to get the axis
    // (that is, EPSILON should represent your maximum allowable margin of error)
    if (omegaMagnitude > EPSILON) {
      axisX /= omegaMagnitude;
      axisY /= omegaMagnitude;
      axisZ /= omegaMagnitude;
    }

    // Integrate around this axis with the angular speed by the timestep
    // in order to get a delta rotation from this sample over the timestep
    // We will convert this axis-angle representation of the delta rotation
    // into a quaternion before turning it into the rotation matrix.
    float thetaOverTwo = omegaMagnitude * dT / 2.0f;
    float sinThetaOverTwo = sin(thetaOverTwo);
    float cosThetaOverTwo = cos(thetaOverTwo);
    deltaRotationVector[0] = sinThetaOverTwo * axisX;
    deltaRotationVector[1] = sinThetaOverTwo * axisY;
    deltaRotationVector[2] = sinThetaOverTwo * axisZ;
    deltaRotationVector[3] = cosThetaOverTwo;
  }
  timestamp = event.timestamp;
  float[] deltaRotationMatrix = new float[9];
  SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector);
    // User code should concatenate the delta rotation we computed with the current rotation
    // in order to get the updated rotation.
    // rotationCurrent = rotationCurrent * deltaRotationMatrix;
   }
}

标准的陀螺仪提供了原始的旋转数据,并不带有任何过滤或噪音和漂移(偏心)的校正。在实践中,陀螺仪的噪音和漂移会引入错误,因此需要对此进行抵消处理。通常通过监视其他传感器,如重力传感器或加速度传感器来判断漂移(偏心)和噪音。

 

<!--[if !supportLists]-->(5)       <!--[endif]-->重力传感器  #define SENSOR_TYPE_GRAVITY

重力传感器简称GV-sensor,输出重力数据。在地球上,重力数值为9.8,单位是m/s^2。坐标系统与加速度传感器相同。

假设当地的重力加速度值为g x=y=0 时,手机处于水平放置状态。 

     当手机正面朝上的时候,z的值为q,反面朝上的时候,z的值为-g

     当手机右侧面朝上的时候,x的值为g,左侧面朝上的时候,x的值为-g

     当手机上侧面朝上的时候,y的值为g,下侧面朝上的时候,y的值为-g

重力传感器和加速度传感器非常类似,在某些时候并无差别。根据reference上的说法,重力传感器显示的是xyz轴三个方向上的重力加速度。当设备休息时,重力传感器的输出和加速度传感器一样。

使用方法和加速度传感器一样。

首先定义SensorManagerSensor对象,然后开启服务,然后设置监听器,重写onSensorChanged()方法。然后对传感器进行register就可以进行使用了。示例如下:

private SensorManager sm = null;

private Sensor gravity_sensor = null;

sm = (SensorManager)getSystemService(SENSOR_SERVICE);

gravity_sensor = sm.getDefaultSensor(Sensor.TYPE_GRAVITY);

 private class Mysensorlistener implements SensorEventListener{

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

// TODO Auto-generated method stub

 

}

@Override

public void onSensorChanged(SensorEvent event) {

// TODO Auto-generated method stub

 

}

}

Mysensorlistener Mylistener = new Mysensorlistener();

@Override

protected void onResume() {

// TODO Auto-generated method stub

super.onResume();

sm.registerListener(Mylistener, gravity_sensor,(int) 10e17);

}

@Override

protected void onPause() {

// TODO Auto-generated method stub

sm.unregisterListener(Mylistener);

super.onPause();

 

}

 

<!--[if !supportLists]-->(6)       <!--[endif]-->线性加速度传感器  #define SENSOR_TYPE_LINEAR_ACCELERATION

线性加速度传感器简称LA-sensor。线性加速度传感器是加速度传感器减去重力影响获取的数据。单位是m/s^2,坐标系统与加速度传感器相同。

加速度传感器、重力传感器和线性加速度传感器的计算公式如下:

加速度 = 重力 + 线性加速度

下列代码显示了如何获取默认的线性加速度传感器的实例: 

private SensorManager mSensorManager; 

private Sensor mSensor; 

... 

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION); 

通常,在想要获取没有重力影响的加速度数据时,使用这种传感器。例如,你能够使用这种传感器来看你的汽车运行速度。线性加速度传感器始终有一个偏移量,你需要删除这个偏移量。做这件事的最简单的方法就是在你的应用程序中建立一个校准处理。在校准期间,你能够要求用户把设备放到桌面上,读取所有三轴的偏移量,然后从加速度传感器中读取的数据中直接减去对应的偏移量,来获取线性加速度。

 

<!--[if !supportLists]-->(7)       <!--[endif]-->地磁场传感器  #define SENSOR_TYPE_MAGNETIC_FIELD

磁力传感器简称为M-sensor,返回xyz三轴的环境磁场数据。该数值的单位是微特斯拉(micro-Tesla),用uT表示。单位也可以是高斯(Gauss),1Tesla=10000Gauss

地磁场传感器让你能够监视地球磁场的变化。下列代码显示了如何获取默认地磁场传感器实例: 

private SensorManager mSensorManager; 

private Sensor mSensor; 

... 

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 

传感器分别提供三个坐标轴方向的原始磁场强度数据(以μT为单位)。通常,你不需要直接使用这种传感器。相反,你能够使用旋转矢量传感器来判断原始的旋转运动,或者使用加速度传感器和地磁场传感器跟getRotationMatrix()方法的组合来获取旋转矩阵和倾斜矩阵。然后使用这些矩阵和getOrientation()getInclination()方法来获取方位角和磁场倾角数据。

 

<!--[if !supportLists]-->(8)       <!--[endif]-->方向传感器(现已被弃用  #define SENSOR_TYPE_ORIENTATION

方向传感器简称为O-sensor,返回三轴的角度数据,方向数据的单位是角度。

方向传感器会相对与地球参照系来监视设备的位置(特别是北极)。以下代码显示了如何获取默认的方向传感器的实例: 

private SensorManager mSensorManager; 

private Sensor mSensor;

 ... 

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

通过使用设备的地磁场传感器跟加速度传感器的组合来获取方向传感器的数据。使用这两个硬件传感器,方向传感器能够提供以下三个维度的数据: 

1. 方位角(围绕Z轴的旋转角度)。这是被和设备Y轴之间的角度。例如,如果设备的Y轴方向与北极一致,这该值是0,如果设备的Y轴指向南方,则该值是180。同样,当Y轴指向东方时,该值是90;指向西方时,该值是270 

2. 倾斜角(围绕X轴的旋转角度)。当正方向的Z轴向着正向的Y轴旋转时,该值是正值,

当正方向的Z轴向着负方向的Y轴旋转时,该值是负值。它的取值范围是180度到-180

度之间。 

3. 转角(围绕Y轴旋转的角度)。当正方向的Z轴向着正向的X轴旋转时,该值是正值,

当正方向的Z轴向着负方向的X轴旋转时,该值是负值。它的取值范围是90度到-90度之间。 

这种定义有别与航空领域的偏航、倾斜和滚动,飞行器的X轴是飞机的长边(从尾部到头部)。另外,由于历史原因,顺时针方向的转角是正值(从数学的角度,逆时针方向应该是正值)。

方向传感器通过处理来自加速度传感器和地磁场传感器的原始数据来获取它的数据。因为要涉及到重力处理,所以方向传感器的精度和准确度会受到影响(特别是,这种传感器只在转角部分是0的时候才是可信赖的)。因为这种原因,在Android2.2API Level 8)中弃用了这种传感器。使用来自方向传感器的原始数据来替代,我们推荐使用getRotationMatrix()方法跟getOrientation()方法相结合来计算方向值。你还能够使用remapCoordinateSystem()方法把方向值转换成你的应用程序的参照坐标系。

 

<!--[if !supportLists]-->(9)       <!--[endif]-->接近传感器(距离传感器) #define SENSOR_TYPE_PROXIMITY

接近传感器检测物体与手机的距离,单位是厘米。一些接近传感器只能返回远和近两个状态,因此,某些接近传感器将大于最大距离返回远状态,小于最大距离返回近状态。

接近传感器可用于接听电话时自动关闭LCD屏幕以节省电量。

一些芯片集成了接近传感器和光线传感器两者功能。

距离传感器会让你判断一个对象距离设备有多远。下列代码显示了如何获取默认的距离传感器的实例: 

private SensorManager mSensorManager; 

private Sensor mSensor; 

... 

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); 

通常,距离传感器用于判断人的头部距离手持设备面板有多远(例如,用户拨打或接听电话时)。大多数距离传感器会返回一个绝对距离(以厘米cm为单位),但是某些只返回接近和远离的值。下列代码显示了如何使用距离传感器: 

public class SensorActivity extends Activity implements SensorEventListener { 

  private SensorManager mSensorManager;   private Sensor mProximity;  

  @Override 

  public final void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);  

    // Get an instance of the sensor service, and use that to get an instance of 

    // a particular sensor. 

    mSensorManager = (SensorManager) 

getSystemService(Context.SENSOR_SERVICE);     mProximity = 

mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);   }  

  @Override 

  public final void onAccuracyChanged(Sensor sensor, int accuracy) {     // Do something here if sensor accuracy changes.   }  

  @Override 

  public final void onSensorChanged(SensorEvent event) {     float distance = event.values[0]; 

    // Do something with this sensor data.   }  

  @Override 

  protected void onResume() { 

    // Register a listener for the sensor. 

    super.onResume(); 

    mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);   }  

  @Override 

  protected void onPause() { 

    // Be sure to unregister the sensor when the activity pauses.     super.onPause(); 

    mSensorManager.unregisterListener(this);   } } 

注意:某些距离传感器返回代表接近远离的二进制值。在这个实例中,通常传感器在远离状态中报告最大范围的值,在接近状态中报告较小的值。典型的远离值是>5cm,但不同的传感器也会有所不同。通过使用getMaximumRange()方法来判断传感器的最大范围。

 

<!--[if !supportLists]-->(10)   <!--[endif]-->环境温度传感器  #define SENSOR_TYPE_AMBIENT_TEMPERATURE

此传感器返回设备所处环境的温度,单位是摄氏度。

 

示例如下:

public class Sensor3 extends Activity{

private TextView text1 = null;

private Sensor envtemp_sensor = null;

private SensorManager envtemp_sm = null;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.sensor3);

 

text1 = (TextView)findViewById(R.id.textView3);

envtemp_sm = (SensorManager)getSystemService(SENSOR_SERVICE);

envtemp_sensor = envtemp_sm.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);

if(envtemp_sensor == null){

text1.setText("此机器不存在此传感器!");

}

}

 

private class Mysensorlistener implements SensorEventListener{

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

// TODO Auto-generated method stub

 

}

 

@Override

public void onSensorChanged(SensorEvent event) {

// TODO Auto-generated method stub

text1.setText("当前环境温度是"+event.values[0]+"");

}

 

}

 

Mysensorlistener mylistener = new Mysensorlistener();

 

@Override

protected void onPause() {

// TODO Auto-generated method stub

envtemp_sm.unregisterListener(mylistener);

super.onPause();

}

 

@Override

protected void onResume() {

// TODO Auto-generated method stub

envtemp_sm.registerListener(mylistener, envtemp_sensor, SensorManager.SENSOR_DELAY_NORMAL);

super.onResume();

}

 }

 

<!--[if !supportLists]-->(11)   <!--[endif]-->光线感应 #define SENSOR_TYPE_LIGHT

光线感应传感器检测实时的光线强度,光强单位是lux,其物理意义是照射到单位面积上的光通量。

光线感应传感器主要用于Android系统的LCD自动亮度功能。

<!--[if !supportLists]-->(12)   <!--[endif]-->压力 #define SENSOR_TYPE_PRESSURE

     压力传感器返回当前的压强,单位是百帕斯卡hectopascalhPa)。

<!--[if !supportLists]-->(13)   <!--[endif]-->温度 #define SENSOR_TYPE_TEMPERATURE现也已经弃用。

温度传感器返回当前设备的温度。

 

从光线、气压、温度传感器读取的原始数据通常不需要校准、过滤和修正,这使它们列入了最易使用的传感器之中。要从这些传感器中获取数据,你首先要创建 SensorManager 类的一个实例,以便进一步获取某个物理传感器的实例。然后在其 onResume() 方法中注册一个传感器侦听器,并在侦听器的 onSensorChanged() 回调方法中对接收到的传感器数据进行处理。以下代码展示了这些步骤:

public class SensorActivity extends Activity implements SensorEventListener {
  private SensorManager mSensorManager;
  private Sensor mPressure;

  @Override
  public final void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //
获取一个传感器服务的实例,用于获取某传感器的一个实例
    mSensorManager =n">= (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mPressure = mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
  }

  @Override
  public final void onAccuracyChanged(Sensor sensor, int accuracy) {
    // Do something here if sensor accuracy changes.
  }

  @Override
  public final void onSensorChanged(SensorEvent event) {
    float millibars_of_pressure = event.values[0];    //
利用这些数据执行一些工作
  }

  @Overrideride
  protected void onResume() {    //
注册一个传感器侦听器
    super.n">.onResume();
    mSensorManager.registerListener(this, mPressure, SensorManager.SENSOR_DELAY_NORMAL);
  }

  @Override
  protected void onPause() {    //
请确保 activity 暂停时注销传感器
    super.n">.onPause();
    mSensorManager.unregisterListener(this);
  }
}

你必须确保同时实现 onAccuracyChanged() onSensorChanged() 回调方法并且确保在activity 暂停时注销传感器以防止传感器持续工作而耗尽电力。

 

<!--[if !supportLists]-->(14)   <!--[endif]-->湿度传感器 #define SENSOR_TYPE_RELATIVE_HUMIDITY

与使用光线、压力和温度传感器的方法相同,通过使用湿度传感器,你能够获取原始的相对湿度数据。但是,如果一个设备上同时湿度传感器(TYPE_RELATIVE_HUMIDITY)和温度传感器(TYPE_AMBIENT_TEMPERATURE),那么你就能够使用这两个数据流来计算露点和绝对湿度。

露点

露点是给定体积的气体在恒定的大气压力下,水蒸汽由气体转换成水的温度,下列代码显示了如何计算露点的公式:

                        ln(RH/100%) + m·t/(Tn+t)
td(t,RH) = Tn
 · ------------------------------------
                        m - [ln(RH/100%) + m·t/(Tn+t)]

这里:

td = 结露点温度,单位是摄氏度 C

t = 当前温度,单位是摄氏度 C

RH = 当前相对湿度,单位是百分比 (%)

m = 17.62

Tn = 243.12

绝对湿度

绝对湿度是在一定体积的干燥空气中含有的水蒸气的质量。绝对湿度的计量单位是克/立方米。以下给出了计算绝对湿度的公式:

                          (RH/100%) · A · exp(m·t/(Tn+t)
dv(t,RH) = 216.7 · --------------------------------------
                          273.15 + t

这里:

dv = 绝对湿度,单位是克/立方米

t = 当前温度,单位是摄氏度 C

RH = 当前相对湿度,单位是百分比 (%)

m = 17.62

Tn = 243.12 C

A = 6.112 hPa

 

参考:

<!--[if !supportLists]-->1.       <!--[endif]-->FireofStar的博客 http://blog.csdn.net/think_soft

<!--[if !supportLists]-->2.       <!--[endif]-->Google android官网:

http://developer.android.com/guide/topics/sensors/sensors_overview.html

 

 

 

 

 

 

 

分享到:
评论
1 楼 tcitry 2014-05-13  

相关推荐

Global site tag (gtag.js) - Google Analytics