Android中加速和位置传感器的使用

来源:互联网 发布:淘宝虾米vip兑换码在哪 编辑:程序博客网 时间:2024/06/02 18:22

前言

如今灯下闲读红袖添香,半生浮名只是虚妄。

简介

不知道大家有没有注意过,在我们接打电话的时候,当我们把手机放在耳边的时候,屏幕会自动熄灭,而当我们拿下来的时候,屏幕又亮了,这其实是Android中传感器的作用。所以今天就给大家带来一些Android中传感器的相关知识。
今天我们主要演示两个传感器的实例,分别是加速度传感器和距离传感器。微信中的摇一摇就是利用加速传感器的作用,而上面我们提到的屏幕熄灭的例子则是距离传感器的作用。

效果图


很勉强,没有效果的效果图。摇动后会切换图片,我们就不贴图了,大家可以自己实践下。

加速度传感器

1. 首先声明SensorManager和Sensor

SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);Sensor mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

2. 然后实现SensorEventListener接口并重写onSensorChanged(SensorEvent event)方法

 @Override    public void onSensorChanged(SensorEvent event) {        int sensorType = event.sensor.getType();        switch (sensorType) {            case Sensor.TYPE_ACCELEROMETER:                float[] values = event.values;                float xValue = values[0];                float yValue = values[1];                float zValue = values[2];                int compareValue = 20;                if (Math.abs(xValue) > compareValue || Math.abs(yValue) > compareValue || Math.abs(zValue) > compareValue) {                    Message message = mHandler.obtainMessage();                    message.what = SENSOR_SHAKE;                    mHandler.sendMessage(message);                }                break;        }    }

我们通过onSensorChanged方法中回传的SensorEvent的对象便可获得变化传感器的类型,并可以根据不同的传感器类型获取对应方向上的value。这里对于加速度传感器我们可以获取x,y和z轴方向上的加速度。
另外我们声明一个compareValue来和每个方向上的加速度来做比较,如果有一个方向上的值大于compareValue,我们就认为用户摇动了手机并通过hander发送消息实现图片的切换。另外对于不同的机型,由于其传感器的灵敏度不同,所以compareValue的值也会有差异。

3. hander更新ui

private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            int sensorValue = msg.what;            if (sensorValue == SENSOR_SHAKE) {                Toast.makeText(MainActivity.this, "摇动了" + index, Toast.LENGTH_SHORT).show();                index = index < 2 ? ++index : 0;                imageView.setImageResource(imageArray[index]);            }        }    };

这里我们声明了一个含有三张图片的数组imageArray,对于每次摇动我们就切换不同的图片。

4. 注册监听

mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);

最后我们需要使用SensorManager注册监听,这样我们的onSensorChanged()方法才能够触发。

距离传感器

对于距离传感器的使用和加速度传感器基本是一样的,差别就是注册的传感器类型不同和对于onSensorChanged()事件的处理不同。

1. 声明和注册

Sensor distanceSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);mSensorManager.registerListener(this, distanceSensor, SensorManager.SENSOR_DELAY_NORMAL);

2. 电源管理器的声明

由于这里我们需要改变屏幕的亮度,所以需要用到PowerManager对象

PowerManager mPowerManager = (PowerManager) getSystemService(POWER_SERVICE);mWakeLock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);

其中mWakeLock是PowerManager.WakeLock对象,对于其初始化的第一个参数,我们可以直接使用32(int),也可以使用PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK,但其要求最低版本是21。

3. onSensorChanged()方法中的处理

@Override    public void onSensorChanged(SensorEvent event) {        int sensorType = event.sensor.getType();        switch (sensorType) {            case Sensor.TYPE_PROXIMITY:                float[] proximityValues = event.values;                if (proximityValues[0] == 0.0) {                    Toast.makeText(this, "贴近手机", Toast.LENGTH_SHORT).show();                    if (mWakeLock.isHeld()) {                        return;                    } else {                        mWakeLock.acquire();                    }                } else {                    if (mWakeLock.isHeld()) {                        return;                    } else {                        mWakeLock.setReferenceCounted(false);                        mWakeLock.release();                    }                    Toast.makeText(this, "远离手机", Toast.LENGTH_SHORT).show();                }                break;        }    }

这里当有物体贴近手机时proximityValues值为0.0,我们通过mWakeLock的相关api来控制屏幕的亮与熄灭。

4. 权限配置

最后记得在清单文件中加上锁屏的权限

<uses-permission android:name="android.permission.WAKE_LOCK"/>

总结

以上就是对于加速度传感器和距离传感器的一些介绍,有兴趣的童鞋可以动手实践下。因为只有自己真正去做了,才能掌握并进而引发新的理解。
另外,今天是分步骤来讲的,没有贴出源码,所以有需要的童鞋可以去https://github.com/kuangxiaoguo0123/ATSensorStudy下载。

0 0
原创粉丝点击