Обнаружение, когда роуминг отключен в Android

Я создал BroadcastReceiver который прослушивает событие CONNECTIVITY_CHANGE . Пока я просто распечатываю действие Intent которое вызывает BroadcastReceiver и его дополнительные функции. Я использую тестовый телефон в нашем офисе здесь, в Маниле, а SIM-карта – из Дании. Когда onReceive() , это то, что печатается в LogCat:

 action: android.net.conn.CONNECTIVITY_CHANGE key: extraInfo, value: data.tre.dk key: htcCurrentActiveNetwork, value: null key: networkInfo, value: null key: reason, value: roamingOn key: noConnectivity, value: null key: inetCondition, value: null 

Мне нужно знать, какова ценность reason , когда уходит роуминг – может быть roamingOff если угадать, но я не знаю точно, если я не поеду в Данию. Это связано с тем, что мне нужно выполнить задачу, когда услуга роуминга отключена, и я заметил из LogCat, что событие CONNECTIVITY_CHANGE запускается по причинам, отличным от переключения режимов роуминга. Или есть лучший способ обнаружить, когда роуминг отключен?

Код для широковещательного приемника:

 public void onReceive(Context context, Intent intent) { Log.d(This.LOGTAG, "action: " + intent.getAction()); Bundle extras = intent.getExtras(); for (String key : extras.keySet()) { Log.d(This.LOGTAG, "key: " + key + ", value: " + extras.getString(key)); } } 

Запись манифеста:

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

    Существует разница между сетевым роумингом и роумингом данных.

    Как правило, сетевой роуминг позволяет вашей телефонной компании проходить через сторонние спутники, пока вы находитесь за пределами страны, чтобы вы могли оставаться на связи со своими службами. Даже если вы уже сказали своей телефонной компании, что хотите подписаться на сетевой роуминг, она НЕ будет активирована до тех пор, пока вы фактически не начнете подключаться через сторонние телекоммуникационные спутники, и это произойдет только тогда, когда вы действительно находитесь за пределами страны.

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

    Короче говоря, если вы хотите обнаружить сетевой роуминг, используйте TelephonyManager.isNetworkRoaming() . Если вы хотите проверить, включен или отключен роуминг данных, используйте Settings.Secure.getInt(getContentResolver(), Settings.Secure.DATA_ROAMING) .

    ВАЖНО: я лично не протестировал следующие сценарии, и я не уверен, какое значение будет возвращено isNetworkRoaming() .

    1. Вы не указали своему домашнему телефону, чтобы включить сетевой роуминг, но когда вы приехали в другую страну, телефон начал обнаруживать другие телекоммуникационные сети.
    2. После сценария 1 ваш телефон попросит вас выбрать, к какой из обнаруженных телекоммуникационных сетей подключиться. Вы выбираете один, и телефон пытается подключиться. Я не знаю, какое значение isNetworkRoaming() вернется сюда, потому что вы не подписались на сетевой роуминг в первую очередь.

    Вы можете просто использовать эту строку для определения состояния роуминга:

     Settings.Secure.getInt(getContentResolver(), Settings.Secure.DATA_ROAMING) 

    Это не требует специальных разрешений или приемников.

    Источник