【发布时间】: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