我需要在启用/禁用移动数据时收到通知。为此,我使用BroadcastReceiver并注册到ConnectivityManager.CONNECTIVITY_ACTION事件。但是,仅在禁用Wi-Fi时才会触发该事件。一旦启用Wi-Fi,我就会在启用/禁用移动数据时停止获取任何事件。
有什么想法吗? 无论Wi-Fi状态如何,我都需要接收移动数据状态变化事件。
答案 0 :(得分:0)
倾听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)
移动数据可用
要更新您的UI,您可以使用连接管理器读取移动数据的当前状态,如:
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;
}
答案 1 :(得分:0)
问题是当用户连接到WiFi时,设备将停止使用移动数据。因此,启用和禁用它将无效。
ConnectivityManager.CONNECTIVITY_ACTION只是通知已建立或丢失的连接。因此,当您使用WiFi时,无论是启用还是禁用,都无法通过移动网络连接来检测这些更改。
因此我不确定在连接到WiFi时可以检测移动数据状态的变化
答案 2 :(得分:0)
嗯,在这种特殊情况下,不确定是否可以依赖来自ConnectivityManager.CONNECTIVITY_ACTION的通知。
但是,如果您想阅读是否在任何时候启用/禁用移动数据设置。
您可以使用以下内容:
ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
Method method = conn.getClass().getDeclaredMethod("getMobileDataEnabled");
boolean isMobileDataEnabled = (Boolean)method.invoke(conn);
答案 3 :(得分:0)
我测试了两个动作接收器。
1
ConnectivityManager.CONNECTIVITY_ACTION;
如果wifi连接,则无法启用或禁用移动数据。
2
TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED = "android.intent.action.ANY_DATA_STATE"
(隐藏)
如果连接了wifi,它可以禁用移动数据。,并且无法接收移动数据。
我的测试设备是三星Galaxy S4 mini LTE韩国型号(SHV-E370K)不是全球型号(GT-I9195)
==========================================
如果wifi连接,系统不会调用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);
}