关闭
关闭
首页 > 嵌入式软件 > android

自从苹果公司在2007年发布第一代iPhone以来,以前看似和手机挨不着边的传感器也逐渐成为手机硬件的重要组成部分。如果读者使用过iPhone、HTC Dream、HTC Magic、HTC Hero以及其他的Android手机,会发现通过将手机横向或纵向放置,屏幕会随着手机位置的不同而改变方向。这种功能就需要通过重力传感器来实现,除了重力传感器,还有很多其他类型的传感器被应用到手机中,例如磁阻传感器就是最重要的一种传感器。虽然手机可以通过GPS来判断方向,但在GPS信号不好或根本没有GPS信号的情况下,GPS就形同虚设。这时通过磁阻传感器就可以很容易判断方向(东、南、西、北)。有了磁阻传感器,也使罗盘(俗称指向针)的电子化成为可能。

在Android应用程序中使用传感器要依赖于android.hardware.SensorEventListener接口。通过该接口可以监听传感器的各种事件。SensorEventListener接口的代码如下:

package android.hardware;

public interface SensorEventListener

{

public void

onSensorChanged(SensorEvent event);

public void

onAccuracyChanged(Sensor sensor, int accuracy);

}

在SensorEventListener接口中定义了两个方法:onSensorChanged和onAccuracyChanged。当传感器的值发生变化时,例如磁阻传感器的方向改变时会调用onSensorChanged方法。当传感器的精度变化时会调用onAccuracyChanged方法。

onSensorChanged方法只有一个SensorEvent类型的参数event,其中SensorEvent类有一个values变量非常重要,该变量的类型是float[]。但该变量最多只有3个元素,而且根据传感器的不同,values变量中元素所代表的含义也不同。

在解释values变量中元素的含义之前,先来介绍一下Android的坐标系统是如何定义X、Y、Z轴的。

X轴的方向是沿着屏幕的水平方向从左向右。如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置。

Y轴的方向是从屏幕的左下角开始沿着屏幕的垂直方向指向屏幕的顶端。

将手机平放在桌子上,Z轴的方向是从手机里指向天空。

下面是values变量的元素在主要的传感器中所代表的含义。

1.1 方向传感器

在方向传感器中values变量的3个值都表示度数,它们的含义如下:

values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果values[0]的值正好是这4个值,并且手机是水平放置,表示手机的正前方就是这4个方向。可以利用这个特性来实现电子罗盘,实例76将详细介绍电子罗盘的实现过程。

values[1]:该值表示倾斜度,或手机翘起的程度。当手机绕着X轴倾斜时该值发生变化。values[1]的取值范围是-180≤values[1]

≤180。假设将手机屏幕朝上水平放在桌子上,这时如果桌子是完全水平的,values[1]的值应该是0(由于很少有桌子是绝对水平的,因此,该值很可能不为0,但一般都是-5和5之间的某个值)。这时从手机顶部开始抬起,直到将手机沿X轴旋转180度(屏幕向下水平放在桌面上)。在这个旋转过程中,values[1]会在0到-180之间变化,也就是说,从手机顶部抬起时,values[1]的值会逐渐变小,直到等于-180。如果从手机底部开始抬起,直到将手机沿X轴旋转180度,这时values[1]会在0到180之间变化。也就是values[1]的值会逐渐增大,直到等于180。可以利用values[1]和下面要介绍的values[2]来测量桌子等物体的倾斜度。

values[2]:表示手机沿着Y轴的滚动角度。取值范围是-90≤values[2]≤90。假设将手机屏幕朝上水平放在桌面上,这时如果桌面是平的,values[2]的值应为0。将手机左侧逐渐抬起时,values[2]的值逐渐变小,直到手机垂直于桌面放置,这时values[2]的值是-90。将手机右侧逐渐抬起时,values[2]的值逐渐增大,直到手机垂直于桌面放置,这时values[2]的值是90。在垂直位置时继续向右或向左滚动,values[2]的值会继续在-90至90之间变化。

1.2 加速传感器

该传感器的values变量的3个元素值分别表示X、Y、Z轴的加速值。例如,水平放在桌面上的手机从左侧向右侧移动,values[0]为负值;从右向左移动,values[0]为正值。读者可以通过本节的例子来体会加速传感器中的值的变化。要想使用相应的传感器,仅实现SensorEventListener接口是不够的,还需要使用下面的代码来注册相应的传感器。

// 获得传感器管理器

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);

// 注册方向传感器

sm.registerListener(this,

sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),

SensorManager.SENSOR_DELAY_FASTEST);

如果想注册其他的传感器,可以改变getDefaultSensor方法的第1个参数值,例如,注册加速传感器可以使用Sensor.TYPE_ACCELEROMETER。在Sensor类中还定义了很多传感器常量,但要根据手机中实际的硬件配置来注册传感器。如果手机中没有相应的传感器硬件,就算注册了相应的传感器也不起任何作用。getDefaultSensor方法的第2个参数表示获得传感器数据的速度。SensorManager.SENSOR_DELAY_ FASTEST表示尽可能快地获得传感器数据。除了该值以外,还可以设置3个获得传感器数据的速度值,这些值如下:

SensorManager.SENSOR_DELAY_NORMAL:默认的获得传感器数据的速度。

SensorManager.SENSOR_DELAY_GAME:如果利用传感器开发游戏,建议使用该值。

SensorManager.SENSOR_DELAY_UI:如果使用传感器更新UI中的数据,建议使用该值。

1.3 重力感应器

加速度传感器的类型常量是Sensor.TYPE_GRAVITY。重力传感器与加速度传感器使用同一套坐标系。values数组中三个元素分别表示了X、Y、Z轴的重力大小。Android SDK定义了一些常量,用于表示星系中行星、卫星和太阳表面的重力。下面就来温习一下天文知识,将来如果在地球以外用Android手机,也许会用得上。

public static final float GRAVITY_SUN= 275.0f;

public static final float GRAVITY_MERCURY= 3.70f;

public static final float GRAVITY_VENUS= 8.87f;

public static final float GRAVITY_EARTH= 9.80665f;

public static final float GRAVITY_MOON= 1.6f;

public static final float GRAVITY_MARS= 3.71f;

public static final float GRAVITY_JUPITER= 23.12f;

public static final float GRAVITY_SATURN= 8.96f;

public static final float GRAVITY_URANUS= 8.69f;

public static final float GRAVITY_NEPTUNE= 11.0f;

public static final float GRAVITY_PLUTO= 0.6f;

public static final float GRAVITY_DEATH_STAR_I= 0.000000353036145f;

public static final float GRAVITY_THE_ISLAND= 4.815162342f;

1.4 光线传感器

光线传感器的类型常量是Sensor.TYPE_LIGHT。values数组只有第一个元素(values[0])有意义。表示光线的强度。最大的值是120000.0f。Android SDK将光线强度分为不同的等级,每一个等级的最大值由一个常量表示,这些常量都定义在SensorManager类中,代码如下:

public static final float LIGHT_SUNLIGHT_MAX =120000.0f;

public static final float LIGHT_SUNLIGHT=110000.0f;

public static final float LIGHT_SHADE=20000.0f;

public static final float LIGHT_OVERCAST= 10000.0f;

public static final float LIGHT_SUNRISE= 400.0f;

public static final float LIGHT_CLOUDY= 100.0f;

public static final float LIGHT_FULLMOON= 0.25f;

public static final float LIGHT_NO_MOON= 0.001f;

上面的八个常量只是临界值。读者在实际使用光线传感器时要根据实际情况确定一个范围。例如,当太阳逐渐升起时,values[0]的值很可能会超过LIGHT_SUNRISE,当values[0]的值逐渐增大时,就会逐渐越过LIGHT_OVERCAST,而达到LIGHT_SHADE,当然,如果天特别好的话,也可能会达到LIGHT_SUNLIGHT,甚至更高。

1.5 陀螺仪传感器

陀螺仪传感器的类型常量是Sensor.TYPE_GYROSCOPE。values数组的三个元素表示的含义如下:values[0]:延X轴旋转的角速度。

values[1]:延Y轴旋转的角速度。

values[2]:延Z轴旋转的角速度。

当手机逆时针旋转时,角速度为正值,顺时针旋转时,角速度为负值。陀螺仪传感器经常被用来计算手机已转动的角度,代码如下:

private static final float NS2S = 1.0f / 1000000000.0f;

private float timestamp;

public void onSensorChanged(SensorEvent event)

{

if (timestamp != 0)

{

// event.timesamp表示当前的时间,单位是纳秒(1百万分之一毫秒)

final float dT = (event.timestamp - timestamp) * NS2S;

angle[0] += event.values[0] * dT;

angle[1] += event.values[1] * dT;

angle[2] += event.values[2] * dT;

}

timestamp = event.timestamp;

}

上面代码中通过陀螺仪传感器相邻两次获得数据的时间差(dT)来分别计算在这段时间内手机延X、 Y、Z轴旋转的角度,并将值分别累加到angle数组的不同元素上。

1.6其他传感器

其他传感器在前面几节介绍了加速度传感器、重力传感器、光线传感器、陀螺仪传感器以及方向传感器。除了这些传感器外,Android SDK还支持如下的几种传感器。关于这些传感器的使用方法以及与这些传感器相关的常量、方法,读者可以参阅官方文档。

近程传感器(Sensor.TYPE_PROXIMITY)

线性加速度传感器(Sensor.TYPE_LINEAR_ACCELERATION)

旋转向量传感器(Sensor.TYPE_ROTATION_VECTOR)

磁场传感器(Sensor.TYPE_MAGNETIC_FIELD)

压力传感器(Sensor.TYPE_PRESSURE)

温度传感器(Sensor.TYPE_TEMPERATURE)

虽然AndroidSDK定义了十多种传感器,但并不是每一部手机都完全支持这些传感器。例如,Google Nexus S支持其中的9种传感器(不支持压力和温度传感器),而HTC G7只支持其中的5种传感器。如果使用了手机不支持的传感器,一般不会抛出异常,但也无法获得传感器传回的数据。读者在使用传感器时最好先判断当前的手机是否支持所使用的传感器。

2次

本文引用地址: http://embed.21ic.com/software/android/201806/52734.html

换一批

延伸阅读

[新鲜事] 高科技为执法带来便利:拔出手枪的同时随身摄像头开始自动录制

高科技为执法带来便利:拔出手枪的同时随身摄像头开始自动录制

据外媒报道,近日一种新型的传感器能够为执法部门带来便利。当警察拔出手枪时,这种传感器能够激活警察的随身摄像头并开始自动录制。这种被称为Axon Signal Sidearm的无线传感器是由TASER International公司设计,被安......

关键字:智能可穿戴 传感器 Axon

[新鲜事] 满足中国手机厂商需求,索尼CMOS传感器增产10%

满足中国手机厂商需求,索尼CMOS传感器增产10%

继华为之后,索尼也给OPPO公司联合研发、定制手机拍照传感器了。......

关键字:索尼 CMOS传感器 手机厂商

[趣科技] 呼一口气 这个传感器就能检测你是否患病

呼一口气 这个传感器就能检测你是否患病

这种传感器由一系列特别制备的金纳米颗粒传感器,和基于单壁碳纳米管的随机网络的传感器组成。它真正特别的地方在于,可以收集患不同疾病的数千患者的呼吸样本,并用人工智能软件找到数据中的相关性。 ......

关键字:传感器 疾病检测

[新鲜事] 起床困难户注意了!这里有可编程的水冷枕头让你自然清醒

起床困难户注意了!这里有可编程的水冷枕头让你自然清醒

每年的CES,我们都会看到很多脑洞大开的黑科技。很多人可能都记得夏天使用过清凉的水枕头,现在这个原始但好用的产品形态可能变得更加智能化,用来帮助我们管理健康。 ......

关键字:CES2017 智能枕头 运动传感器 黑科技 闹钟

[新鲜事] 丰田首款自动驾驶汽车发布:满身传感器

丰田首款自动驾驶汽车发布:满身传感器

丰田研究所本周正式公布了品牌首款自动驾驶汽车,一辆装满各种传感器的雷克萨斯LS 600HL。......

关键字:丰田 自动驾驶汽车 传感器

[趣科技] 索尼称造出世界最小100万像素传感器:仅2毫米!

索尼称造出世界最小100万像素传感器:仅2毫米!

索尼日前对外展示了一款新摄像头,其搭载的是一块2毫米款100万像素的传感器。索尼宣称,这是世界上最小的100万像素传感器,它可以缩小智能手表、其它小型轻量设备的尺寸,或者使产品更具特色。......

关键字:索尼 100万像素传感器
条评论

我 要 评 论

网友评论

大家都爱看

  • 扇出型晶圆级封装的优势和挑战!

    我们有能力创造一些能保持前代性能并且更好更小的电子设备,例如今天的可穿戴设备、智能手机或平板电脑,这是由于很多因素超过摩尔定律而快速发展,从而能够从底层的嵌入组件发展到今天把它们封…

    2018-03-29
  • Xilinx推出革命性的新型自适应计算产品

    自适应和智能计算的全球领先企业赛灵思公司(Xilinx, Inc.,(NASDAQ:XLNX)),近日宣布推出一款超越FPGA功能的突破性新型产品,名为ACAP(Adaptive Compute Acceleration Platform,自适应计算加速…

    2018-03-20
  • 赛普拉斯为树莓派3 B+ IoT单板计算机提供强大稳定的无

    先进嵌入式系统解决方案的领导者赛普拉斯(纳斯达克代码:CY)近日宣布其Wi-Fi®和蓝牙®combo解决方案为全新的树莓派 3 B+(Raspberry Pi 3Model B+)IoT单板计算机提供强大稳定的无线连接…

    2018-03-20
  • 观看直播领红包,SEED-A10加速卡助力人工智能

    随着云服务器、云计算的发展,大家对硬件加速的需求越来越多,但是随着设备功耗的上升、性能需求越来越高,常规加速设备以及开始不能满足需求,因此FPGA逐渐在硬件加速中找到了自己的位置,而艾…

    2018-03-19
  • 特朗普:博通不得以任何形式收购高通

    白宫周一(3月12日)晚发出声明,川普(特朗普)总统出于“国家安全”考量、禁止新加坡博通公司(Broadcom)收购美国高通公司(Qualcomm)。

    2018-03-14