ti-enxame.com

Ativar Android Dispositivo ativado

Ei, eu preciso acordar meu sono Android dispositivo em um determinado momento. Alguma sugestão?

P.S. Acorde: ative a tela e talvez desbloqueie o telefone

36
Coxer

O melhor é usar uma combinação apropriada desses sinalizadores de janela:

http://developer.Android.com/reference/Android/view/WindowManager.LayoutParams.html#FLAG_DISMISS_KEYGUARD
http://developer.Android.com/reference/Android/view/WindowManager.LayoutParams.html#FLAG_SHOW_WHEN_LOCKED
http://developer.Android.com/reference/Android/view/WindowManager.LayoutParams.html#FLAG_KEEP_SCREEN_ON
http://developer.Android.com/reference/Android/view/WindowManager.LayoutParams.html#FLAG_TURN_SCREEN_ON

Se você deseja executar em versões mais antigas da plataforma que não suportam os sinalizadores desejados, pode usar diretamente os bloqueios de ativação e bloqueios de proteção de teclado ... mas esse caminho é cheio de perigos.

UMA NOTA IMPORTANTE : Sua atividade deve ser em tela cheia para que o combinação de sinalizador acima para funcionar. No meu aplicativo, tentei usar esses sinalizadores com uma atividade que não é de tela cheia (tema de caixa de diálogo) e não funcionou. Depois de examinar a documentação, descobri que esses sinalizadores exigem que a janela seja uma janela de tela cheia.

32
hackbod

Para ativar a tela:

PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG");
wakeLock.acquire();

Para liberar o bloqueio da tela:

KeyguardManager keyguardManager = (KeyguardManager) getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE); 
KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG");
keyguardLock.disableKeyguard();

E o manifesto precisa conter:

<uses-permission Android:name="Android.permission.WAKE_LOCK" />
<uses-permission Android:name="Android.permission.DISABLE_KEYGUARD" />

Para obter mais detalhes sobre o PowerManager, consulte a documentação da API: http://developer.Android.com/reference/Android/os/PowerManager.html

EDIT: esta resposta é relatada como obsoleta.

73
Yar

Eu encontrei uma maneira e não é tão complexo ... funciona em qualquer versão da API.

Você precisa usar o método PowerManager.userActivity(l, false) e registrar sua atividade como transmissão recebida para a intenção SCREEN_OFF:

Em sua atividade, o OnCreate coloca algo como:

mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v(TAG, "Screen OFF onReceive()");
        screenOFFHandler.sendEmptyMessageDelayed(0, 2000L);
    }
};

Ele inicia o manipulador após 2 segundos do evento Screen Off.

Registre o receptor no seu método onResume ():

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
registerReceiver(mReceiver, filter);
Log.i(TAG, "broadcast receiver registered!");

Crie um manipulador como o abaixo:

private Handler screenOFFHandler = new Handler() {

    @Override
    public void handleMessage(Message msg) {

        super.handleMessage(msg);
        // do something
        // wake up phone
        Log.i(TAG, "ake up the phone and disable keyguard");
        PowerManager powerManager = (PowerManager) YourActivityName.this
                .getSystemService(Context.POWER_SERVICE);
        long l = SystemClock.uptimeMillis();
        powerManager.userActivity(l, false);//false will bring the screen back as bright as it was, true - will dim it
    }
};

Solicite permissão no seu arquivo de manifesto:

<uses-permission Android:name="Android.permission.WAKE_LOCK" />

Não se esqueça de cancelar o registro do receptor de transmissão quando terminar. Você pode fazer isso em onDestroy (), por exemplo (o que não é garantido)

unregisterReceiver(mReceiver);
Log.i(TAG, "broadcast UNregistred!");
7
mishkin

Em dispositivos mais novos, você deve usar algo como isto, pois os sinalizadores mencionados estão obsoletos.

class AlarmActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_alarm)

        // Keep screen always on, unless the user interacts (wakes the mess up...)
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

        setTurnScreenOn(true)
        setShowWhenLocked(true)

        (getSystemService(KeyguardManager::class.Java) as KeyguardManager).requestDismissKeyguard(this,
            object: KeyguardManager.KeyguardDismissCallback(){
                override fun onDismissCancelled() {
                    Log.d("Keyguard", "Cancelled")
                }

                override fun onDismissError() {
                    Log.d("Keyguard", "Error")
                }

                override fun onDismissSucceeded() {
                    Log.d("Keyguard", "Success")
                }
            }
        )
    }
}

KeyguardManager.requestDismissKeyguard Apenas ativa o dispositivo se o setter setTurnScreenOn(true) tiver sido chamado anteriormente.

Eu testei isso no meu Android Pie device.

1
Palm

Se você estiver exibindo uma janela ao acordar, poderá fazê-la funcionar facilmente adicionando alguns sinalizadores à sua atividade, sem usar um bloqueio de ativação.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
1
Lahiru Chandima
getWindow().addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);

dispensará a proteção geral do teclado e fará com que o dispositivo seja desbloqueado.

0
Prativa

Acertar um alarme programaticamente acordará o telefone (reproduzir um som) e acho que a exibição no visor seria uma opção lá.

Acho que não haveria uma API exposta que desbloqueie o telefone automaticamente.

0
schar