【问题标题】:Listen connectivity changes on Android在 Android 上监听连接变化
【发布时间】:2018-06-22 17:08:54
【问题描述】:

我正在开发一个 Android 应用程序,我需要知道网络状态:离线、漫游、wifi、wifi hospot、wifi direct、移动数据。 我已经创建了这个单例类:

public class NetworkController {

private static final NetworkController networkController = new NetworkController();

private boolean peerConnected;
private ConnectionMode connectionMode;

public enum ConnectionMode {
    OFFLINE,
    MOBILE_DATA,
    ROAMING,
    WIFI,
    WIFI_HOSPOT,
    WIFI_DIRECT
}

private NetworkController() {
    connectionMode = ConnectionMode.OFFLINE;
}

public static NetworkController getNetworkController() {
    return networkController;
}

public void setPeerConnected(boolean peerConnected) {
    this.peerConnected = peerConnected;
}

public boolean isPeerConnected() {
    return peerConnected;
}

public ConnectionMode getConnectionMode() {
    return connectionMode;
}

public void setConnectionMode(ConnectionMode connectionMode) {
    this.connectionMode = connectionMode;
}

public void updateNetworkStatus() {
    connectionMode = ConnectionMode.OFFLINE;
    if (isRoaming()) {
        connectionMode = ConnectionMode.ROAMING;
    } else if (isConnectedToWiFi()) {
        connectionMode = ConnectionMode.WIFI;
        if (isHotspot())
            connectionMode = ConnectionMode.WIFI_HOSPOT;
        if (isWiFiDirect())
            connectionMode = ConnectionMode.WIFI_DIRECT;
    } else if (isMobileData()) {
        connectionMode = ConnectionMode.MOBILE_DATA;
    }
}

public boolean isRoaming() {
    try {
        ConnectivityManager connectivityManager = (ConnectivityManager) KeweltaApplication.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = null;
        if (connectivityManager != null) {
            netInfo = connectivityManager.getActiveNetworkInfo();
        }
        if (netInfo != null) {
            return netInfo.isRoaming();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

public boolean isConnectedToWiFi() {
    try {
        ConnectivityManager connectivityManager = (ConnectivityManager) KeweltaApplication.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = null;
        if (connectivityManager != null) {
            netInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        }
        if (netInfo != null && netInfo.getState() == NetworkInfo.State.CONNECTED) {
            return true;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

public boolean isHotspot() {
    boolean isWifiAPenabled = false;
    WifiManager wifi = (WifiManager) KeweltaApplication.getInstance().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    Method[] wmMethods = new Method[0];
    if (wifi != null) {
        wmMethods = wifi.getClass().getDeclaredMethods();
    }
    for (Method method : wmMethods) {
        if (method.getName().equals("isWifiApEnabled")) {
            try {
                isWifiAPenabled = (Boolean) method.invoke(wifi);
            } catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }
    return isWifiAPenabled;
}

public boolean isWiFiDirect() {
    return peerConnected;
}

public boolean isMobileData() {
    ConnectivityManager cm = (ConnectivityManager) KeweltaApplication.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = null;
    if (cm != null) {
        activeNetwork = cm.getActiveNetworkInfo();
    }
    return activeNetwork != null && activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE;
}
}

我制作了这个广播接收器:

public class ConnectionReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE")) {
        NetworkController.getNetworkController().updateNetworkStatus();
    }
}
}

我添加到清单中

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

更新网络状态方法只设置“离线”或“WIFI”,我需要了解其他连接类型。此外,Android Studio Lint 检查说“为 android.net.conn.CONNECTIVITY_CHANGE 声明广播接收器已被针对 N 及更高版本的应用程序弃用。一般应用程序不应依赖此广播,而应使用 JobScheduler 或 GCMNetworkManager”。 我确定这意味着什么,我在 stackoverflow 上查找了最近解决我的问题的方法,但我刚刚找到了三年多前的帖子。 但这不是我现在的问题,我的问题是没有检测到连接类型。方法“isMobileData”、“isHotspot”和“isRoaming”不起作用。

【问题讨论】:

标签: android


【解决方案1】:

这意味着您不能从清单中声明的​​广播接收器隐式侦听CONNECTIVITY_CHANGE。在N 及以上,您的广播接收器将不会被调用。

如果您需要状态,则需要创建前台服务并在该服务中注册广播接收器以监听连接更改

【讨论】:

  • 这不是我现在的问题,我的问题是没有正确检测到连接类型。方法“isMobileData”、“isHotspot”和“isRoaming”未按预期工作。
猜你喜欢
  • 2014-10-29
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多