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

Android Studio中如何让App仅检测移动数据状态

问题分析

你当前的代码仅通过getActiveNetworkInfo()判断是否存在活跃网络,但该方法在API 29已被废弃,且在部分场景下(比如WiFi关闭但移动数据已开启)可能无法正确识别移动网络的连接状态,导致误判为无网络,进而弹出错误提示。

你的需求是:仅当移动数据不可用时才触发错误提示(即只要移动数据可用,无论WiFi是否开启,都不弹出提示)。

解决方案

我们需要修改网络校验逻辑,直接检查移动数据的可用性,同时兼容新旧Android版本:

兼容所有版本的实现

public static boolean isMobileDataAvailable(@NonNull Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (cm == null) {
        return false;
    }

    // 适配API 29及以上版本
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        Network[] networks = cm.getAllNetworks();
        for (Network network : networks) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
            if (capabilities != null) {
                // 验证是否为已连接的移动网络
                if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) &&
                    capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) &&
                    capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
                    return true;
                }
            }
        }
        return false;
    } else {
        // 适配API 29以下版本
        NetworkInfo mobileNetworkInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        return mobileNetworkInfo != null && mobileNetworkInfo.isConnectedOrConnecting();
    }
}

使用说明

在触发错误提示的逻辑中调用该方法:

  • 若isMobileDataAvailable()返回false:说明移动数据不可用,弹出错误提示
  • 若返回true:说明移动数据可用,无需弹出提示

必要配置

确保在AndroidManifest.xml中添加网络权限:

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

如果你的App targetSdkVersion ≥ 33,还需要动态申请ACCESS_NETWORK_STATE权限。

可选优化(适配“任意网络可用即不提示”场景)

如果你实际需求是只要WiFi或移动数据任意一种可用,就不弹出提示,可以使用以下逻辑:

public static boolean hasAvailableNetwork(@NonNull Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (cm == null) {
        return false;
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        Network[] networks = cm.getAllNetworks();
        for (Network network : networks) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
            if (capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) &&
                capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
                return true;
            }
        }
        return false;
    } else {
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:41:12