Отключение вызова Keyguard в приложении зависает на телефоне

В проекте Android 6.0 я пытаюсь разблокировать телефон с помощью датчика приближения.

Это то, что у меня есть для события OnSensorChanged:

    public void onSensorChanged(SensorEvent event) {
            proxValue = (event.values[0]); //sensor value stored in proxValue
            keyguardManager = (KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE);
            lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
            screenLock = ((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
    /*when service is running and phone is locked
     and proximity sensor value is less than 2.0 centimeters*/
            if(isMyServiceRunning(StartStopService.class) && lockStatus == true && proxValue < 2){
                Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                v.vibrate(500); // vibrate for 500 ms 
                screenLock.acquire(); //to wake the phone up
                lock.disableKeyguard(); //to unlock the phone
                keyguardDisabled = true; // boolean to check keyguard status

            }
        }

На моем ScreenReceiver у меня есть:

public class ScreenReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            keyguardManager = (KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE);
            lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
            screenLock = ((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(
                    PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
            if((intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) || !(intent.getAction().equals(Intent.ACTION_USER_PRESENT)))
            {
                lockStatus = true;
                if(keyguardDisabled){
                    lock.reenableKeyguard();
                    screenLock.release();
                    keyguardDisabled = false;

                }
            }
            else
            {
                lockStatus = false;
            }
        }
    }

Проблема возникает, когда я вызываю lock.disableKeyguard(). Он успешно разблокирует и пробуждает телефон, но телефон зависает, когда я нажимаю кнопку «Домой». Я знаю, что в какой-то момент мне нужно снова включить блокировку клавиатуры, но где? В чем может быть решение или есть другой способ разлочить телефон программно?


person Kaan Demirel    schedule 24.04.2016    source источник


Ответы (1)


Если у кого-то возникнет такая же проблема, я решил ее, создав действие и в методе onCreate я добавил:

//StartStopActivity
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | 
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | 
WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);

На моем сервисе я начал деятельность следующим образом:

//StartStopService
Intent dialogIntent = new Intent(this, StartStopActivity.class);
                dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(dialogIntent);

Старый метод не работает для Marshmallow и устарел.

person Kaan Demirel    schedule 05.05.2016