业务描述
公司项目是做IM即时通讯的,在项目开发的过程中遇到这样一个需求:语音播放的场景下,当手机靠近面部时,显示屏熄灭,语音播放自动切换为听筒模式,当手机远离面部时,语音播放切换为扬声器模式。
实现思考
其实原理很简单,android手机一般都有距离感应装置,根据距离感应装置的相应回调参数去做听筒,扬声器,和屏幕点亮熄灭的操作。但是在开发中还是遇到了很多坑,下面会一一陈述。
代码开发
屏幕唤醒锁(WakeLock)
先说说这个WakeLock
powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, this.getClass().getName());
可以看出WakeLock是PowerManager的一个内部类。先说newWakeLock(int levelAndFlags, String tag)这个方法,改方法创建一个新的唤醒锁,需要两个参数,levelAndFlags是唤醒锁的类型,第二个参数tag就是WakeLock的一个tag。
在一个页面中可以有一个或者多个WakeLock,只要有一个WakeLock持有着屏幕,则屏幕不会熄灭
在newWakeLoke方法中我传入了PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK参数,关于该参数的描述
Wake lock level: Turns the screen off when the proximity sensor activates.
* If the proximity sensor detects that an object is nearby, the screen turns off
* immediately. Shortly after the object moves away, the screen turns on again.
简单就是说,当距离传感器感应到距离接近时就会关闭屏幕,当远离时就会关闭屏幕。