В моем случае я уже прослушиваю изменения состояния сети с помощью 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 (в принятом ответе) имеет те же проблемы:
Я слушаю изменения в состоянии сети DATA. Если пользователь не устанавливает соединение для передачи данных (например, это просто голосовой роуминг), то это не будет работать, но я не думаю, что это проблема, потому что большинство из нас стремятся обнаружить роуминг данных (например, чтобы наши приложения не не использовать данные, когда пользователь находится в роуминге).
Я не уверен, что должно произойти изменение состояния подключения к данным, когда пользователь начинает роуминг - это всего лишь моя теория, и мне было бы интересно услышать, если кто-то знает лучше.
Наконец, позвольте мне добавить, что вполне возможно, что прослушивание PhoneStateListener :: onServiceStateChanged () может быть лучшим решением из всех: простым и с наименьшим количеством ненужных событий (это должно вызываться редко), но я нахожу, что документы неоднозначны не может сказать, инициировано ли событие PSL для изменения какого-либо атрибута объекта ServiceState (например, роуминга) или только для атрибута состояния службы ServiceState.