onServiceStateChanged nunca gera evento OUT_OF_SERVICE e EMERGENCY_ONLY

14 views
Skip to first unread message

William Lopes

unread,
Apr 2, 2013, 12:40:38 PM4/2/13
to androidb...@googlegroups.com
Pessoal, fiz uma implementação aqui e preciso saber quando o dispositivo não está com rede disponível, mas ele nunca gera eventos de OUT_OF_SERVICE e EMERGENCY_ONLY, eu sei que a minha implementação está correta porque o estado IN_SERVICE, funciona que é uma beleza, mas os outros nunca foram disparados, já testei em três dispositivos com 3 versões diferentes do android e nada.

Alguém sabe o motivo disso estar acontecendo?

Obrigado!

Bruno Albuquerque

unread,
Apr 2, 2013, 12:42:07 PM4/2/13
to androidb...@googlegroups.com
Como exatamente você está testando OUT_OF_SERVICE e EMERGENCY_ONLY?



--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

William Lopes

unread,
Apr 2, 2013, 12:43:04 PM4/2/13
to androidb...@googlegroups.com
Eu coloquei para sempre que gerar qualquer tipo de evento enviar para o servidor, mas só envia IN_SERVICE.


--
You received this message because you are subscribed to a topic in the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/androidbrasil-dev/aZYB_Tt7hYk/unsubscribe?hl=en-US.
To unsubscribe from this group and all its topics, send an email to androidbrasil-...@googlegroups.com.

William Lopes

unread,
Apr 2, 2013, 12:44:13 PM4/2/13
to androidb...@googlegroups.com
Algo assim:
if(serviceState.getState() == ServiceState.STATE_EMERGENCY_ONLY)
envia("SO_EMERGENCIA");
else if(serviceState.getState() == ServiceState.STATE_OUT_OF_SERVICE)
envia("FORA_DE_SERVICO");
else if(serviceState.getState() == ServiceState.STATE_IN_SERVICE)
envia("EM_SERVICO");
else envia("RADIO_DESLIGADO");

Bruno Albuquerque

unread,
Apr 2, 2013, 12:44:56 PM4/2/13
to androidb...@googlegroups.com
OUT_OF_SERVICE só vai acontecer, basicamente, se você for para uma região que não tem *NENHUM* sinal. Nem mesmo de outras operadoras que não a sua.

EMERGENCY_ONLY só vai acontecer quando não tiver sinal da sua operadora ou de uma operadora com acordo de roamin com a mesma, mas tem sinal de outras operadoras.

-Bruno



Em 2 de abril de 2013 13:43, William Lopes <williaml...@gmail.com> escreveu:

Bruno Albuquerque

unread,
Apr 2, 2013, 12:45:37 PM4/2/13
to androidb...@googlegroups.com
Isso Não quer dizer nada. Por que exatamente você esperava que em algum momento alguns desses estados deveria aparecer? Eles só ocorrem em casos bem extremos e, por isso mesmo, raros.

William Lopes

unread,
Apr 2, 2013, 12:47:28 PM4/2/13
to androidb...@googlegroups.com
Sim, mas eu instalei o aplicativo em 3 dispositivos diferentes, com 3 pessoas diferentes, sendo que 2 viajam muito, inclusive para o exterior, mas nunca chamou.

Eu já olhei para o meu celular e vi que está fora de área ou em só emergência, mas nunca disparou!

Bruno Albuquerque

unread,
Apr 2, 2013, 12:52:32 PM4/2/13
to androidb...@googlegroups.com
Isso é puramente circunstancial. O mecanismo que notifica para qualquer estado é exatamente o mesmo. Os dois estados que você mencionou só ocorrem em casos bem específicos, como eu mencionei. É mais provavel que você tenha um bu no seu código ou que simplesmente não tenha chegado nesses estados em nenhum momento do que apenas esses 2 estados não estarem funcionando.

Isso não exclui a possibilidade de um bug no sistema mas como o próprio sistema usa o mesmo método pra setar as mensagens indicando esses estados pro usuário, isso é bem improvável.

William Lopes

unread,
Apr 2, 2013, 12:59:12 PM4/2/13
to androidb...@googlegroups.com
"Isso não exclui a possibilidade de um bug no sistema mas como o próprio sistema usa o mesmo método pra setar as mensagens indicando esses estados pro usuário, isso é bem improvável.".
Será que utilizam o mesmo sistema? Existem várias restrições que a Google impõe goela abaixo, em alguns casos como a mudança da intensidade do sinal eles mesmo falam que são gerados a vontade deles e não quando realmente mudam. Outro exemplo é quando você conecta no WIFI ou 3G, somente depois de um delay definido por eles que recebemos o sinal de conexão de dados!

Eu tenho certeza que o meu código não está errado, porque é o mesmo para o que gerou corretamente (IN_SERVICE).

Acho muito estranho isso, vou tentar investigar mais, talvez até colocar um service em segundo plano só para isso!

Bruno Albuquerque

unread,
Apr 2, 2013, 1:32:51 PM4/2/13
to androidb...@googlegroups.com
SIm, eu tenho certeza que utilizam o mesmo sistema. Fora isso, e com todo o respeito, dizer "meu código faz A portanto B também funciona" não tem o menor embasamento em realidade. :)

Mas você está ignorando o óbvio que foi a primeira coisa que eu disse. Esses estados são raros e você pode simplesmente não ter chegado nos mesmos.

E, só pra constar: Empurra goela a baixo? Todos os métodos que você mencionou tem que minimizar o numero de notificações enviadas pra reduzir o wakeup do telefone. Por exemplo, no caso do sinal, ele muda *LITERALMENTE* a todo instante mas essas mudanças são completamente irrelevantes pra quem quer que seja e se fossem reportadas seu celular nunca iria dormir. 

William Lopes

unread,
Apr 2, 2013, 2:25:48 PM4/2/13
to androidb...@googlegroups.com

Esses estados apareceram no meu celular e não foram lançados.

Você diz: " Fora isso, e com todo o respeito, dizer "meu código faz A portanto B também funciona" não tem o menor embasamento em realidade. :)", meu código não faz B, eles são a mesma coisa, ou seja, são 2 dos possíveis valores do parâmetro recebido, eu apenas envio para o servidor o que eu receber, sem nenhuma restrição ou condição, porém só recebo IN_SERVICE. E se o android utiliza o mesmo sistema, por que no meu celular mostra que eu estou fora de serviço e no servidor não?

E eu cheguei nesses estados sim, meu pai mora no interior e no final de semana fomos para um sítio onde não "pegava" nada. E novamente, no meu celular aparece que eu estou fora de serviço, mas não é enviado pra mim isso.

Obrigado!

luciofm

unread,
Apr 2, 2013, 2:39:07 PM4/2/13
to androidb...@googlegroups.com
Só uma pergunta, o seu envia() faz queue das mensagens em caso de erro correto?

Pois se você está sem sinal, muito provavelmente não ira conseguir enviar esses status para o seu servidor.

Lúcio Maciel
luc...@gmail.com


2013/4/2 William Lopes <williaml...@gmail.com>

William Lopes

unread,
Apr 2, 2013, 2:41:32 PM4/2/13
to androidb...@googlegroups.com
Faz sim, na verdade ele armazena no banco de dados, e quando conecta em alguma rede ele envia tudo que está lá.

Obrigado!

William Lopes

unread,
Apr 4, 2013, 12:37:48 AM4/4/13
to androidb...@googlegroups.com
Só para constar, eu realmente estava certo, acredito firmemente que existe um bug no android, ou algo que faça com que ele lance à sua vontade, enfim, para conseguir utilizar e recuperar o real estado do serviço, você deve adicionar este intent-filter<action> no Receiver: android.intent.action.SERVICE_STATE

E chamá-lo assim no Receiver:
if(intent.getAction().equals("android.intent.action.SERVICE_STATE")) {
   int state = intent.getExtras().getInt("state");
   
   if (state == ServiceState.STATE_OUT_OF_SERVICE) // do something

}

Abraços e espero ajudar os próximos com o mesmo problema!

Bruno Albuquerque

unread,
Apr 4, 2013, 7:45:12 AM4/4/13
to androidb...@googlegroups.com
Espera. Que Receiver? Você deve usar um PhoneStateListener pra detectar mudanças de estado do telefone.

-Bruno

Bruno Albuquerque

unread,
Apr 4, 2013, 7:55:49 AM4/4/13
to androidb...@googlegroups.com
Ah, você deve estar usando o broadcast ACTION_PHONE_STATE_CHANGED. Nesse caso, o bug não é no Android, mas no seu código.

Originalmente você recebia o Broadcast e chamava ServiceState.getState(). O problema é que ServiceState.getState() retorna o estado do telefone no exato momento em que é chamado, que pode ser um estado diferente do que gerou o ACTION_PHONE_STATE_CHANGED. Como eu mencionei, os estados nos quais você estava mais interessado são raros (e são mais raros ainda se você pensar em porcentagem do tempo no qual o telefone se encontra em um desses estados) em condições normais de uso do telefone.

Pra você obter o estado que gerou o ACTION_PHONE_STATE_CHANGED, você *TEM* que ler o estado no Intent que recebeu, caso contrário não existe absolutamente nenhuma garantia de que eles serão os mesmos.

Note que não é impossível o código do Android possuir bugs, mas existem milhões de desenvolvedores exercitando esse código todo dia. Se existir um bug relativamente grave como esse que você supos que fosse um, você encontraria alguma referência ao mesmo procurando na internet.

-Bruno

William Lopes

unread,
Apr 4, 2013, 10:48:30 AM4/4/13
to androidb...@googlegroups.com

Rapaz, desculpe-me não é nada contra você, mas você tem que se impor sempre falando que eu estou errado? Faça uma busca na internet e me diga qual o método que eles recomendam você utilizar (será o que não acontece na mesma hora). Agora veja o que você falou: "Ah, você deve estar usando o broadcast ACTION_PHONE_STATE_CHANGED. Nesse caso, o bug não é no Android, mas no seu código. Originalmente você recebia o Broadcast e chamava ServiceState.getState(). O problema é que ServiceState.getState() retorna o estado do telefone no exato momento em que é chamado, que pode ser um estado diferente do que gerou o ACTION_PHONE_STATE_CHANGED.". Com base nessa explicação, você já pode ver onde o erro está. Você já tem um listener com um método já definido e pensado por eles para receber o valor do estado do serviço, mas ele não funciona como deveria e você tem que interceptar o Intent passado no Receiver para receber o valor correto. Novamente, me desculpe, mas você gosta de se sentir soberano. De qualquer forma, obrigado! :)

William Lopes

unread,
Apr 4, 2013, 10:54:00 AM4/4/13
to androidb...@googlegroups.com

Bruno, obrigado por sempre falar que eu estava errado mesmo quando eu não estava, porque "depois da onça morta, todo mundo matou". ;)

Em 4 de abril de 2013 08:55, Bruno Albuquerque <bruno.al...@gmail.com> escreveu:

Bruno Albuquerque

unread,
Apr 4, 2013, 10:58:11 AM4/4/13
to androidb...@googlegroups.com
*sigh*

Eu estava apenas tentando te ajudar. Deixar você acreditar que o que estava fazendo estava 100% correto e que o que criou um workaround pra um possivel bug no Android definitivamente não ajudaria em nada (a não ser a massagear o ego, mas acho que isso não é relevante em uma discussão técnica).

Infelizmente, você prefere ignorar a ajuda que está recebendo e insistir no erro. Sem problemas, eu aprendi minha lição, você não vai ter mais esse tipo de discussão comigo.

William Lopes

unread,
Apr 4, 2013, 12:11:12 PM4/4/13
to androidb...@googlegroups.com
Bruno, eu não ignorei a sua ajuda, mas em nenhum momento você propôs alguma solução, apenas falava que eu estava errado. Falar que não funciona ou que tem algo errado, isso eu sabia (foi o motivo da criação do tópico).

Não é nada pessoal.

Bruno Albuquerque

unread,
Apr 4, 2013, 12:20:53 PM4/4/13
to androidb...@googlegroups.com
Eu não tenho como propor uma solução sem saber o que você está fazendo. O código que você postou no início não tem absolutamente nenhuma indicação de que você não estava usando um PhoneStateListener (que é o modo mais comum de fazer essas coisas). Ë difícil propor o que quer que seja sem dados suficientes. Ainda assim eu fiz um esforço pra entender o que estava ocorrendo e, apenas por inferência, descobri que você estava usando o método de broadcast. Nesse meio tempo você ficou afirmando que era um bug no Android e não um erro seu e, sendo isso a única informação vindo de você, essa era a única coisa que eu podia concordar com ou discordar de.

William Lopes

unread,
Apr 4, 2013, 12:23:56 PM4/4/13
to androidb...@googlegroups.com
Primeiramente me desculpe por ter falado como falei, desculpe-me mesmo, não queria criar todo este clima, vou me encerrar aqui porque o foco já mudou.

Obrigado!

Bruno Albuquerque

unread,
Apr 4, 2013, 12:49:44 PM4/4/13
to androidb...@googlegroups.com
Sem problema.

Reply all
Reply to author
Forward
0 new messages