Android Galaxy S4 – Atividade visível na canvas de bloqueio

Alguns anos atrás, escrevi um aplicativo de alairme que funcionou no Android 2, e agora estou tentando atualizá-lo paira funcionair no Android 4. Especificamente, no Samsung Galaxy S4.

No Android 2, se o telefone estivesse dormindo, ele astringria o telefone e exibiria uma canvas "Snooze or Dismiss" na canvas de bloqueio.

  • Serviço contínuo de reconhecimento de fala do Android
  • ListViewDraggingAnimation quebrado no Android 5 Lollipop
  • Possível configurair a prioridade BroadcastReceiview com programação?
  • Qual é a diferença entre compilation, testCompile e fornecido na dependência gradle
  • Mostra sempre a bairra de rolagem paira ListView
  • Alguma maneira de descobrir dispositivos Android na sua networking?
  • No Android 4, ele levanta o telefone, mas você deve desbloqueá-lo e, em seguida, abra a área de notifications e clique na notificação do alairme antes de poder "Descairtair".

    Sempre usei este código paira fazer a vigília:

    getWindow().addFlags(WindowManager.LayoutPairams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutPairams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutPairams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutPairams.FLAG_TURN_SCREEN_ON); 

    Eu li 8 perguntas de stackoviewflow diferentes sobre este assunto. A maioria deles fornece o código acima, que funcionou paira mim há anos no Android 2, mas não funciona no Android 4. Mas nenhum deles me ajudou a resolview esse problema. Aqui estão as perguntas que eu li e tentei:

    Android: remova ou desative programaticamente a canvas de bloqueio no dispositivo Samsung Galaxy S2

    Como exibir uma canvas de canvas cheia TYPE_SYSTEM_ALERT?

    Como faço paira criair uma atividade visível em cima da canvas de bloqueio

    Como iniciair uma checkbox de dialog (como dimiss / snooze de alairme) que pode ser clicada sem desbloqueair a canvas

    Atividade do Android em cima da canvas de bloqueio padrão

    dispositivo Android bloqueado, mas deseja que o alairme soe e apaireça o dialog

    Diálogo do Android sobre a canvas de bloqueio

    Mostrair dialog com events de toque ao longo da canvas de bloqueio no Android 2.3

    Alguém tem alguma idéia sobre o que mudou no Android 4 que pode ter causado isso?

    EDIT: Aqui está um dos exemplos mais simples que vi de uma checkbox de dialog de alairme que não apairece "minimizada". Ele, como escrito, apairece na canvas de bloqueio, mas você pode consertair isso com o WindowManager.LayoutPairams.FLAG_SHOW_WHEN_LOCKED

    http://wptrafficanalyzer.in/blog/setting-up-alairm-using-alairmmanager-and-waking-up-screen-and-unlocking-keypad-on-alairm-goes-off-in-android/

    Está escrito com FragmentActivity e um DialogFragment, mas ainda funciona como uma atividade. Ele usa um AlertDialog.Builder paira fazer a checkbox de dialog e, se você tentair fazê-lo com um layout XML, não funcionairá. Por quê?

  • Ciclo de vida da atividade alterado com API 25 (7.1.1)
  • Classe de dados Kotlin de RealmObject
  • Como limpair o dispositivo Android quando o dispositivo administrativo está desativado?
  • Ignore os headers em PreferenceActivity quando houview apenas um header
  • Integração do Android com a CCAvenue
  • Quando um Fragmento é substituído e colocado na stack traseira (ou removido), fica na memory?
  • 4 Solutions collect form web for “Android Galaxy S4 – Atividade visível na canvas de bloqueio”

    Eu descobri, e a resposta era muito diferente do que eu esperava.

    Este pedaço de código foi incluído na amostra do despertador do Android 2, na atividade AlairmAlert.java:

     @Oviewride protected void onStop() { super.onStop(); // Don't hang airound. finish(); } 

    Paira reference, você pode view o file do código de exemplo no passado do Git aqui mesmo , contendo a function onStop acima. Nunca causou um problema no Android 2.

    Mas no Android 4, se o telefone estivesse desligado, este onStop triggersria logo antes do telefone astringr, efetivamente "minimizando" a atividade. Uma vez que eu removi essa function, ele imediatamente funcionou novamente.

    Mas eu imagino, esse é o problema que outras pessoas gostam de @radley e @Guairdanis estão obtendo? Pairece improvável, mas me avise se isso também soluciona seus problemas.

    Se você estiview visitando esta resposta no futuro, e você está tendo esse problema, o que eu tentairia é:

    1. Retire todas onStop funções onStop .

    2. Adicione este código à atividade:

       getWindow().addFlags(WindowManager.LayoutPairams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutPairams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutPairams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutPairams.FLAG_TURN_SCREEN_ON); 
    3. Certifique-se de que está usando um tema de canvas cheia e não um tema de dialog.

    4. Isso não fez diferença paira mim, mas você poderia tentair configurair showOnLockScreen explicitamente no manifesto: <activity android:name="com.example.MyActivity" android:showOnLockScreen="true"/>

    5. Uma segunda coisa que não fez diferença paira mim, mas você pode tentair é adicionair a bandeira WindowManager.LayoutPairams.FLAG_FULLSCREEN

    Espero que isso ajude outras pessoas!

    Não tenho certeza se este é o problema em todos os casos, mas a documentation em ShowWhenLocked diz que se aplica apenas à window de canvas cheia mais alta. Eu tinha uma window com um tema como um dialog que não estava funcionando, mas funcionou bem depois de mudá-lo paira uma window de canvas cheia regulair.

    Uma das perguntas que você ligou tem uma resposta que paireceu resolview este problema paira mim.

    Este é o código que estou usando, o que pairece estair funcionando:

     @Oviewride public void onAttachedToWindow() { Window window = getWindow(); window.addFlags(WindowManager.LayoutPairams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutPairams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutPairams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutPairams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutPairams.FLAG_FULLSCREEN); super.onAttachedToWindow(); } WindowManager.LayoutPairams.FLAG_FULLSCREEN); @Oviewride public void onAttachedToWindow() { Window window = getWindow(); window.addFlags(WindowManager.LayoutPairams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutPairams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutPairams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutPairams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutPairams.FLAG_FULLSCREEN); super.onAttachedToWindow(); } 

    Também estou explicitamente declairando isso na definição de atividade no manifesto:

     <activity android:name="com.example.MyActivity" android:label="@string/app_name" android:showOnLockScreen="true" > 

    Atividade do Android em cima da canvas de bloqueio padrão

    Direito – Então eu tenho lutado com este recentemente, mas com um 5.0.2 Galaxy Tab A. Sem surpresa, o que funciona em todos os outros dispositivos não funciona na Samsung (esse foi o caso desde o primeiro dispositivo Samsung Galaxy, eles quebram algo novo cada lançamento!)

    A solução geral paira mostrair uma atividade na canvas de bloqueio paira a maioria dos dispositivos é

     //wake up device and show even when on lock screen getWindow().addFlags(WindowManager.LayoutPairams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutPairams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutPairams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutPairams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutPairams.FLAG_FULLSCREEN); 

    No entanto, isso não funciona paira dispositivos samsung. Removendo FLAG_DISMISS_KEYGUARD no entanto, esse truque.

    Olhando os documentos paira esta bandeira, temos

    Sinalizador da window: quando configurado, a window fairá com que o bloqueio da key seja descairtado, apenas se não for um bloqueio seguro. Como essa proteção de keyboard não é necessária paira security, ela nunca será novamente exibida se o user navegair paira outra window (em contraste com FLAG_SHOW_WHEN_LOCKED, que apenas esconderá temporairiamente guairda-keys seguras e não seguras, mas assegure que elas reapairecem quando o user se move paira outra UI que não os esconda). Se o bloqueador de teclas estiview atualmente ativo e seguro (requer um padrão de desbloqueio), o user ainda precisairá confirmá-lo antes de view esta window, a less que FLAG_SHOW_WHEN_LOCKED também tenha sido configurado.

    e paira FLAG_SHOW_WHEN_LOCKED temos

    Bandeira da window: bandeira especial paira permitir que as windows sejam exibidas quando a canvas estiview bloqueada. Isso permitirá que as windows do aplicativo tenham precedência sobre o protetor de keys ou outras canvass de bloqueio. Pode ser usado com FLAG_KEEP_SCREEN_ON paira ativair a canvas e exibir windows diretamente antes de mostrair a window de proteção das keys. Pode ser usado com FLAG_DISMISS_KEYGUARD paira cancelair completamente os guairda-keys não seguras. Esta bandeira só se aplica à window de canvas cheia mais alta.

    Você pode view que eles podem ser usados ​​juntos, mas pairece que o samsung não incomodairá com FLAG_SHOW_WHEN_LOCKED se o dispositivo estiview bloqueado e FLAG_DISMISS_KEYGUARD estiview presente. O meu aplicativo requer que uma canvas de bloqueio seja configurada paira que a remoção do sinalizador de bloqueio do bloqueio de proteção realmente me permita exibir atividades em canvas inteira sobre a canvas de bloqueio. Yay paira mim, também paira Samsung.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.