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

问题描述 投票:4回答:1

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

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

android wakelock proximity
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.