Android传感器

在Android系统中,提供了对传感器的支持。通过使用传感器,可以开发出很多新奇有趣的程序。小到水平仪、电子罗盘,大到各种传感器的游戏。这一应用大大增强了用户体验度。这一章节我们来学习传感器的开发及应用。
系统传感器:
Android传感器_第1张图片
传感器开发过程:
在Android平台下开发传感器应用程序,分为以下几个步骤:
(1)调用Context.getSystemService(SENSOR_SERVICE)方法获取传感器管理服务。
(2)调用SensorManager的getDefaultSensor(int type)方法,获取指定类型的传感器。
(3)在Activity的onResume()中,调用SensorManager的registerListener(SensorEventListener listener, Sensor sensor, int rate)方法注册监听。
rate支持的参数如下:
Sensor.manager.SENSOR_DELAY_FASTEST:延迟0ms,;
Sensor.manager.SENSOR_DELAY_GAME:延迟20ms,适合游戏的频率;
Sensor.manager.SENSOR_DELAY_UI:延迟60ms,适合普通界面的频率;
Sensor.manager.SENSOR_DELAY_NORMAL:延迟200ms,正常频率;
(4)实现SensorEventListener接口中下列两个方法,监听并取得传感器Sensor的状态。

在Android系统中提供了10余种传感器,接下来我们选择几种常用的传感器,逐一介绍其开发及应用。
加速度传感器(Accelerometer)简称G-sensor,主要用于感应设备的运动。该传感器捕获三个参数,分别表示空间坐标系中X、Y、Z轴方向上的加速度减去重力加速度在相应轴上的分量,其单位均为m/s2。

磁力传感器(MagneticField)简称为M-sensor,主要感应设备的磁场变化。该传感器捕获X、Y、Z三个轴上的环境磁场数据。该数值的单位是微特斯拉(micro-Tesla),用uT表示。
方向传感器(Orientation)简称为O-sensor,主要感应方位的变化。现在已经被SensorManager.getOrientation()所取代,我们可以通过磁力计MagneticField和加速度传感器Accelerometer来获得方位信息。该传感器同样捕获三个参数,分别代表手机沿传感器坐标系的X轴、Y轴和Z轴转过的角度。
values[0]:azimuth方向角,但用(磁场+加速度)得到的数据范围是(-180~180)。也就是说,0表示正北,90表示正东,180/-180表示正南,-90表示正西。而直接通过方向感应器数据范围是(0~359)360/0表示正北,90表示正东,180表示正南,270表示正西。
values[1]:pitch倾斜角,围绕X轴的旋转角。由静止状态开始,前后翻转,取值范围为-180度到180度。
values[2]:roll旋转角,围绕Y轴的旋转角。由静止状态开始,左右翻转,取值范围为-90度到90度。
重力传感器(Gravity)简称GV-sensor,主要用于输出重力数据。在地球上,重力数值为9.8,单位是m/s^2。坐标系统与加速度传感器坐标系相同。当设备复位时,重力传感器的输出与加速度传感器相同。

Android传感器_第2张图片

亮度传感器(Light),主要用来检测设备周围光线强度。光强单位是勒克斯(lux),其物理意义是照射到单位面积上的光通量。
Android传感器_第3张图片
本文内容主要讲解了Android系统中,常用传感器的开发及应用。本文重点在于如何在真机上测试自己开发的应用程序,我们开发的程序最终都是运行在真机上,掌握真机测试十分重要。读者可以在掌握了这些传感器的使用之后,自主开发一些传感器小应用程序,更加深入地学习传感器的应用。

获取传感器的数值:

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mMAGNETIC=mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        mAcc = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

        if(mAcc != null) {
            mSensorManager.registerListener(this, mAcc, SensorManager.SENSOR_DELAY_UI);
        }

        mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

        if(mLight != null) {
            mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_UI);
        }

        mGRAVITY = mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);

        mMAGNETIC = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);//micro-Tesla (uT)

        if(mMAGNETIC != null) {
            mSensorManager.registerListener(this, mMAGNETIC, SensorManager.SENSOR_DELAY_UI);
        }

指南针:

        SensorManager.getRotationMatrix(rotate,null,accelerometerValues,magneticFieldValues);
        SensorManager.getOrientation(rotate,values);

        values[0]=(float) ((values[0])*180/Math.PI);
        orgs=(int)values[0];
        pointKey=toEast(orgs);
        tvPressure.setText(pointKey);
    private static String toEast(int num) {
        if(num<45&&num>=-45)return "NORTH";
        else if(num>=45&&num<135)return "EAST";
        else if(num>=135&&num<=180)return "SOUTH";
        else if(num>=-180&&num<-135)return "SOUTH";
        else if(num>=-135&&num<-45)return"WEST";
        else return "NULL";
    }

https://github.com/EthanRay/AndroidSenorsPro/tree/master

你可能感兴趣的:(android,传感器,应用)