手持终端
Eclipse平台下Android开发环境的搭建
PhoneGap配置到Eclipse开发环境
使用PhoneGap开发Android应用程序
PhoneGap3.0以上版本配置到Eclipse开发环境
使用PhoneGap3.0版本开发Android应用程序
PhoneGap3.0的第三方Android插件
Cordova配置到Android Studio开发环境
Android系统基本架构
Android的字符串颜色图片样式
Android的常用控件及菜单
Android的消息提示及传递
Android系统的组件通信
Android系统的Service
Android的广播消息接收
Android的数据存储与访问
Android系统的网络应用
Android图形图像处理
Android的Fragment框架
Android系统的并发编程
Java源文件结构与保留字
Java语言的数据类型与变量
Java的运算符与流程控制
Java语言的数组及操作
Java面向对象编程
Java的常用类
Android开发常用工具及命令
Android应用程序权限管理
Android系统提供的R类内置资源
Android系统的控件类及其方法
Android系统的菜单类及其方法
Android系统的对话框
Android应用程序模型及组件
Android的绘图类及方法
Android系统的动画效果
Android的数据库操作
Android的多媒体功能
Android系统照相机的使用
Android的文本朗读TTS
获取Android系统信息
Android系统的电话操作
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()方法中注销传感器监听器,以确保仅在活动可用时使用传感器。