传感器(本机传感器)
概述
大多数安卓设备都内置了传感器,用来测量移动,方向和各种环境条件。
Android平台支持以下三类传感器:
- 这些传感器能够提供精度高且准确的原始数据。
- 如果要监视三维设备运动或定位,或者监视设备周围的环境变化,那么传感器会极其有用。
- 例如:游戏可以追踪设备重力感应器的读数来推断复杂的用户手势和动作,比如倾斜,摇晃,旋转或摆动。
- 同样地,天气应用程序可以使用设备温度传感器和湿度传感器来计算并报告dewpoint,旅行应用程序可以使用地磁传感器和加速计来报告罗盘方位。
1.运动传感器:这些传感器测量三个轴的加速力和旋转力。这一类别包括加速度计,重力感应器,陀螺仪和旋转矢量传感器。
2.环境传感器:这些传感器测量各种环境参数,例如环境空气温度和压力,照明和湿度。此类别包括了气压计,光度计和温度计。
3.位置传感器:这些传感器测量了设备的物理位置。此类别包括方向传感器和磁力计。
Google文档上把传感器类型分为传感器坐标轴、基础传感器和复合传感器(动作传感器、姿势传感器、未校准传感器和互动传感器)
更加具体的可以参考:https://source.android.google.cn/devices/sensors/sensor-types
获取本机支持的传感器
Android传感器框架是android.hardware包的一部分,包含下面的类和接口:
- SensorManager :你能使用这个类来创建一个传感器服务的实例。这个类提供了各种方法类访问和列举传感器,注册和注销传感器事件监听,并获取相应的信息。这个类也提供了几个传感器的常量,用户报告传感器的精确度,设置数据获取速率,和校准传感器。
- Sensor :你能使用这个类类创建一个指定传感器的实例。这个类提供了各种方法让你确定传感器的功能。
- SensorEvent :系统使用这个类来创建一个传感器对象,它提供了关于传感器事件的信息。一个传感器事件包含一下信息:原始传感器数据,这类传感器产生的事件,数据的准确性,和事件的时间戳。
- SensorEventListener :你能使用这个接口来创建两个回掉方法,当传感器的值改变或者当传感器的精度改变的时候,它接受通知(传感器事件)
SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
获取本机全部传感器列表
package com.example.sensor;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取系统传感器
SensorManager sm= (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//通过传感器获取本机所有的传感器
List<Sensor> sensors=sm.getSensorList(Sensor.TYPE_ALL);
for (Sensor s:sensors){
Log.i("tag",s.toString());
}
}
}
获取指定传感器
可以通过下图的代码来获取指定的传感器, 需要选择合适的传感器类型
返回一个Sensor对象
//获取指定的某一个传感器,下面为加速度传感器
Sensor type_accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
if(type_accelerometer!=null){
Log.i("type_accelerometer",type_accelerometer.toString());
}
传感器监听器
sm.registerListener(new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
//传感器数据变化,在该方中我们可以获取传感器变化的值
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//传感器精度变化
}
},type_accelerometer,SensorManager.SENSOR_DELAY_NORMAL);
- SENSOR_ DELAY _GAME 如果利用传感器开发游戏, 建议使用该值。 一般大多数实时行较高的游戏使用该级别。 (20000微 秒)
- SENSOR_ DELAY NORMAL默认的获取传感器数据的速度。 标准延迟,对于- -般的益智类游戏或者EASY界别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧的现象。 (200000微秒)
- SENSOR DELAY_ _UI 若使用传感器更新U,建议使用该值。(60000微秒)
- SENSOR DELAY _FASTEST :最低延迟,-般不是特别灵敏的处理不推荐使用,该模式可能造成手机电量大量消耗,而且由于传递的为大量的原始数据,算法处理不好将会影响游戏逻辑和U的性能。(0微秒延迟)不推荐使用
传感器坐标系
通常,传感器框架使用一个标准的3维坐标系来表达数据值。对于大多数传感器, 当设备放置默认的方向(看下图) 的时候,坐标系被定义和设备的屏幕相关。当设备放置为它默认的方向,X轴是水平并指向右边,Y轴是竖直并指向上方,并且Z轴指向屏幕面的外侧。在这个系统,坐标系统有负的2值。这个坐标系被用于下面的传感器:
- 加速度传感器 (Acceleration sensor)
- 重力传感器(Gravity sensor)
- 陀螺仪传感器 (Gyroscope)
- 线性加速度传感器 (Linear acceleration sensor)
- 磁场传 感器(Geomagnetic field sensor)
许多传感器的传感器事件值在相对于设备静止的特定坐标系中表示。
sm.registerListener(new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
//传感器数据变化,在该方中我们可以获取传感器变化的值
float x=event.values[0];
float y=event.values[1];
float z=event.values[2];
textView_content.setText("x="+x+"y="+y+"z="+z);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//传感器精度变化
}
},type_accelerometer,SensorManager.SENSOR_DELAY_NORMAL);