前言

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

简介

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

效果图


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

加速度传感器

1. 首先声明SensorManager和Sensor

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

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

 @Overridepublic 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() {@Overridepublic 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()方法中的处理

@Overridepublic 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中加速和位置传感器的使用相关推荐

  1. 一文读懂,Android中的硬件加速

    /   今日科技快讯   / 近日,携程发布<2023年春节旅游总结报告>.报告显示,春节期间国内外旅行订单皆迎来三年巅峰,旅游订单整体较虎年春节增长4倍.同时,春节期间出境游整体订单同比 ...

  2. Android中图片的三级缓存策略

    在开发过程中,经常会碰到进行请求大量的网络图片的样例.假设处理的不好.非常easy造成oom.对于避免oom的方法,无非就是进行图片的压缩.及时的回收不用的图片.这些看似简单可是处理起来事实上涉及的知 ...

  3. Flutter混合开发:Android中如何启动Flutter

    目录 现有项目中引入Flutter 启动flutter页面 加速启动 启动传参 flutter可以独立完成项目,但是在现有项目情况下最好的方式就是混合开发,逐步过渡.这样就会共存native和flut ...

  4. Android中的动画

    视频课:https://edu.csdn.net/course/play/7621 学习内容 Ø 帧动画 Ø 补间动画 Ø 动画方式切换组件 能力目标 Ø 掌握Android中动画的基本概念及分类 Ø ...

  5. Android多媒体开发-- android中OpenMax的实现整体框架

    1.android中用openmax来干啥? android中的 AwesomePlayer就 是用openmax来做(code)编解码,其实在openmax接口设计中,他不光能用来当编解码.通过他的 ...

  6. android ndk怎样加载o文件_在Android中使用TFLite c++部署

    之前的文章中,我们跟大家介绍过如何使用NNAPI来加速TFLite-Android的inference(可参考使用NNAPI加速android-tflite的Mobilenet分类器).不过之前介绍的 ...

  7. android surfaceflinger 代码,Android 中的framebuffer和SurFaceFlinger的关系

    FrameBuffer 在Android中并不像在其它GUI那样直观,抽象的层次比较多,加上GUI的更新是通过OpenGLES来做的.所以让人很难搞清GUI更新的整个流程,最近要准备一个讲稿,所以花了 ...

  8. java简述常见的布局极其特点_请简要说明 Android 中五种常见布局的特点。_学小易找答案...

    [简答题]请简要说明有序广播和无序广播的区别 [简答题]请简要说明 Android 程序结构中 AndroidManifest.xml 的功能? [简答题]简述李村站人工办理进路的作业过程. [简答题 ...

  9. Android 系统(175)---Android硬件加速原理与实现简介

    Android硬件加速原理与实现简介 在手机客户端尤其是Android应用的开发过程中,我们经常会接触到"硬件加速"这个词.由于操作系统对底层软硬件封装非常完善,上层软件开发者往往 ...

最新文章

  1. 【组队学习】【31期】基于Python的办公自动化
  2. Greenplum 2000亿 近似度查询 性能 以及注意事项
  3. Apache ZooKeeper - JMX监控 ZooKeeper 的运行状态
  4. 【django】 F 和 Q 对象
  5. 【IDEA】干掉注释自动在行首
  6. 深度学习在AEC中的应用探索
  7. 1、css引入的方式有哪些?_低氮燃烧技术都有哪些?
  8. mysql学习day05—子查询 / CASH语句 / 连接查询
  9. C++中#和##的特殊使用
  10. Head First设计模式之命令模式
  11. 附加:下半部分sql语句 区/县(数据表)
  12. 贴吧云签到php源码,Tieba-Cloud-Sign: 百度贴吧云签到,在服务器上配置好就无需进行任何操作便可以实现贴吧的全自动签到。配合插件使用还可实现云灌水、点赞、封禁、删帖、审查等功能...
  13. Check list of writing
  14. 写二语习得学年论文感想
  15. win10在此计算机上找不到系统映像,图文教你win10系统使用DISM修复找不到源的问题....
  16. 如何搭建个人博客网站(Mac)
  17. 理解数字信号处理的三把钥匙
  18. matlab图形编辑,Matlab图形与编辑
  19. 支撑日均百万订单的微服务架构应该这么搞
  20. 软体机器人对工业应用的影响

热门文章

  1. Coursera | Introduction to Data Science in Python(University of Michigan)| Assignment4
  2. git push提交成功后如何撤销回退
  3. Idea中GsonFormat插件安装
  4. 最简单的 Git 入门教程
  5. 成为一个有目标的学习者
  6. 单片机读取EEPROM(AT24C64)值为0xff问题解决方法
  7. poi编辑word中的chart,对图表数据替换,并刷新图表
  8. 如何配置NAT Server?
  9. python网络编程学什么_python网络编程学习《一》
  10. Linux下ll命令