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下载。
- Android中加速和位置传感器的使用
- Android中传感器的使用:传感器和指南针
- android 加速的传感器(重力传感器)
- Android中传感器的使用
- 位置和传感器:位置传感器
- Android特色开发_位置与传感器的使用
- android---加速传感器
- Android 传感器 III-位置传感器
- 位置和传感器:传感器概览
- 位置和传感器:运动传感器
- 位置和传感器:环境传感器
- android 传感器的使用
- android传感器的使用
- android 传感器的使用
- Android 传感器的使用
- Android 传感器的使用
- Android 传感器的使用
- Android传感器的使用
- 过滤器、监听器、拦截器的区别
- c#创建Graphics对象的三种方法
- 用vim编辑二进制文件
- MFC的文件操作及其序列化
- 获取状态栏高度
- Android中加速和位置传感器的使用
- redis
- 分布式对象存储Ambry(2)基本使用API与集群容错测试
- 短时傅里叶变换的原理与应用:电话拨号声分析(3)
- 项目代码量统计(shell)
- 双联动listview
- Setup Ruby On Rails on macOS 10.12 Sierra
- CentOS 7 安全加固、检测、审计
- C#里为什么static virtual不能同时使用