本教程主要讲解Android传感器编程的基础知识,包括加速传感器(accelerometer)、陀螺仪(gyroscope)、环境光照传感器(light)、磁力传感器(magnetic field)、方向传感器(orientation)、压力传感器(pressure)、距离传感器(proximity)和温度传感器(temperature)。
一、前言
我非常喜欢电脑,但是笔记本电脑还是太大了。不管笔记本电脑有多小,我还是要拿个小包背。智能手机不一样。它完全是一部手机,可以随意装在口袋里。所以我在2002年左右最喜欢玩装备Dell的PDA,2007年最喜欢玩的是N73,2010年最喜欢玩的是Milestone。看到手机的功能越来越强大,智能手机在某些方面甚至比台式机和笔记本电脑更强大。这节课讲的是智能手机比台式机和笔记本电脑强的地方:传感器。
2008年,我非常喜欢我的小白笔记本Macbook,我喜欢玩它的一个小软件。当我拍桌子时,笔记本电脑感到震动,它改变了一张桌子,这让我像个孩子一样拍桌子。这个功能得益于苹果笔记本电脑内置的传感器。
我不知道iPhone手机是第一个在手机上使用各种传感器,但我知道iPhone在手机上使用传感器是最成功的。随后的Android该系统还内置了大量的传感器,这使得Android系统手机和普通诺基亚智能手机Windows CE与智能机相比,它有很多牛气Milestone之后,我的N73还在抽屉的角落里。
从Android1.5开始,系统内置了对多达八种传感器的支持,它们是:加速度传感器(accelerometer)、陀螺仪(gyroscope)、环境光照传感器(light)、磁力传感器(magnetic field)、方向传感器(orientation)、压力传感器(pressure)、距离传感器(proximity)和温度传感器(temperature)。
使用这些传感器,我们可以制作各种有趣的应用程序和游戏。例如,在口袋里摇手机时,手机开始无意识地录音。别担心这很容易做到。我们将在本文的结尾制作这个小应用程序。
本文的学习方法仍在实战中学习。需要提醒的是,模拟器中不能模拟传感器,因此您需要准备一个Android只有真机才能操作例子。
例子:手机传感器清单
我们还是先看程序后解释。
创建一个项目 Lesson37_HelloSensor ,主Activity名字叫 mainActivity.java。
2、UI布局文件main.xml内容如下:
XML/HTML代码
3、mainActivity.java内容如下:
Java代码
packagebasic.android.lesson37;
importjava.util.List;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.hardware.Sensor;
importandroid.hardware.SensorManager;
importandroid.os.Bundle;
importandroid.widget.TextView;
publicclassMainActivityextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//准备显示信息UI组建
finalTextViewtx1=(TextView)findViewById(R.id.TextView01);
////从系统服务中获得传感器管理器
SensorManagersm=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
////从传感器管理器中获得所有传感器列表
ListallSensors=sm.getSensorList(Sensor.TYPE_ALL);
//显示多少传感器?
tx1.setText("手机经检测有" allSensors.size() "它们是:\n");
///显示每个传感器的具体信息
for(Sensors:allSensors){
StringtempString="\n" "设备名称:" s.getName() "\n" "设备版本:" s.getVersion() "\n" "供应商:"
s.getVendor() "\n";
switch(s.getType()){
caseSensor.TYPE_ACCELEROMETER:
tx1.setText(tx1.getText().toString() s.getType() "加速传感器accelerometer" tempString);
break;
caseSensor.TYPE_GYROSCOPE:
tx1.setText(tx1.getText().toString() s.getType() "陀螺仪传感器gyroscope" tempString);
break;
caseSensor.TYPE_LIGHT:
tx1.setText(tx1.getText().toString() s.getType() "环境光传感器light" tempString);
break;
caseSensor.TYPE_MAGNETIC_FIELD:
tx1.setText(tx1.getText().toString() s.getType() "电磁场传感器magneticfield" tempString);
break;
caseSensor.TYPE_ORIENTATION:
tx1.setText(tx1.getText().toString() s.getType() "方向传感器orientation" tempString);
break;
caseSensor.TYPE_PRESSURE:
tx1.setText(tx1.getText().toString() s.getType() "压力传感器pressure" tempString);
break;
caseSensor.TYPE_PROXIMITY:
tx1.setText(tx1.getText().toString() s.getType() "距离传感器proximity" tempString);
break;
caseSensor.TYPE_TEMPERATURE:
tx1.setText(tx1.getText().toString() s.getType() "温度传感器temperature" tempString);
break;
default:
tx1.setText(tx1.getText().toString() s.getType() "未知传感器" tempString);
break;
}
}
}
}
4、连接真机Milestone,显示结果如下:
5.结合以上程序,我们做一些解释。
1)Android所有传感器都属于传感器管理器 SensorManager 获取传感器管理器的方法很简单:
String service_name = Context.SENSOR_SERVICE;
SensorManager sensorMaager = (SensorManager)getSystemService(service_name);
2)现阶段Android支持的传感器有8种,它们分别是:
传感器类型常量
内部整数值
中文名称
Sensor.TYPE_ACCELEROMETER
1
加速度传感器
Sensor.TYPE_MAGNETIC_FIELD
2
磁力传感器
Sensor.TYPE_ORIENTATION
3
方向传感器
Sensor.TYPE_GYROSCOPE
4
陀螺仪传感器
Sensor.TYPE_LIGHT
5
环境光照传感器
Sensor.TYPE_PRESSURE
6
压力传感器
Sensor.TYPE_TEMPERATURE
7
温度传感器
Sensor.TYPE_PROXIMITY
8
距离传感器
3)从传感器管理器中获取其中某个或者某些传感器的方法有如下三种:
第一种:获取某种传感器的默认传感器
Sensor defaultGyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
第二种:获取某种传感器的列表
List pressureSensors = sensorManager.getSensorList(Sensor.TYPE_PRESSURE);
第三种:获取所有传感器的列表,我们这个例子就用的第三种
List allSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
4)对于某一个传感器,它的一些具体信息的获取方法可以见下表:
方法
描述
getMaximumRange()
最大取值范围
getName()
设备名称
getPower()
功率
getResolution()
精度
getType()
传感器类型
getVentor()
设备供应商
getVersion()
设备版本号