2010-03-03 3 views
8

Я пытаюсь обнаружить, когда происходит активация роуминга. До сих пор я использовал следующий кусок кода, а потому, что я не был в состоянии проверить это я не в курсе, что это правильностьобнаружение роуминга в android

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); 

Я написал это, полагая, что для того, чтобы активировать роуминг сначала необходимо изменить сигнальную ячейку. Пожалуйста, дайте мне знать, правильно ли мой вывод или нет, и если не так, как я мог бы это сделать.

+1

Вы можете проверить это очень легко в эмуляторе я думаю. Если вы переключитесь на DDMS Debugging Perspective в Eclipse, вы можете выбрать свой эмулятор и затем выбрать роуминг в элементах эмулятора из списка выбора данных. Это должно вызвать изменение между роумингом и нет. Проблема в том, что он может использовать другой способ перехода от состояния к состоянию в эмуляторе, после чего произойдет фактическое устройство. Работает ли она в эмуляторе? – Janusz

+0

Я работаю в другой среде IDE, чем Eclipse, у которой нет этой опции. –

+0

Вы можете сделать то же самое через telnet на консоли эмулятора. Посмотрите на http://developer.android.com/intl/fr/guide/developing/tools/emulator.html#telephony. Вы можете использовать команду gsm для включения роуминга. – Janusz

ответ

15

Я думаю, что вы хотите использовать isRoaming() в классе NetworkInfo. Но сначала вы хотите зарегистрировать изменение широковещательный слушателя:

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

Это дает вам имя действия: 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(); 
} 

[править: известная проблема] ПРИМЕЧАНИЕ: Там, кажется, ошибка в некоторых версиях, где getActiveNetworkInfo() возвращает null при роуминге. См. Здесь: http://code.google.com/p/android/issues/detail?id=11866

Надеюсь, это поможет!

Эммануэль

+0

ni возвращает null мне, если я переключу эмулятор на роуминг. Hrm ... Будьте осторожны с NullPointerException там на последней строке кстати. –

+0

Хорошая точка. Я исправлю это в ответе. Более того, кажется, что в некоторых версиях есть ошибка. – Emmanuel

12

Вы также можете проверить isNetworkRoaming() в TelephonyManager, если вы хотите знать, если есть Голосовой Роуминг, даже если приемник запускается android.net.conn.CONNECTIVITY_CHANGE. Я думаю, что это также позволит избежать ошибки, когда getActiveNetworkInfo() возвращает null.

public class RoamingListener extends BroadcastReceiver { 
    @Override 
    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(); 
    } 
} 
+0

Я не уверен, почему вы предлагаете, чтобы ваш метод был предназначен только для мониторинга «Голосовой роуминг»? Документы для isNetworkRoaming() не делают такого различия. – Tom

+0

Мысль о том же решении, я не понимаю, почему они не просто сделали это вместо этого ответа выше. –

+4

НЕОБХОДИМО быть в голосовом роуминге, но не в роуминге данных. http://stackoverflow.com/questions/2783120/data-roaming-in-android –

0

В моем случае я уже прослушивает изменения состояния сети с использованием TelephonyManager и PhoneStateListener так, как оригинальный спрашивающего, я задаюсь вопросом, является ли роуминг события могут быть обнаружены там.

(Это было бы альтернативой использованию решения ConnectivityManager/NetworkInfo в принятом ответе.)

Чтобы обнаружить изменения, первоначальный вопрос предлагает послушать изменения в сотой, но мне интересно, если это не приведет к тогда необходимо больше событий.

Я бы предположил, что изменение состояния роуминга может произойти только при изменении состояния сети.

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); 

Есть два предостережения к этому методу, но я думаю, что решение ConnectivityManager (в принятом ответе) имеет те же вопросы:

  1. Я слушаю изменения в сети передачи данных состояния , Если пользователь не устанавливает соединение для передачи данных (например, это просто голосовое роуминг), то это не сработает, но я не думаю, что это проблема, потому что большинство из нас хочет обнаружить роуминг данных (например, использовать данные, когда пользователь перемещается).

  2. Я не уверен, что должно произойти изменение состояния соединения данных, когда пользователь начинает роуминг - это только моя теория, и мне было бы интересно услышать, если кто-нибудь знает лучше.

Наконец, позвольте мне добавить, что это возможно, что прослушивание PhoneStateListener :: onServiceStateChanged() может быть лучшим решением всего: просто и с наименьшим количеством ненужных событий (это должно быть инициировано редко), но я считаю, документы неоднозначны и не могут определить, запускается ли событие PSL для изменения любого из атрибутов объекта ServiceState (например, включая роуминг) или только для атрибута состояния службы ServiceState.

+0

и где вы будете использовать это ??? Внутри основной операции ... но, если моя деятельность находится в фоновом режиме, так как она не содержит манифест, будет ли она работать? У меня есть служба, работающая в фоновом режиме, которая снова падает в памяти с помощью процессора. – sheetal

+0

Если вы хотите, чтобы она работала, даже когда ваша деятельность не была передним планом, вы должны поместить ее в свою службу, но даже в вашем сервисе вам не гарантируется что он будет продолжать работать (как вы заметили). Я думаю, вам нужно найти намерение, которое вы можете перечислить в своем манифесте, которое срабатывает при изменении состояния роуминга, поэтому мой soln на основе PSL не для вас. – Tom

2

Надежный способ получения события, когда Роуминг изменения состояния является

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     PhoneStateListener phoneStateListener = new PhoneStateListener() { 
      @Override 
      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 
       } 
      } 
     }; 

Всякий раз, когда Роуминг состояние обнаруживается, PhoneListener будет уведомлен с помощью метода serviceStateChanged.

Я подтвердил это, посмотрев исходный код AOSP.

МДКР

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

Проверьте метод pollStateDone(), где установлено состояние роуминга для TelephonyManager

0

С обновлением Android 5.1 теперь очень простое обнаружение роуминга: просто используйте SubscriptionManager и получите информацию о роуминге от SubscriptionInfo getDataRoaming(). Если имеется несколько SIM-карт, возвращается только информация из активной, что удобно.

-2

Это отлично работает без каких-либо lisstener 1 для роуминга и 0 для nonroaming

try { 
      int roaming= Settings.Secure.getInt(getContentResolver(), Settings.Secure.DATA_ROAMING); 
      Log.e("roaming","roaming"+roaming); 

     } 
     catch (Exception e) 
     { 
      Log.e("Exception","Exception"+e.getLocalizedMessage()); 
Смежные вопросы