Не принимать событие изменения состояния мобильного состояния при включенном Wi-Fi
Мне нужно получить уведомление о включении/отключении мобильных данных. Для этого я использую BroadcastReceiver и зарегистрирую событие ConnectivityManager.CONNECTIVITY_ACTION. Однако это событие срабатывает только тогда, когда Wi-Fi отключен. Как только я включу Wi-Fi, я перестаю получать какие-либо события при включении/отключении мобильных данных.
Любые идеи?
Мне нужно принять событие изменения состояния мобильной информации независимо от состояния wi-fi.
Ответы
Ответ 1
-
Слушайте ConnectivityManager.CONNECTIVITY_ACTION
-
В вашем Broadcast Receiver
, проверьте полученное намерение и получите информацию о сети
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
final NetworkInfo networkInfo =
intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
-
Проверьте
if ((networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) && !networkInfo.isConnected()
Мобильные данные недоступны
-
Другое разумное в случае
if (networkInfo.isConnected() && (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
Доступны мобильные данные
Чтобы обновить пользовательский интерфейс, вы можете прочитать текущее состояние мобильных данных с помощью диспетчера подключений, например:
ConnectivityManager cm = (ConnectivityManager)applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE);
public boolean isNetworkAvailable() {
boolean status = false;
try {
final NetworkInfo netInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if ((netInfo != null) && (netInfo.getState() == NetworkInfo.State.CONNECTED)) {
status = true;
}
} catch (final Exception e) {
TLog.e(LOG, "Error Getting Mobile Network State");
return false;
}
return status;
}
Ответ 2
Проблема заключается в том, что когда пользователь подключается к WiFi, устройство перестает использовать мобильные данные. Чтобы включить и отключить его, это не будет иметь никакого эффекта.
ConnectivityManager.CONNECTIVITY_ACTION просто уведомляет об установленных или потерянных соединениях. Таким образом, пока вы находитесь в сети WiFi, для обнаружения этих изменений не требуется подключение к мобильной сети, независимо от того, включена ли она или отключена.
Из-за этого я не уверен, что будет возможно обнаружить изменения состояния мобильных данных при подключении к WiFi
Ответ 3
Ну, не уверен, что вы можете полагаться на уведомление от ConnectivityManager.CONNECTIVITY_ACTION в этом конкретном случае.
Но, если вы хотите прочитать, если параметр "мобильные данные" включен/отключен в любой момент.
Вы можете использовать следующее:
ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
Method method = conn.getClass().getDeclaredMethod("getMobileDataEnabled");
boolean isMobileDataEnabled = (Boolean)method.invoke(conn);
Ответ 4
Я протестировал два приемника действия.
1.
ConnectivityManager.CONNECTIVITY_ACTION;
Он не может принимать мобильные данные с включенными или отключенными, если wifi подключен.
2.
TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED = "android.intent.action.ANY_DATA_STATE"
(Он скрыт)
Он может принимать мобильные данные, если Wi-Fi подключен. и не может принимать мобильные данные.
Мое тестовое устройство - Samsung Galaxy S4 mini LTE Корейская модель (SHV-E370K), а не глобальная модель (GT-I9195)
==========================================
Если Wi-Fi подключен, система не вызывает dataEnabled (потому что не нуждается в мобильных данных).
Таким образом, невозможно получить состояние мобильной связи (на самом деле, мобильные данные НЕ включены)
Я решил запланировать таймер (период = 10000 мс) и проверить getMobileDataEnabled()
.
private Method connectivityManager_getMobileDataEnabled = null;
private Method getConnectivityManager_getMobileDataEnabled() throws NoSuchMethodException {
if (connectivityManager_getMobileDataEnabled == null) {
connectivityManager_getMobileDataEnabled = ConnectivityManager.class.getMethod(
"getMobileDataEnabled",
new Class[0]);
}
return connectivityManager_getMobileDataEnabled;
}
public boolean getMobileDataEnabled()
throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Method getMobileDataEnabled = getConnectivityManager_getMobileDataEnabled();
getMobileDataEnabled.setAccessible(true);
return (Boolean) getMobileDataEnabled.invoke(mConnectivityManager);
}