您的位置:首页 > 移动开发 > Android开发

Android传感器系列介绍-刘宇

2016-08-20 18:11 465 查看
Android官方给我们提供一套Android sensor framework,俗称Android传感器框架,简称ASF。传感器分为动作传感器、位置传感器、环境传感器。由于传感器较多,使用过程差不多一样,这里就只演示动作传感器了。不懂的可以留言给我。由于模拟器不支持传感器操作,所以要在真机上运行。

源码下载:http://download.csdn.net/detail/liuyu973971883/9608531

效果图:

放在桌面上的效果,加速度传感器我们会对其数据进行减噪处理,这样的数据更准确,如果不减噪,放在桌面上的数据可能是0.1或者0.2,减噪后降为0.01,更为准确



移动瞬间的截图:



动作传感器又分:加速度传感器、重力传感器、陀螺仪传感器、旋转向量传感器

位置传感器又分:方向传感器、磁力传感器、邻近传感器

环境传感器又分:湿度传感器、光线传感器、湿度传感器

那么ASF这个框架所支持哪些传感器呢,如下:

1.TYPE_ACCELEROMETER:加速传感器(硬件传感器)
2.TYPE_AMBIENT_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:旋转向量传感器(硬件或软件传感器)

13.  TYPE_TEMPERATURE:温度传感器(硬件传感器),从Android4.0(APILevel=14)开始被TYPE_AMBIENT_TEMPERATURE取代。

如上所示,其实是12种,有个温度传感器被取代了。硬件传感器和软件传感器的区别在于,硬件传感器的数据直接获取到的,没有进行加工,二软件传感器的数据是基于硬件传感器的数据进行二次加工后的数据

——————————————————————————————————————————

所需要用到的类:

1、SensorManager类:用于创建sensorservice的实例。该类提供了很多用于访问和枚举传感器,注册和注销传感器监听器的方法。而且还提供了与传感器精度、扫描频率、校正有关的常量。
2、Sensor类:提供了一些用于获取传感器技术参数的方法。如版本、类型、生产商等。
3、SensorEvent类:系统使用该类创建传感器事件对象。该对象可以提供与传感器事件有关的信息。传感器事件对象包括的信息有原始的传感器回传数据、传感器类型、数据的精度以及触发事件的时间。
4、SensorEventListener接口:该接口包含两个回调方法,当传感器的回传值或精度发生变化时,系统会调用这两个回调方法。
——————————————————————————————————————————
加速度传感器Demo开始:

首先我们先创建一个新的工程:

新工程下系统会自动在主布局文件添加一个TextView,我们用它来显示获取到的数据,为其添加id。

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

</RelativeLayout>


MainActivity.java:

package com.oak.learnsensor;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
import android.app.Activity;

//实现传感器时间监听,并重写两个方法
public class MainActivity extends Activity implements SensorEventListener {
private SensorManager sm;
private TextView tv;
//这个数组用来存放重力传感器信息,为什么加速度传感器需要重力传感器的信息
//那是因为加速度传感器会受到手机自身的重量从而Z轴受到影响,
//需要重力传感器的信息来对加速度传感器的信息进行二次优化
private float[] gravity = new float[3];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取到传感器这个系统服务
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
//用于显示信息的TextView,获取到它
tv = (TextView) findViewById(R.id.tv);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//在窗口可见的时候注册加速度传感器
sm.registerListener(this,
sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_UI);
//在窗口可见的时候注册重力传感器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_GRAVITY),
SensorManager.SENSOR_DELAY_UI);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
//窗口关闭的时候自动注销传感器
sm.unregisterListener(this);
}
//当传感器精度发生改变时会调用
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {

}
//传感器信息发生变化的时候调用
@Override
public void onSensorChanged(SensorEvent event) {
//判断是哪个传感器
switch (event.sensor.getType()) {
//加速度传感器
case Sensor.TYPE_ACCELEROMETER:
//定义一个系数值
final float alpha = 0.8f;
//对加速度传感器和重力传感器信息进行优化,然后保存
gravity[0] = gravity[0] * alpha + event.values[0] * (1 - alpha);
gravity[1] = gravity[1] * alpha + event.values[1] * (1 - alpha);
gravity[2] = gravity[2] * alpha + event.values[2] * (1 - alpha);
//将获取到的加速度信息减去优化的值即是最后最接近真实的结果
String res = "加速度传感器:\n" + "X:" + (event.values[0] - gravity[0])
+ "\n" + "Y:" + (event.values[1] - gravity[1]) + "\n"
+ "Z:" + (event.values[2] - gravity[2]);
//显示到TextView中
tv.setText(res);
break;
//重力传感器
case Sensor.TYPE_GRAVITY:
//获取重力传感器的X、Y、Z轴的信息
gravity[0] = event.values[0];
gravity[1] = event.values[1];
gravity[2] = event.values[2];
break;
}
}
}


——————————————————————————————————————————————
下面简单介绍一下位置传感器和环境传感器的返回值:

1、位置传感器:

 磁场传感器和方向传感器都返回值3个值(SensorEvent.values),而邻近传感器只返回1个值。

方向传感器:

1)、SensorEvent.values[0]:

    绕着Z轴旋转的角度。如果Y轴(正常拿手机的方向)正对着北方,该值是0,如果Y轴指向南方,改值是180,Y轴指向东方,该值是90,如果Y轴指向西方,该值是270。

2)、SensorEvent.values[1]:
     绕着X轴旋转的度数。当从Z轴正方向朝向Y轴正方向,改值为正值。反之,为负值。该值在180至-180之间变动。

3)、SensorEvent.values[2]:
     绕着Y轴旋转的度数。当从Z轴正方向朝向X轴正方向,改值为正值。反之,为负值。该值在180至-180之间变动。

磁场传感器:

1)、SensorEvent.values[0]:

    沿着X轴的磁力(μT,millitesla)

2)、SensorEvent.values[1]:
    沿着Y轴的磁力(μT,millitesla)

3)、SensorEvent.values[2]:
    沿着Y轴的磁力(μT,millitesla)

邻近传感器:

1)、SensorEvent.values[0]:

    手机正面距离邻近物理的距离(CM)

2、环境传感器:

所有的环境传感器都只有一个返回值:

nTYPE_AMBIENT_TEMPERATURE :event.values[0]   °C//温度
nTYPE_LIGHT:event.values[0]   lx  //光线
nTYPE_PRESSURE:event.values[0]  hPa  //压强
TYPE_RELATIVE_HUMIDITY :event.values[0]   RH(%)//湿度

在光线传感器上,Google为我们提供一些参照值,可以通过这些参照值的范围对比做出对应的业务逻辑:

// 最强的光线强度(估计只有沙漠地带才能达到这个值)

public static final float LIGHT_SUNLIGHT_MAX = 120000.0f;

// 万里无云时阳光直射的强度

public static final floatLIGHT_SUNLIGHT  =  110000.0f;

// 有阳光,但被云彩抵消了部分光线时的强度

public static final floatLIGHT_SHADE  =  20000.0f;

// 多云时的光线强度   

public static final floatLIGHT_OVERCAST     = 10000.0f;

// 太阳刚刚升起时(日出)的光线强度

public static final floatLIGHT_SUNRISE      = 400.0f;

// 在阴雨天,没有太阳时的光线强度

public static final floatLIGHT_CLOUDY       = 100.0f;

// 夜晚有月亮时的光线强度

public static final floatLIGHT_FULLMOON     = 0.25f;

// 夜晚没有月亮时的光线强度(当然,也不能有路灯,就是漆黑一片)

public static final floatLIGHT_NO_MOON      = 0.001f;

By:Mr.Oak
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息