我正在尝试创建一个自定义电话应用程序,而我正在尝试实现的功能之一是在将手机靠近脸部时关闭屏幕,以避免意外触摸。
我已经阅读了android文档中的接近传感器,并看到此确切功能是通过PROXIMITY_SCREEN_OFF_WAKE_LOCK
WakeLock实现的。
我创建了一个测试应用程序以单独测试此功能,其中包括两个按钮:一个需要唤醒锁,另一个需要释放锁。
class MainActivity: AppCompatActivity() {
private lateinit var mPowerManager:PowerManager
private lateinit var mWakeLock:PowerManager.WakeLock
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mPowerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
mWakeLock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "TEST_PROXIMITY_SENSOR_TAG:wake_lock_tag")
button_activate.setOnClickListener {
if (!mWakeLock.isHeld)
mWakeLock.acquire()
}
button_deactivate.setOnClickListener {
if (mWakeLock.isHeld)
mWakeLock.release()
}
}
}
并将以下WakeLock权限添加到我的AndroidManifest.xml
<uses-permission android:name="android.permission.WAKE_LOCK" />
在大多数情况下,此代码可以正常工作。但是,有时当我解除对接近传感器的阻挡时,屏幕会在10到30秒钟内打开,而不是立即打开。
[起初,虽然这是我正在测试的物理设备(Nexus 5,android Pie)的硬件问题,但是我向活动添加了接近传感器值的其他日志记录。
override fun onCreate(savedInstanceState: Bundle?) {
...
mSensorManager = getSystemService(SENSOR_SERVICE) as SensorManager
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)
mSensorManager.registerListener(
this as SensorEventListener,
mSensor,
SensorManager.SENSOR_DELAY_NORMAL
)
}
override fun onSensorChanged(event: SensorEvent?) {
Log.d(TAG,"${event?.values?.get(0)}")
}
传感器报告正确的测量值。当屏幕被WakeLock错误关闭时,传感器报告“远”。
我已经使用默认的拨号器应用程序测试了相同的方案,但是效果很好。我的实现有什么问题?我查看了AOSP拨号程序代码和Signal的android应用程序,但找不到明显的区别。