Android传感器

在Android系统中,提供了对传感器的支持。通过使用传感器,可以开发出很多新奇有趣的程序。小到水平仪、电子罗盘,大到各种传感器的游戏。这一应用大大增强了用户体验度。这一章节我们来学习传感器的开发及应用。
系统传感器:
这里写图片描述
传感器开发过程:
在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。坐标系统与加速度传感器坐标系相同。当设备复位时,重力传感器的输出与加速度传感器相同。

这里写图片描述

亮度传感器(Light),主要用来检测设备周围光线强度。光强单位是勒克斯(lux),其物理意义是照射到单位面积上的光通量。
这里写图片描述
本文内容主要讲解了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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值