最近发现S4的通话距离感应起出了问题,接电话后直接熄屏,按什么按钮都没有反应。通话结束后只能等对方挂断才会恢复正常,再或者长按9秒电源键强制重启。极大的影响了实用体验。网上搜了下,发现这样的问题还不少。都是什么拆机清洁距离感应器了,送修等解决办法,耗时耗力还费钱。于是请教了两位大神,一位在做手机的预装软件开发,一位在做手机系统的二次开发。两位商量了下,猜测可能是距离感应器感应的结果由于各种原因和最初设定不一样了。让我试一下。

于是:三星输入*#0*#,会出现一大堆测试硬件功能的按钮,第三行中间sensor(传感器的意思),能够看到现在各种传感器的返回值。第二个就是距离感应器的数值了。我的前两个值分别为1.0和61。proximity是临近的意思,猜测是一个布尔值。ADC应该就是距离感应器的返回数值了。网上有数据说,系统初始设置45,我的肯定超了,所以proximity是1 ,系统认为是贴近物品了。得到这个结论,我也是无语了。不过还好有大神,指导我把系统预设阈值调高。问题很轻松的解决了。具体步骤如下:

步骤1、直接输入adb shell按回车;
步骤2、再输入su回车;
继续输入echo 0 > /sys/devices/virtual/sensors/proximity_sensor/prox_cal 回车;
       输入echo 1 > /sys/devices/virtual/sensors/proximity_sensor/prox_cal 回车;
如果没有返回任何错误信息,则继续。
步骤3、用手完全遮挡距离传感器
输入cat /sys/devices/virtual/sensors/proximity_sensor/state 回车
下面会显示:255或其他数值,继续。
步骤4、把手拿开再次输入cat /sys/devices/virtual/sensors/proximity_sensor/state 回车
返回的数值 可能会出显60或者其他数据,记下数值。
步骤5、输入cat /sys/devices/virtual/sensors/proximity_sensor/prox_cal 回车
如出现39,60,44三组数字或其他的数据,记下第一组数39,也就是第一个数。
步骤6、将步骤4和步骤5记下的数字相加,例如60+39=99,将99转为十六进制数结果为63。十六进制可以在系统自带计算器calc.exe计算出来:
步骤7、输入echo -en $'\x63' > /efs/prox_cal 按回车(\x后面是你计算出的十六进制数字)
继续输入
chown system:system /efs/prox_cal 回车
输入chmod 644 /efs/prox_cal 回车
输入sync 回车
输入reboot 回车

若输入“reboot”命令无法重启手机,请手动重启。

重启完毕以后问题解决。经测试,调整完后,proximity由0->1,ADC在138~140左右。proximity有1->0,ADC在123~125左右。嗯嗯,问题解决!