原帖地址:http://www.androidegg.com/portal.php?mod=view&aid=578 谢谢原作者的分享
摘要: 主要介绍传感器的种类,常用方法,事件等,通过例程进行讲解分析。传感器(Sensor)听起来似乎感觉很难,其实它并不是很难。做起来并很有意思的,我相信,通过我对传感器的介绍你会对它感兴趣的,应为你可以切身体会到 ...
1.1 序言
在这一章我们主要针对Android的传感器(Sensor)进行说明。如果说Java的程序和硬件有些远的感觉,那么可以说传感器距离硬件很近。传感器(Sensor)听起来似乎感觉很难,其实它并不是很难。做起来并很有意思的,我相信,通过我对传感器的介绍你会对它感兴趣的,应为你可以切身体会到它的存在。
1.2 传感器(Sensor)是什么?
传感器是能标识温度,加速度等等物理现象的转换电子信号的机器。Android SDK,在移动设备中提供了各种各样的传感器的API。那么,本章的例程,在模拟器中不能使用,这点请大家注意。需要在实际的手机上测试才能体现。这里我就不进行详细进行说明如何连接手机进行运行程序了,在本网站 【Android蛋蛋网】有对应的介绍,请读者自己参照。
1.3 传感器(Sensor)关联的类(Class)和接口(Interface)
首先,我们对Android SDK提供的传感器关联的类和接口进行介绍。
1.3.1 android.hardware.Sensor类
Sensor类,是管理各种传感器的共同属性(名字,版本等等)的类。
●主要的常量
在Sensor类,能使用的传感器的种类通过常量来定义的(表1-1)。但是根据硬件,传感器搭载是任意的。比如现在市场销售的(Dev Phone,HTC Dream)实际确认有
TYPE_ACCELEROMETER,
TYPE_ORIENTATION,
TYPE_MAGNETIC_FIELD,
TYPE_TEMPERATURE
四种类别。
表1-1 传感器的种类
常量名
|
说明
|
实际的值
|
TYPE_ACCELEROMETER
|
加速度
|
1
|
TYPE_GYROSCOPE
|
陀螺仪
|
4
|
TYPE_LIGHT
|
光照
|
5
|
TYPE_MAGNETIC_FIELD
|
磁力计
|
2
|
TYPE_ORIENTATION
|
方位传感器
|
3
|
TYPE_PRESSURE
|
压力传感器
|
6
|
TYPE_PROXIMITY
|
距离传感器
|
8
|
TYPE_TEMPERATURE
|
温度传感器
|
7
|
TYPE_ALL
| 全部的传感器 |
-1
|
●主要的方法
Sensor类的主要的方法参照下面的表1-2
方法
|
处理内容
|
public float getMaximumRange()
|
返回传感器的最大值 |
public String getName() |
返回传感器的名字
|
public float getPower()
| f返回传感器的功率(mA毫安) |
public float getResolution()
|
返回传感器的精度 |
public int getType()
|
返回传感器的类型 |
public String getVentor()
|
返回Vendor名 |
public int getVersion()
| 返回传感器的版本号 |
SensorManager类是对搭载的移动设备的传感器进行访问的类,用这个类的借口能取得事件监听器的登录/删除、传感器的信息。
●主要的常量
在SensorManager有很多个常量被定义,但是这些中最重要的是关于传感器的反应速度的,如(表1-3)。Android,在监听器进行登录的时候通过4个阶段对传感器进行设定的。
表1-3 关于传感器的反映速度的常量
常量名
|
说明
|
实际的值
|
SENSOR_DELAY_FASTEST
|
在游戏想特别快的反应速度的时候使用 |
0
|
SENSOR_DELAY_GAME
|
游戏用
|
1
|
SENSOR_DELAY_UI
|
用户接口用
|
2
|
SENSOR_DELAY_NORMAL
|
取得倾斜度的时候使用(缺省)
|
3
|
●主要的方法
SensorManager类的主要方法如表1-4所示
表1-4 SensorManager类的主要方法
方法
|
处理内容
|
public boolean registerListener( SensorEventListener listener, Sensor sensor, int rate) | 登录被指定反应速度的监听器。反应速度的指定,使用前面的(表1-3)的SENSOR_DELAY系列常量 |
public void unregisterListener(SensorEventListener listener) |
解除全部的传感器的监听器的登录 |
public voidunregisterListener(SensorEventListener listener, Sensor sensor) | 解除在sensor被指定的监听器的登录 |
public List getSensorLIst(int type)
|
用list形式取得能使用的传感器的接口
|
1.3.3 SensorManager类的Instance取得例程
SensorManager不能直接生成Instance。SensorManager的Instance是通过Context类定义的getSystemService方法取得的。在图1-1的Activity,SensorManager的Instance取得,传感器的名字取得,具体代码如下。
图1-1 传感器的信息取得例程
AndroidEggSensorActivity.java
package androidegg.stu.sensor;
import java.util.List;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;
public class AndroidEggSensorActivity extends Activity implements SensorEventListener{
/** Called when the activity is first created. */
//SensorManager instance
private SensorManager sensorManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//get SensorManager instance
sensorManager = (SensorManager)this.getSystemService(SENSOR_SERVICE);
setContentView(R.layout.main);
}
@Override
protected void onResume(){
super.onResume();
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
TextView tv;
for (Sensor s:sensors){
tv = new TextView(this);
tv.setText(s.getName());
layout.addView(tv,new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
}
setContentView(layout);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
}
}
1 在onCreate 方法中取得 SensorManager 的Instance
2 在onResume 方法中取得传感器的名字,并表示