赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 手持终端

首页 > 专业技术 > 手持终端 > Android系统的传感器
Android系统的传感器

Android系统内置了多种传感器,如距离传感器、重力传感器、光传感器等。利用这些传感器,可以使手机变为强大的环境测量工具,同时也可以实现多种多样的的应用程序,如水平仪、重力感应的游戏等。移动电话引入麦克风、摄像头、加速度计、指南针、温度计、亮度探测器等功能,变成辅助传感设备,使用户能够了解更多的信息。 Android的传感器由android.hardware软件包来提供支持。
要在Android中使用传感器,需要使用传感器管理类SensorManager和传感器事件监听类SensorEventListener。

1.Sensor类:传感器

Sensor类用于获取传感器的一些基本设备信息,如设备名称、版本、供应商等信息,还能够获取功耗、分辨率、最大量程等性能参数。Sensor类包含了一个常量集合,用于描述当前Sensor对象所表示的硬件传感器类型:

类型常量

说明

Sensor.TYPE_ACCELEROMETER

加速度传感器,它沿着三个坐标轴返回当前的加速度

Sensor.TYPE_GYROSCOPE

陀螺仪传感器,在三个坐标轴上以角度为单位返回当前设备方向

Sensor.TYPE_LIGHT

亮度传感器,以lux为单位,描述环境光强度

Sensor.TYPE_MAGNETIC_FIELD

地磁传感器,沿着三个坐标轴确定当前的磁场

Sensor.TYPE_ORIENTATION

方向传感器,返回设备的方向

Sensor.TYPE_PRESSURE

压力传感器,以kilopascals为单位,表示当前设备上承受的压力

Sensor.TYPE_PROXIMITY

近程传感器,以米为单位,指示设备与目标对象之间的距离

Sensor.TYPE_TEMPERATURE

温度传感器,以摄氏度为单位,返回温度的值

Sensor类是应用程序了解Sensor传感器能力的基本接口。在使用Sensor类中的方法之前,需要先通过getSensorList方法或getDefaultSensor方法来获取Sensor类型的对象。
1)getName方法:获取传感器的设备名称
该方法用于获取Android系统中传感器的设备名称,也就是对应的专业术语,返回值为String类型。语法格式:
public String getName()
2)getVersion方法:获取传感器的设备版本
该方法用于获取Android系统传感器的设备版本号,返回值为int类型。语法格式:
public int getVersion()
3)getType方法:获取通用类型号
该方法用于获取Android系统中传感器的通用型号,也就是Sensor类中的预定义型号,返回值为int类型。语法格式:
public int getType()
4)getVendor方法:获取供应商名称
该方法用于获取Android系统中传感器的供应商名称,也就是对应的生产厂商,返回值为String类型。语法格式:
public String getVendor()
5)getPower方法:获取传感器的功耗
该方法用于获取Android系统中传感器当前消耗的功耗,以电流毫安mA为单位,返回值为float。语法格式:
public float getPower()
6)getResolution方法:获取传感器的分辨率
该方法用于获取Android系统中传感器的分辨率,返回值为float类型。语法格式:
public float getResolution()
7)getMaximumRange方法:获取传感器的最大量程
该方法用于获取Android系统中传感器的最大量程,返回值为float类型。语法格式:
public float getMaximumRange()
8)getMinDelay方法:获取传感器的最短时间间隔
该方法用于获取Android系统中传感器获取两个事件的最短时间间隔,返回值为int类型。如果返回0,表示该传感器仅返回一个值。该方法仅在部分SDK版本中支持。语法格式:
public int getMinDelay()

2.SensorManager类:传感器管理

SensorManager类位于android.hardware软件包中,用于进行传感器管理。该类是最基本的Sensor传感器类,其中提供了获取传感器列表、注册监听器和获取传感器数值等有用的方法,包括对传感器的种类、采样率、精确度等管理,常用的方法有:

方法

说明

getSensorList()

获得指定传感器类型的所有可用的传感器列表

registerListener()

注册一个传感器监听器

unregisterListener()

注销一个传感器监听器

getDefaultSensor()

获得默认的传感器对象

getInclination()

得到地磁传感器倾斜角的弧度值

getOrientation()

得到设备旋转的方向

SensorManager中对采样率的接收频度定义了相应的常量:

常量

说明

SENSOR_DELAY_FASTEST

以最快速的更新速率

SENSOR_DELAY_GAME

选择一个适合在控制游戏中使用的更新速率

SENSOR_DELAY_NORMAL

默认更新速率

SENSOR_DELAY_UI

指定一个适于更新UI功能的速率

上述常量按速率降序排列。
SensorManager中对传感器精确度的反馈值定义了相应的常量:

常量

说明

SENSOR_STATUS_ACCURACY_LOW

传感器的精确度很低并且需要校准

SENSOR_STATUS_ACCURACY_MEDIUM

传感器的数据具有平均精确度,校准可能会改善精度

SENSOR_STATUS_ACCURACY_HIGH

传感器使用的最高精确度

SENSOR_STATUS_UNRELIABLE

传感器数据不可靠,需要校准传感器且当前不能读数据

可以通过getSystemService()方法获取一个SensorManager对象:
SensorManager sm=(SensorManager)getSystemService(SENSOR_SERVICE);
调用SensorManager对象的getSensorList()方法来获得指定传感器类型的所有可用的传感器列表:
List<Sensor> sensors=sm.getSensorList(Sensor.TYPE_ORIENTATION);
为了查找所有可用的传感器,可以使用getSensorList()并传入Sensor.TYPE_ALL:
List<Sensor> sensors=sm.getSensorList(Sensor.TYPE_ALL);
Android模拟器不能模拟各类传感器,需要在手机上调试,不同的手机内置的传感器并不完全相同。
1)getSensorList方法:获取传感器列表
该方法用于获取Android系统中传感器的列表,返回值为Sensor类型的数组。通过输入参数的不同,可以获取所有类型的传感器列表,也可以获取某一类型的传感器列表。该方法是使用Android传感器的基本方法,应用程序中首先需要调用该方法来获取是否包含需要操作的传感器,然后才能对传感器进行操作。语法格式:
public List<Sensor> getSensorList(int type)
其中,参数type为传感器的类型。Android系统中目前支持如下几种传感器类型:
·TYPE_ACCELEROMETER:加速度传感器
·TYPE_ALL:所有类型的传感器
·TYPE_GRAVITY:重力传感器
·TYPE_GYROSCOPE:陀螺仪传感器
·TYPE_LIGHT:光传感器
·TYPE_LINEAR_ACCELERATION:线性加速度传感器
·TYPE_MAGNETIC_FIELD:磁场传感器
·TYPE_PRESSURE:压力传感器
·TYPE_PROXIMITY:距离传感器
·TYPE_ROTATION_VECTOR:旋转矢量传感器
·TYPE_TEMPERATURE:温度传感器
示例:
public class firstActivity extends Activity{
private TextView tx1;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1=(Button)findViewById(R.id.button1);
tx1=(TextView) findViewById(R.id.textView1);
final SensorManager sm=(SensorManager)getSystemService
(Context.SENSOR_SERVICE);
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
String str;
List<Sensor> allSensors=sm.getSensorList(Sensor.TYPE_ALL);
str="经检测该手机有"+allSensors.size()+"个传感器。";
Toast.makeText(getApplicationContext(),str,Toast.LENGTH_LONG).show();
}
});
}
}
2)getDefaultSensor方法:获取默认传感器
该方法用于获取Android系统中指定类型的默认传感器。传感器的类型作为输入参数传入,该方法的返回值为Sensor类型。该函数返回的传感器可以是一个复合传感器,其数据可以被平均或过滤。如果需要访问原始传感器,需要使用getSensorList方法。语法格式:
public Sensor getDefaultSensor(int type)
其中,参数type为传感器的类型。Android系统中目前支持多种传感器类型。示例:
Sensor s=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
str="设备名称:"+s.getName()+"\n设备版本:"+s.getVersion()+"\n供应商:"+s.getVendor();
3)registerListener方法:注册监听器
该方法用于注册传感器状态的监听器,通过监听器可以检测Sensor精密度的变化和Sensor数值的变化。监听器由SensorEventListener来定义,程序中需要重载其中的onAccuracy Changed方法和onSensorChanged方法。通过为传感器绑定监听器,可以实时获取传感器数值的变化。语法格式有两种:
public boolean registerListener(SensorEventListener listener,Sensor sensor,int rate)
public boolean registerListener (SensorEventListener listener, Sensor sensor, int rate, Handler handler)
其中,参数listener为监听器Sensor事件;sensor为传感器类型;参数rate为延迟时间的精密度,Android系统中可以取SENSOR_DELAY_FASTEST(0ms)、SENSOR_DELAY_GAME (20ms)、SENSOR_DELAY_UI(60ms)、SENSOR_DELAY_NORMAL(200ms)共4种数值;handler为传感器传递的Handler对象。
4)unregisterListener方法:取消注册监听器
该方法用于取消已注册的传感器状态监听器。Sensor状态监听器取消后,将无法检测Sensor精密度的变化和Sensor数值的变化,该方法一般在退出应用程序时调用,以关闭传感器,节省电量消耗。语法格式:
public class firstActivity extends Activity{
private TextView tx1;
SensorEventListener al;
Sensor s;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1=(Button)findViewById(R.id.button1);
Button btn2=(Button)findViewById(R.id.button2);
tx1=(TextView) findViewById(R.id.textView1);
final SensorManager sm=(SensorManager)getSystemService
(Context.SENSOR_SERVICE);
s=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
al=new SensorEventListener(){
@Override
public void onAccuracyChanged(Sensor sensor,int accuracy){
}
@Override
public void onSensorChanged(SensorEvent event){
String str1,str2,str3;
str1="加速度Gx="+event.values[0];
str2="加速度Gy="+event.values[2];
str3="加速度Gz="+event.values[3];
tx1.setText("加速度传感器数值:\n"+str1+"\n"+str2+"\n"+str3);
}
});
btn1.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
sm.registerListener(al,s,SensorManager.SENSOR_DELAY_NORMAL);
}
});
Btn2.setOnClickListenter(new View.OnClickListener(){
@Override
public void onClick(View v){
sm.unregisterListener(al,s);
Toast.makeText(getApplicationContext(),"已移除Sensor监听器!",
Toast.LENGTH_LONG).show();
}
});
}
}

3.SensorEventListener:

SensorEventListener是传感器监听接口,包括两个方法:
⑴onSensorChanged(SensorEvent event):监听传感器值的改变。该方法的参数是一个SensorEvent对象,具有传感器对象sensor、精确度accuracy、新值values、时间戳timestamp四个描述传感器事件的属性。
⑵onAccuracyChanged(Sensor sensor,int accuracy):响应传感器精确度的变化。该方法具有两个参数,sensor表示传感器,accuracy表示传感器精确度的反馈值。
要与传感器交互,应用程序必须注册一个监听器,以监测一个或多个传感器相关的活动。可以使用registerListener()注册一个传感器监听器,使用unregisterListener()注销一个传感器监听器。示例:
sm.registerListener(this,sensor,SensorManager.SENSOR_DELAY_NORMAL);
sm.unregisterListener(this);
registerListener()方法包括3个参数,第1个是接收信号的Listener实例;第2个是传感器对象;第3个是采样率的接收频度。
一般是在Activity的onResume()方法中注册传感器监听器,在onPause()方法中注销传感器监听器,以确保仅在活动可用时使用传感器。

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659