分享地址:http://www.androidegg.com/portal.php?mod=view&aid=578
1.1 序言 ?
?【Android蛋蛋网】在这一章我们主要针对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() | 返回传感器的版本号 |
?
1.3.2? android.hardware.SensorManager类
? 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 void unregisterListener(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 方法中取得传感器的名字