Блокировка от пробуждения от сближения - PullRequest
1 голос
/ 02 ноября 2019

Я пытаюсь создать собственное приложение для телефона, и одной из необходимых функций является отключение экрана при приближении телефона к уху, чтобы избежать случайных прикосновений.

Я читал о близостидатчик в документации 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()
        }
    }
}

По большей части этот код работает нормально, но иногда экран не включается после того, как я убираю руку с датчика приближения, но экран по-прежнему реагирует насенсорные события. Когда это происходит, если я перемещаю руку над датчиком приближения и удаляю его, иногда он включает экран.

Сначала я подумал, что это аппаратная проблема с физическим устройством, с которым я тестировал (Nexus5, 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)}")
}

Поскольку я подозревал, что датчик был правильно синхронизирован с движением моей руки, и, как я описал выше, даже когда датчик приближения сообщал, что ничто не мешало ему, иногда экран зависал в выключенном положении. до тех пор, пока я не переключу его. Кроме того, я протестировал приложение для набора номера телефона по умолчанию, оно работает правильно и не имеет проблемы, описанной выше.

В чем проблема с моей реализацией? Я посмотрел на код набора номера AOSP и приложение Android для Signal, но не смог найти заметного различия.

...