加速度传感器

欢迎来到传感器的世界。 
传感器字面上的意思就是传递感觉的仪器,哪些感觉呢? 
视觉、听觉、味觉、触觉、嗅觉等等。 
所以有人说,传感器的存在和发展,让物体有了触觉、味觉和嗅觉等感官,让物体慢慢变得活了起来。 
当前Android设备中已经集成进数十个传感器,我们比较常见的有加速度传感器、陀螺仪、地磁传感器等。 
虽然种类繁多,但在Framework中仅仅提供了几个类和接口就把传感器相关的功能搞定了。下面我们以加速度传感器为例,引领大家走入Android传感器的世界。

传感器世界的坐标系

这里写图片描述 
x轴:从左到右 
y轴:从下到上 
z轴:从内到外

这个坐标系与Android 2D API中的不同,传感器中的返回值都以此坐标系为准。

API概况

sensor相关API被放到了android.hardware包下,我们主要使用的类有三个:Sensor、SensorEvent、SensorManager以及一个SensorEventListener接口。 
SensorManager顺其自然的担任起管理的工作,负责注册监听某Sensor的状态;Sensor的数据通过SensorEvent返回。

获得设备中所有可用sensor

SensorManager提供getSensorList方法,传入TYPE_ALL,即可得到当前设备所有传感器。

SensorManager sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
        List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
        mTvInfo.setText("sensors: " + sensors.size());
        Log.d(TAG, "sensors: " + sensors.size());
        for (int i = 0;i < sensors.size();++i) {
            Log.d(TAG,"sensor name: "+sensors.get(i).getName());
            Log.d(TAG,"sensor vendor: "+sensors.get(i).getVendor());
            Log.d(TAG,"sensor power: "+sensors.get(i).getPower());
            Log.d(TAG, "sensor resolution: " + sensors.get(i).getResolution());
        }

Sensor编码套路

public class SensorActivity extends Activity, implements SensorEventListener {
     private final SensorManager mSensorManager;
     private final Sensor mAccelerometer;

     public SensorActivity() {
         mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
         mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
     }

     protected void onResume() {
         super.onResume();
         mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
     }

     protected void onPause() {
         super.onPause();
         mSensorManager.unregisterListener(this);
     }

     public void onAccuracyChanged(Sensor sensor, int accuracy) {
     }

     public void onSensorChanged(SensorEvent event) {
     }
 }

不同的传感器被提取共性后,由上面的编码套路规定起来,一切就变得如此简单啦。

加速度传感器的背景

这里的加速度特指重力加速度,所以在静止时重力传感器的返回值与加速度传感器值相同。 
地表上静止物体的重力加速度约为9.8 m/s^2. 
借用SensorManager中的常量: 
public static final float STANDARD_GRAVITY = 9.80665F;

我们可以借助三轴上的值来确定设备的状态(请参考上面的坐标图),比如: 
1、当x轴的值接近重力加速度时,说明设备的左边朝下。 
2、当x轴的值接近负的g值时,说明设备的右边朝下。 
3、当y轴的值接近g值时,说明设备的下边超下(与上图一样)。 
4、当y轴的值接近负的g值时,说明设备的上边朝下(倒置)。 
5、当z轴的值接近g值时,说明设备的屏幕朝上。 
6、当z轴的值接近负的g值时,说明设备屏幕朝下。 

(1)加速度传感器 :加速度传感器又叫G-sensor,返回x、y、z三轴的加速度数值。  该数值包含地心引力的影响,单位是m/s^2。 
将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认9.81。  
将手机朝下放在桌面上,z轴为-9.81。    
将手机向左倾斜,x轴为正值。  将手机向右倾斜,x轴为负值。  
将手机向上倾斜,y轴为负值。将手机向下倾斜,y轴为正值。具体代码如下:

(2)在sensormanager的调用中为
#define SENSOR_TYPE_ACCELEROMETER //加速度
Android 中传感器的功能
SensorManager 是所有传感器的一个综合管理类,包括了传感器的种类、采样率、精准度等。
// 得到一个SensorManager对象
SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
// 得到传感器列表
List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
// 注册传感器
boolean result = mSensorManager.registerListener(this, sensors, SensorManager.SENSOR_DELAY_FASTEST);
// 卸载传感器
mSensorManager.unregisterListener(this);
// SensorEventListener有两个接口方法
// 在传感器值更改时调用
onSensorChanged(SensorEvent event);
// SensorEvent 对象包括一组浮点数
float x = event.values[SensorManager.DATA_X];
float y = event.values[SensorManager.DATA_Y];
float z = event.values[SensorManager.DATA_Z];
// 在传感器的精准度发生改变时调用
// 参数accuracy表示传感器新的准确值
onAccuracyChanged(Sensor sensor, int accuracy);


    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        Log.d("linc", "value size: " + sensorEvent.values.length);
        float xValue = sensorEvent.values[0];// Acceleration minus Gx on the x-axis
        float yValue = sensorEvent.values[1];//Acceleration minus Gy on the y-axis
        float zValue = sensorEvent.values[2];//Acceleration minus Gz on the z-axis
        mTvInfo.setText("x轴: "+xValue+"  y轴: "+yValue+"  z轴: "+zValue);
        if(xValue > mGravity) {
            mTvInfo.append("\n重力指向设备左边");
        } else if(xValue < -mGravity) {
            mTvInfo.append("\n重力指向设备右边");
        } else if(yValue > mGravity) {
            mTvInfo.append("\n重力指向设备下边");
        } else if(yValue < -mGravity) {
            mTvInfo.append("\n重力指向设备上边");
        } else if(zValue > mGravity) {
            mTvInfo.append("\n屏幕朝上");
        } else if(zValue < -mGravity) {
            mTvInfo.append("\n屏幕朝下");
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值