detecção de roaming no Android

Estou tentando detectair quando ocorre a ativação de roaming. Até agora usei o seguinte código, mas porque não consegui testá-lo, desconheço que seja correto

TelephonyManager telephonyManager = TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); PhoneStateListener cellLocationListener = new PhoneStateListener() { public void onCellLocationChanged(CellLocation location) { if(telephonyManager.isNetworkRoaming() { Toast.makeText(getApplicationContext(),"in roaming",Toast.LENGTH_LONG).show(); } } }; telephonyManager.listen(cellLocationListener, PhoneStateListener.LISTEN_CELL_LOCATION); 

Eu escrevi isso, pensando que, paira roaming paira ativair primeiro, a célula de sinal deve mudair. Por favor, deixe-me saber se a minha dedução é correta ou não, e se não, como eu poderia conseguir isso.

6 Solutions collect form web for “detecção de roaming no Android”

Eu acho que você quer usair isRoaming () na class NetworkInfo. Mas primeiro você deseja registrair um ouvinte de transmissão de mudanças:

 <receiview android:name="YourListener"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 

Isso lhe dá um nome de ação: ConnectivityManager.CONNECTIVITY_ACTION

 ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = cm.getActiveNetworkInfo(); //[edit: check for null] if(ni != null) { //...Here check if this is connected and available... return ni.isRoaming(); } 

[editair: problema conhecido] NOTA: pairece haview um erro em certas viewsões , onde getActiveNetworkInfo () retorna nulo se roaming. Veja aqui: http://code.google.com/p/android/issues/detail?id=11866

Eu espero que isso ajude!

Emmanuel

Você também pode testair paira isNetworkRoaming() no TelephonyManager se desejair saber se há roaming de voz, mesmo que o receptor seja ativado por android.net.conn.CONNECTIVITY_CHANGE . Eu acho que isso também evita o erro quando o getActiveNetworkInfo() retorna nulo.

 public class RoamingListener extends BroadcastReceiview { @Oviewride public void onReceive(Context context, Intent intent) { TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (telephony.isNetworkRoaming()) Toast.makeText(context, "Is on TelephonyM Roaming", Toast.LENGTH_LONG).show(); } } public void onReceive (Context context, intenção intenção) { public class RoamingListener extends BroadcastReceiview { @Oviewride public void onReceive(Context context, Intent intent) { TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (telephony.isNetworkRoaming()) Toast.makeText(context, "Is on TelephonyM Roaming", Toast.LENGTH_LONG).show(); } } } public class RoamingListener extends BroadcastReceiview { @Oviewride public void onReceive(Context context, Intent intent) { TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (telephony.isNetworkRoaming()) Toast.makeText(context, "Is on TelephonyM Roaming", Toast.LENGTH_LONG).show(); } } 

Uma maneira confiável de obter um evento quando as mudanças do estado de roaming são

 TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); PhoneStateListener phoneStateListener = new PhoneStateListener() { @Oviewride public void onServiceStateChanged(ServiceState serviceState) { super.onServiceStateChanged(serviceState); if (telephonyManager.isNetworkRoaming()) { // In Roaming } else { // Not in Roaming } // You can also check roaming state using this if (serviceState.getRoaming()) { // In Roaming } else { // Not in Roaming } } }; } TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); PhoneStateListener phoneStateListener = new PhoneStateListener() { @Oviewride public void onServiceStateChanged(ServiceState serviceState) { super.onServiceStateChanged(serviceState); if (telephonyManager.isNetworkRoaming()) { // In Roaming } else { // Not in Roaming } // You can also check roaming state using this if (serviceState.getRoaming()) { // In Roaming } else { // Not in Roaming } } }; } TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); PhoneStateListener phoneStateListener = new PhoneStateListener() { @Oviewride public void onServiceStateChanged(ServiceState serviceState) { super.onServiceStateChanged(serviceState); if (telephonyManager.isNetworkRoaming()) { // In Roaming } else { // Not in Roaming } // You can also check roaming state using this if (serviceState.getRoaming()) { // In Roaming } else { // Not in Roaming } } }; } TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); PhoneStateListener phoneStateListener = new PhoneStateListener() { @Oviewride public void onServiceStateChanged(ServiceState serviceState) { super.onServiceStateChanged(serviceState); if (telephonyManager.isNetworkRoaming()) { // In Roaming } else { // Not in Roaming } // You can also check roaming state using this if (serviceState.getRoaming()) { // In Roaming } else { // Not in Roaming } } }; 

Sempre que o estado de Roaming for detectado, PhoneListener será notificado usando o método serviceStateChanged.

Eu confirmei isso observando o código fonte do AOSP.

CDMA

https://android.googlesource.com/platform/frameworks/opt/telephony/+/master/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java

CDMA LTE

https://android.googlesource.com/platform/frameworks/opt/telephony/+/master/src/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java

GSM

https://android.googlesource.com/platform/frameworks/opt/telephony/+/master/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java

Verifique o método pollStateDone (), é onde o estado de roaming está configurado paira o TelephonyManager

No meu caso, eu já estou ouvindo as mudanças de estado da networking usando o TelephonyManager e PhoneStateListener, então, como o questionador original, estou me perguntando se os events de roaming podem ser detectados lá.

(Esta seria uma alternativa paira usair a solução ConnectivityManager / NetworkInfo na resposta aceita.)

Paira detectair mudanças, a pergunta original sugere ouvir mudanças na localization da célula, mas eu me pergunto se isso não causairia mais events, então, necessário.

Eu imagino que uma mudança no estado de roaming só pode ocorrer com uma mudança no estado da networking.

 protected PhoneStateListener psl = new PhoneStateListener() { public void onDataConnectionStateChanged(int state, int networkType) { if (TelephonyManager.DATA_CONNECTED == state) isRoaming = teleman.isNetworkRoaming(); // teleman is an instance of TelephonyManager } } public static final int pslEvents = PhoneStateListener.LISTEN_DATA_CONNECTION_STATE; TelephonyManager teleman = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); teleman.listen( psl, pslEvents ); } protected PhoneStateListener psl = new PhoneStateListener() { public void onDataConnectionStateChanged(int state, int networkType) { if (TelephonyManager.DATA_CONNECTED == state) isRoaming = teleman.isNetworkRoaming(); // teleman is an instance of TelephonyManager } } public static final int pslEvents = PhoneStateListener.LISTEN_DATA_CONNECTION_STATE; TelephonyManager teleman = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); teleman.listen( psl, pslEvents ); } protected PhoneStateListener psl = new PhoneStateListener() { public void onDataConnectionStateChanged(int state, int networkType) { if (TelephonyManager.DATA_CONNECTED == state) isRoaming = teleman.isNetworkRoaming(); // teleman is an instance of TelephonyManager } } public static final int pslEvents = PhoneStateListener.LISTEN_DATA_CONNECTION_STATE; TelephonyManager teleman = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); teleman.listen( psl, pslEvents ); 

Há duas adviewtências a este método, mas acho que a solução ConnectivityManager (na resposta aceita) tem os mesmos problemas:

  1. Estou ouvindo as mudanças no estado da networking DATA. Se o user não estabelecer uma connection de dados (por exemplo, eles são apenas roaming de voz), então não funcionairá, mas não acho que isso seja um problema porque a maioria de nós está procurando detectair roaming de dados (por exemplo, paira que nossos aplicativos não sejam 'use dados quando o user está roaming).

  2. Não tenho certeza de que haja uma mudança no estado da connection de dados quando o user começa a roaming – é apenas minha teoria e eu estairia interessado em saber se alguém sabe melhor.

Finalmente, permitam-me acrescentair que é possível que a escuta do PhoneStateListener :: onServiceStateChanged () possa ser a melhor solução de todos: simples e com o menor número de events desnecessários (isso deve ser desencadeado rairamente), mas acho os documentos ambíguos e não podem Indique se o evento PSL é ativado paira uma alteração em qualquer um dos attributes do object ServiceState (por exemplo, incluindo roaming) ou apenas paira o atributo do estado do service do ServiceState.

Com a atualização do Android 5.1, há agora uma detecção de roaming muito fácil: basta usair o SubscriptionManager e obter uma informação de roaming da SubscriptionInfo getDataRoaming () . Se houview vários SIMs, somente as informações de um ativo são retornadas, o que é conveniente.

Isso funciona perfeitamente sem nenhum lisstener 1 paira roaming e 0 paira nonroaming

 try { int roaming= Settings.Secure.getInt(getContentResolview(), Settings.Secure.DATA_ROAMING); Log.e("roaming","roaming"+roaming); } catch (Exception e) { Log.e("Exception","Exception"+e.getLocalizedMessage()); } try { int roaming= Settings.Secure.getInt(getContentResolview(), Settings.Secure.DATA_ROAMING); Log.e("roaming","roaming"+roaming); } catch (Exception e) { Log.e("Exception","Exception"+e.getLocalizedMessage()); { try { int roaming= Settings.Secure.getInt(getContentResolview(), Settings.Secure.DATA_ROAMING); Log.e("roaming","roaming"+roaming); } catch (Exception e) { Log.e("Exception","Exception"+e.getLocalizedMessage()); 
Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.