浅谈如何使用代码实现手机敲击识别

本文详细介绍了如何通过代码实现手机敲击识别,包括获取传感器数据、稳态识别和敲击识别三个步骤。通过处理线性加速度,判断手机受力情况,从而识别用户的敲击操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:郑童宇
GitHub:https://github.com/CrazyZty

1.前言

  现在市面上有不少Android手机支持敲击屏幕解锁,敲击屏幕解锁是一项很实用的功能,但一来只支持敲击屏幕,二来只能用于解锁或锁屏,再者我们应用层的开发者切不进去,完全无法玩起来。开发者,开发者,我们既然身为开发者何不搞点大新闻,那么这次我来教教各位如何用代码来实现手机的敲击识别,听起来是不是很有趣,有些跃跃欲试呢。事实上在ios上已经有实现这个功能的应用:Knock,一款敲击来解锁Mac电脑的应用,售价4.99美元,约为33人民币。有时候真想去做ios开发,可以开心的为自己的应用定价,愉悦的挣外快。言归正传,既然ios可以实现,那我们Android自然不能落伍,现在我就带领大家来用代码实现手机的敲击识别吧。
  本篇博文以Java为示例语言,以Android为示例平台。

2.功能实现

2.1.实现思路

  说到敲击识别,你们会考虑使用什么来实现呢,传感器?对,没错,作为手机手势姿态识别的唯一途径,我们自然需要使用传感器来实现对敲击的识别,但Android传感器种类繁多,我们应该选择哪一个呢?
  在Android2.3的时代,Android系统就已经定义了11个传感器,到了现在Android6.0的时代,系统定义的传感器数目已经达到26个,这么多传感器我们到底用哪一个呢,事实上我们只需要考虑2.3时代提供的那11个传感器即可,因为一方面后期加入的传感器部分如心跳传感器等需要硬件支持,导致很多手机无法支持此类传感器,另一方面2.3时代的11个传感器功能已经相当强大,可以支持绝大多数手势姿态的识别,那么现在我来列举一下上述11个传感器:
  SENSOR_TYPE_ACCELEROMETER                 加速度
  SENSOR_TYPE_MAGNETIC_FIELD                 磁力
  SENSOR_TYPE_ORIENTATION                      方向
  SENSOR_TYPE_GYROSCOPE                         陀螺仪
  SENSOR_TYPE_LIGHT                                   光线感应
  SENSOR_TYPE_PRESSURE              压力
  SENSOR_TYPE_TEMPERATURE            温度 
  SENSOR_TYPE_PROXIMITY             接近
  SENSOR_TYPE_GRAVITY                               重力
  SENSOR_TYPE_LINEAR_ACCELERATION       线性加速度
  SENSOR_TYPE_ROTATION_VECTOR             旋转矢量
  关于这11个传感器的详细描述,各位可以去http://www.oschina.net/question/163910_28354查看,事实上我一直怀疑LG G3的敲击解锁与光线传感器或接近传感器有关,因为我用手指悬浮在LG G3的头部正上方时一直无法敲击解锁,移开后恢复正常,而敲击锁屏应该只和触摸屏相关,因为无论我怎么遮挡传感器,敲击锁屏的功能完全不受影响。
  言归正传,对这11个传感器有所了解后,我们需要选择哪个或哪些传感器来实现功能呢,我们来模拟一下手机敲击的情况,将手机平放在桌面上,手指敲击手机的时候,手指给了手机一个力,同时桌面给予手机一个反作用力,考虑桌面不形变的情况下,手机受力平衡加速度为0,但这时手机的加速度传感器数据是否会有变化呢,答案是会的,手机加速度传感器的数据会有一段短暂但明显的变化,为什么呢,手机受力平衡加速度为0是因为它是一个整体,但内部构件还是会受到相互之间复杂的力的左右,并非受力的同时就达到受力平衡的,其实换个思路。用一个和手机形状相似内部光滑的容器,容器里面放几个玻璃球,敲击几下,容器不会移动,但玻璃球是不是移动了呢。虽然手机内部的构件远比玻璃球稳定,但也得遵循基本法,老老实实接受力的作用。
  上述场景是平放于桌面的场景,实际生活的场景往往更加复杂多样,但无论处于哪种场景,毫无疑问对手机的敲击操作都应该导致加速度传感器传出数据的明显变化,那么我们现在就明白了应该选择什么传感器作为我们敲击识别的工具了吧,但加速度相关的传感器有两个,加速度传感器和线性加速度传感器,我们应该选择哪一个呢,加速度传感器提供的数据是重力影响下的手机加速度,线性加速传感器提供的数据是排除重力影响的手机加速度,可以直观的反映排除重力后手机的受力情况,很合适用以敲击识别,那我们是否就应该选择线性加速度传感器呢,恰恰相反,我们要选择加速度传感器,Android提供的线性加速度传感器基于软件的,不同平台对于线性加速传感器的处理未必相同,事实上,在敲击三星S4,LG G3中一款机型的背面,就出现线性加速度传感器传出的数据没有较大变化的情况,保险起见,我们还是选用基于硬件的加速度传感器更合适一些。顺便吐槽一句,当时看到压力传感器的时候,我还以为监测作用于手机的压力的传感器,那无疑是很适合用于识别敲击,后面看到描述才知道是监测压强的。
  如上所说,对手机的敲击操作会导致加速度传感器传出数据的明显变化,故而本次功能实现中,判断是否有敲击操
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值