You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 12无网络WiFi图标被移动数据隐藏的编程解决需求

解决WiFi连接状态监听问题(移动数据启用场景)

核心思路

系统默认的网络可用性广播会在WiFi无互联网(且移动数据开启)时标记网络不可用,但我们需要区分WiFi是否已连接到目标AP和WiFi是否具备互联网访问两个独立状态。要实现需求,需监听WiFi本身的连接状态,而非网络整体可用性。

实现步骤

1. 声明必要权限

在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2. 动态注册BroadcastReceiver

推荐动态注册以适配Android 8.0+的静态广播限制,在Activity/Service中完成注册:

private WifiStateReceiver wifiReceiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    wifiReceiver = new WifiStateReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
    filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
    registerReceiver(wifiReceiver, filter);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(wifiReceiver);
}

3. 实现Receiver逻辑

解析广播事件,精准判断WiFi与AP的连接状态:

public class WifiStateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action == null) return;

        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        
        // 监听WiFi开关状态
        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
            int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
            if (state == WifiManager.WIFI_STATE_ENABLED) {
                checkCurrentWifiConnection(wifiManager);
            } else if (state == WifiManager.WIFI_STATE_DISABLED) {
                handleWifiDisconnected();
            }
        }
        // 监听WiFi与AP的连接状态(核心)
        else if (WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION.equals(action)) {
            boolean isConnectedToAP = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false);
            if (isConnectedToAP) {
                handleWifiConnected();
            } else {
                handleWifiDisconnected();
            }
        }
    }

    private void checkCurrentWifiConnection(WifiManager wifiManager) {
        WifiInfo info = wifiManager.getConnectionInfo();
        if (info != null && info.getNetworkId() != -1) {
            handleWifiConnected();
        }
    }

    private void handleWifiConnected() {
        // 这里编写WiFi已连接到目标设备后的业务逻辑
        Log.d("WifiState", "WiFi已成功连接到设备");
    }

    private void handleWifiDisconnected() {
        // 编写WiFi断开后的处理逻辑
        Log.d("WifiState", "WiFi已断开连接");
    }
}

4. 可选:区分WiFi是否有互联网

如果需要同时判断WiFi是否具备互联网访问,可搭配NetworkCallback(Android 7.0+推荐):

private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
    @Override
    public void onCapabilitiesChanged(Network network, NetworkCapabilities capabilities) {
        boolean isWifi = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
        boolean hasInternet = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
        
        if (isWifi) {
            if (hasInternet) {
                Log.d("NetworkStatus", "WiFi具备互联网访问");
            } else {
                Log.d("NetworkStatus", "WiFi已连接但无互联网");
            }
        }
    }
};

// 注册NetworkCallback
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest request = new NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .build();
cm.registerNetworkCallback(request, networkCallback);

关键说明

  • SUPPLICANT_CONNECTION_CHANGE_ACTION广播直接反映WiFi与AP的物理连接状态,不受互联网可用性和移动数据状态影响,是实现需求的核心依据。
  • 避免依赖旧的CONNECTIVITY_ACTION判断网络状态,因为当移动数据开启且WiFi无互联网时,系统会优先标记移动数据为可用网络,掩盖WiFi的实际连接状态。

内容的提问来源于stack exchange,提问作者Alexandre Dock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:12:27