Android 中传感器以三个浮点数为一组数据来描述设备所处的状态或周围的环境
当传感器测得状态发生变化时,调用SensorEventListener接口的OnSensorChanged(SensorEvent event)方法执行相关操作
这个方法的参数中的event传递了传感器的状态
在方法中可以用event.values[0]、event.values[1]和event.values[2]访问传感器测到的数据
在Android应用中使用传感器
1) 从系统服务中获取SensorManager
SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
2) 从SensorManager获取相应的传感器(Sensor)
Sensor sensor = sensorManager.getDefaultSensor(传感器类型常量);
常用的传感器有:加速传感器、重力传感器、陀螺仪、方向传感器、光线传感器等
在Sensor类中对各种类型传感器有对应的常量
传感器类型 | 常量 |
---|---|
加速传感器 | Sensor.TYPE_ACCELEROMETER |
重力传感器 | Sensor.TYPE_GRAVITY |
陀螺仪 | Sensor.TYPE_GYROSCOPE |
方向传感器 | Sensor.TYPE_ORIENTATION |
光线传感器 | Sensor.TYPE_LIGHT |
3) 注册传感器事件监听器(SensorEventListener)
sensorManager.registerListener(SensorEventListener listener, Sensor sensor, int samplingPeriodUs);
SensorEventListener是一个接口,实现SensorEventListener接口,需要覆盖两个方法:
void onSensorChanged(SensorEvent event)
void onAccuracyChanged(Sensor sensor, int accuracy)
Sensor是2中获取到的传感器
第三个参数是采样周期,同样SensorManager类对不同的级别有对应的常量,周期由小到大(即采样由快到慢)分别为:
级别 | 常量 |
---|---|
最快 | SensorManager.SENSOR_DEALY_FASTEST |
游戏 | SensorManager.SENSOR_DELAY_GAME |
普通 | SensorManager.SENEOR_DELAY_NORMAL |
UI | SensorManager.SENSOR_DELAY_UI |
4) 注销传感器事件监听器
sensorManager.unregisterListener(SensorEventListener listener);
代码示例:
将传感器数据在Activity中显示
1) 布局文件 activity_test.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="register" />
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="unregister" />
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
2) Test.java
public class Test extends Activity implements View.OnClickListener, SensorEventListener {
private TextView tv1;
private SensorManager sensorManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
//获取传感器服务
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
tv1 = (TextView) findViewById(R.id.tv1);
findViewById(R.id.btn1).setOnClickListener(this);
findViewById(R.id.btn2).setOnClickListener(this);
}
@Override
protected void onPause() {
super.onPause();
//离开Activity时注销监听器以节省资源
sensorManager.unregisterListener(this);
}
@Override
public void onClick(View v) {
int id = v.getId();
//获取传感器
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//注册监听器
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
} else if (id == R.id.btn2) {
//注销监听器
sensorManager.unregisterListener(this);
}
}
@Override
public void onSensorChanged(SensorEvent event) {
//获取传感器数据
float value0 = event.values[0];
float value1 = event.values[1];
float value2 = event.values[2];
//将数据显示到TextView中
tv1.setText(String.format("x:%f y:%f z:%f", value0, value1, value2));
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
}