Я пытаюсь создать собственное приложение для телефона, и одной из необходимых функций является отключение экрана при приближении телефона к уху, чтобы избежать случайных прикосновений.
Я читал о близостидатчик в документации 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, но не смог найти заметного различия.