当前位置: 代码迷 >> Android >> Android 传感器(Sensor)API课程 (一) 常用方法简介
  详细解决方案

Android 传感器(Sensor)API课程 (一) 常用方法简介

热度:428   发布时间:2016-05-01 12:58:06.0
Android 传感器(Sensor)API教程 (一) 常用方法简介

分享地址: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 方法中取得传感器的名字

  相关解决方案