接近唤醒锁并不总是重新打开屏幕

Posted

技术标签:

【中文标题】接近唤醒锁并不总是重新打开屏幕【英文标题】:Proximity wake lock not always turning screen back on 【发布时间】:2020-02-28 13:03:40 【问题描述】:

我正在尝试创建一个自定义手机应用,我尝试实现的功能之一是在手机靠近脸部时关闭屏幕以避免意外触摸。

我在 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 应用程序,但找不到明显的区别。

【问题讨论】:

Signal's app 使用RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY 【参考方案1】:

如果没有完整的代码很难诊断,但请尝试检查您的实现是否正确here。还要检查here 中描述的所有标志和延迟。最后,您可以运行示例app。

【讨论】:

以上是关于接近唤醒锁并不总是重新打开屏幕的主要内容,如果未能解决你的问题,请参考以下文章

当手机从睡眠中唤醒时加载应用程序/活动

AppBarLayout 并不总是在向下滚动时重新输入

已终止的应用程序未使用 iBeacon 数据包唤醒

在带有许多线程唤醒的 iOS 8 上并不总是显示 EXC_RESOURCE 崩溃?

在 Android 1.5 服务中使用唤醒锁

LibreOffice 宏总是显示#NULL!重新打开文件后