ti-enxame.com

Atividade do Android sobre a tela de bloqueio padrão

Como posso exibir um Activity ou Dialog para ficar visível na tela de bloqueio?

Eu já tentei exibir minha atividade de bloqueio quando a tela liga definindo vários tipos de janelas no método Activity.onCreate()

TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_KEYGUARD

e outros, juntamente com as permissões SYSTEM_ALERT_WINDOW e INTERNAL_SYSTEM_WINDOW.

Minha atividade é visível depois que eu desbloqueio o dispositivo.

ATUALIZAR:

Eu na verdade já consegui exibir minha própria atividade em vez da tela de bloqueio padrão. Funciona perfeitamente a menos que você use o botão HOME.

67
plugmind
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

tente usar esses sinalizadores para desativar a tela de bloqueio quando a atividade for iniciada.

Após o nível 17 da API, você pode usar 

<activity
        Android:name=".yourActivityName"
        Android:showOnLockScreen="true"
        Android:screenOrientation="sensorPortrait" >

showOnLockScreen como no exemplo ...

114
Enes

Não vá para a atividade, porque o Android não vai mostrar a tela de bloqueio por trás de sua atividade por razões de segurança, então use o serviço em vez de Atividade.

Abaixo está meu código no onStartCommand do meu serviço.

WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

View mView = mInflater.inflate(R.layout.score, null);

WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
/* | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON */,
PixelFormat.RGBA_8888);

mWindowManager.addView(mView, mLayoutParams);

E adicione <uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW" /> para manifestar

29
Shirish Herwade

Use isso no método onCreate 

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);  
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
// This line should be before setContentView..      
setContentView(......);

Espero que isso funcione Obrigado

19
SarwarCSE

Você pode usar o código em qualquer uma das respostas aqui que você acha que está funcionando. Então, para impedir que o botãoHOMEfuncione, altere TYPE_SYSTEM_ALERT ou TYPE_SYSTEM_OVERLAY (depende do que você usa atualmente) para TYPE_SYSTEM_ERROR:

params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
    WindowManager.LayoutParams.FLAG_FULLSCREEN | 
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,
    PixelFormat.TRANSLUCENT
);
params.gravity = Gravity.TOP;
mOverlay = (RelativeLayout) inflater.inflate(R.layout.main, (ViewGroup) null);
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mWindowManager.addView(mOverlay, params);
0
A. N