android中传感器的应用
google给android一共提供了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,返回x、y、z三轴的加速度数值。该数值包含地心引力的影响,单位是m/s^2。将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认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)>。
<!--[if !supportLists]-->l <!--[endif]-->X定义为由YZ产生,这是切向于设备的当前位置所在的地面,大致指向东。
<!--[if !supportLists]-->l <!--[endif]-->Y是切线向于设备的当前位置的地面指向磁北极。
<!--[if !supportLists]-->l <!--[endif]-->Z轴指向天空垂直于地面。
values[4]: estimated heading Accuracy (in 弧度) (-1 if unavailable)
privateSensorManager mSensorManager;
.mSensorManager =(SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
<!--[if !supportLists]-->(3) <!--[endif]-->未校准的旋转矢量传感器 #define SENSOR_TYPE_GAME_ROTATION_VECTOR
此传感器除了未使用地磁场以外,和ROTATION_VECTOR是一样的。因此它的Y轴并不指向北,而是指向其他参照,这个参照允许与陀螺仪绕漂移是同一数量级的,漂移是围绕Z轴的。
在理想情况下,一个电话旋转和回到同样的现实世界的方位应该报告相同的游戏旋转矢量(不使用地球磁场)。然而,定位可能随时间有些漂移。
<!--[if !supportLists]-->(4) <!--[endif]-->陀螺仪传感器 #define SENSOR_TYPE_GYROSCOPE
陀螺仪传感器叫做Gyro-sensor,返回x、y、z三轴的角速度数据。陀螺仪以rad/s(弧度/每秒)为单位围绕设备的X、Y、Z轴来测量速率或旋转角度。下列代码显示了如何获取一个默认的陀螺仪的实例:
private SensorManager mSensorManager; private Sensor mSensor; ...
mSensorManager = (SensorManager)
getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
通常,陀螺仪的输出会被集成到时间上,以便计算在一定时间步长之上旋转角度的变化
<!--[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轴三个方向上的重力加速度。当设备休息时,重力传感器的输出和加速度传感器一样。
首先定义SensorManager和Sensor对象,然后开启服务,然后设置监听器,重写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{
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
Mysensorlistener Mylistener = new Mysensorlistener();
// TODO Auto-generated method stub
sm.registerListener(Mylistener, gravity_sensor,(int) 10e17);
// TODO Auto-generated method stub
sm.unregisterListener(Mylistener);
<!--[if !supportLists]-->(6) <!--[endif]-->线性加速度传感器 #define SENSOR_TYPE_LINEAR_ACCELERATION
线性加速度传感器简称LA-sensor。线性加速度传感器是加速度传感器减去重力影响获取的数据。单位是m/s^2,坐标系统与加速度传感器相同。
private SensorManager mSensorManager;
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
<!--[if !supportLists]-->(7) <!--[endif]-->地磁场传感器 #define SENSOR_TYPE_MAGNETIC_FIELD
磁力传感器简称为M-sensor,返回x、y、z三轴的环境磁场数据。该数值的单位是微特斯拉(micro-Tesla),用uT表示。单位也可以是高斯(Gauss),1Tesla=10000Gauss。
地磁场传感器让你能够监视地球磁场的变化。下列代码显示了如何获取默认地磁场传感器实例:
private SensorManager mSensorManager;
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
<!--[if !supportLists]-->(8) <!--[endif]-->方向传感器(现已被弃用) #define SENSOR_TYPE_ORIENTATION
方向传感器简称为O-sensor,返回三轴的角度数据,方向数据的单位是角度。
方向传感器会相对与地球参照系来监视设备的位置(特别是北极)。以下代码显示了如何获取默认的方向传感器的实例:
private SensorManager mSensorManager;
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
通过使用设备的地磁场传感器跟加速度传感器的组合来获取方向传感器的数据。使用这两个硬件传感器,方向传感器能够提供以下三个维度的数据:
2. 倾斜角(围绕X轴的旋转角度)。当正方向的Z轴向着正向的Y轴旋转时,该值是正值,
当正方向的Z轴向着负方向的Y轴旋转时,该值是负值。它的取值范围是180度到-180
3. 转角(围绕Y轴旋转的角度)。当正方向的Z轴向着正向的X轴旋转时,该值是正值,
当正方向的Z轴向着负方向的X轴旋转时,该值是负值。它的取值范围是90度到-90度之间。
这种定义有别与航空领域的偏航、倾斜和滚动,飞行器的X轴是飞机的长边(从尾部到头部)。另外,由于历史原因,顺时针方向的转角是正值(从数学的角度,逆时针方向应该是正值)。
<!--[if !supportLists]-->(9) <!--[endif]-->接近传感器(距离传感器)#define SENSOR_TYPE_PROXIMITY
接近传感器检测物体与手机的距离,单位是厘米。一些接近传感器只能返回远和近两个状态,因此,某些接近传感器将大于最大距离返回远状态,小于最大距离返回近状态。
距离传感器会让你判断一个对象距离设备有多远。下列代码显示了如何获取默认的距离传感器的实例:
private SensorManager mSensorManager;
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
public class SensorActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager; private Sensor mProximity;
// Get an instance of the sensor service, and use that to get an instance of
mSensorManager = (SensorManager)
getSystemService(Context.SENSOR_SERVICE); mProximity =
mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); }
public final void onSensorChanged(SensorEvent event) { float distance = event.values[0];
// Do something with this sensor data. }
// Register a listener for the sensor.
mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL); }
// Be sure to unregister the sensor when the activity pauses. super.onPause();
mSensorManager.unregisterListener(this); } }
<!--[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;
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);
private class Mysensorlistener implements SensorEventListener{
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
text1.setText("当前环境温度是"+event.values[0]+"℃");
Mysensorlistener mylistener = new Mysensorlistener();
// TODO Auto-generated method stub
envtemp_sm.unregisterListener(mylistener);
// TODO Auto-generated method stub
envtemp_sm.registerListener(mylistener, envtemp_sensor, SensorManager.SENSOR_DELAY_NORMAL);
<!--[if !supportLists]-->(11) <!--[endif]-->光线感应 #define SENSOR_TYPE_LIGHT
光线感应传感器检测实时的光线强度,光强单位是lux,其物理意义是照射到单位面积上的光通量。
光线感应传感器主要用于Android系统的LCD自动亮度功能。
<!--[if !supportLists]-->(12) <!--[endif]-->压力 #define SENSOR_TYPE_PRESSURE
压力传感器返回当前的压强,单位是百帕斯卡hectopascal(hPa)。
<!--[if !supportLists]-->(13) <!--[endif]-->温度 #define SENSOR_TYPE_TEMPERATURE(现也已经弃用。)
你必须确保同时实现 onAccuracyChanged() 和 onSensorChanged() 回调方法。并且确保在activity 暂停时注销传感器,以防止传感器持续工作而耗尽电力。
<!--[if !supportLists]-->(14) <!--[endif]-->湿度传感器 #define SENSOR_TYPE_RELATIVE_HUMIDITY
露点是给定体积的气体在恒定的大气压力下,水蒸汽由气体转换成水的温度,下列代码显示了如何计算露点的公式:
绝对湿度是在一定体积的干燥空气中含有的水蒸气的质量。绝对湿度的计量单位是克/立方米。以下给出了计算绝对湿度的公式:
(RH/100%) · A · exp(m·t/(Tn+t)
dv(t,RH) = 216.7 · --------------------------------------
273.15 + t
<!--[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
android中传感器的应用相关推荐
- Android中加速和位置传感器的使用
前言 如今灯下闲读红袖添香,半生浮名只是虚妄. 简介 不知道大家有没有注意过,在我们接打电话的时候,当我们把手机放在耳边的时候,屏幕会自动熄灭,而当我们拿下来的时候,屏幕又亮了,这其实是Android ...
- Android方向传感器学习之指南针示例
刚刚跟着视频学习了关于Android中传感器的操作示例,利用方向传感器做了一个很简单的指南针应用...平时工作项目中很少有用到传感器功能,所以很多都不知道,现在自学些,当作慢慢入门吧... 首先贴出软 ...
- Android中的传感器之---加速度传感器
加速度传感器 加速度传感器又叫G-sensor,返回x.y.z三轴的加速度数值. 该数值包含地心引力的影响,单位是m/s^2. 将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认9.81(由于地球 ...
- android 地磁传感器中Rotate Matrix
1)处理建筑平面图,去掉一些不必要的描述或杂物,确定导航关键点,即最能体现建筑地地形位置特征的点,同时完成建筑地地磁数据采样及存储,建立地磁数据地图:具体操作如下,首先用智能手机注册最高精度的地磁数据 ...
- android外置传感器,Android中外接键盘的检测的实现
今天来了一个问题:软键盘无法弹出.分析后是因为系统判断当前有外接硬键盘,就会隐藏软键盘.但实际情况并不是这么简单,该问题只有在特定条件下偶现,具体分析过程就不说了,就是软硬键盘支持上的逻辑问题.借着这 ...
- android中的计步问题及计步传感器分析
今天打开博客,才发现居然有一年多没有写博客了... 最近由于公司要分析android上的计步问题,顺便把计步器在android上的实现跟踪了一下.结果发现悲催的是,android的api19上,是用的 ...
- android动作传感器
android动作传感器 Android平台支持一些用于监视设备动作的传感器(这样的传感器共有5个).其中两个(加速传感器和陀螺仪传感器)是纯的硬件传感器.另外三个(重力传感器.线性加速传感器和旋转向 ...
- Android中使用EventBus事件发布/订阅框架实现事件传递
场景 EventBus EventBus是一种用于Android的事件发布-订阅总线.它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多 ...
- fritz 使用手册_Fritz对象检测指南:使用机器学习在Android中构建宠物监控应用
fritz 使用手册 by Eric Hsiao 萧敬轩 Fritz对象检测指南:使用机器学习在Android中构建宠物监控应用 (A guide to Object Detection with F ...
最新文章
- 根据IP和MAC查端口
- Linux下的进程之进程管理
- 【大牛招生】李飞飞的实验室招人了!不限专业,有跨学科研究经验优先
- Java-Runoob:Java Stream、File、IO
- Python学习笔记:Day 6 配置文件
- TensorFlow2-神经网络训练
- 【渝粤教育】国家开放大学2019年春季 1171科学与技术 参考试题
- 2020国货品牌力发展报告
- Mac安装与配置idea及tomcat
- QImage对一般图像的处理
- Fragment Transactions和Activity状态丢失
- APP设计~切图那些事儿
- 解决oppo r7splus刷机后基带丢失|串号丢失|无信号等问题方法
- c计算机软考中级考什么,计算机软考中级考试内容
- 【存储】超融合(HCI)和云是什么以及区别
- MTF的倾斜边缘计算方法
- Javascript 在WEB系统需求分析中的应用
- 尼克尔镜头上边的字表示什么?
- usim卡如何换nano卡_5G超级SIM卡价格正式公布,iPhone用户彻底无缘
- RFC系列协议--rfc2461--Neighbor Discovery for IP Version 6 (IPv6)
热门文章
- hp dm1 3200au ubuntu 11.05 wireless adapter driver
- 项目中集成SuperPlayer 超级播放器和腾讯云IM TUIKit
- 我们19岁啦——以梦为“码”,为“I”奔跑!
- (2022,MoCA)Few-shot 图像生成的原型记忆(Prototype Memory)和注意力机制
- 传智播客 传智播客.NET视频学习课件
- 基于matlab fdma传输系统设计,基于MATLAB的通信系统设计(本科毕业论文).doc
- 【CVPR2017周博磊】Network Dissection: Quantifying Interpretability of Deep Visual Representations
- java 前端和后端_java编程语言是前端还是后端
- 使用Arduino开发板制作自动空调温度控制器
- 2021年中国稀土永磁材料行业现状及政策分析,高性能钕铁硼未来应用前景广阔「图」