当前位置:首页 > 行业动态 > 正文

安卓开发怎么确定数据连接可用

确定安卓设备数据连接可用的方法

在安卓开发中,判断设备的数据连接(如移动网络 4G/5G)是否可用,通常需要结合系统提供的网络状态 API 和权限管理,以下是详细实现步骤和注意事项:


检查网络状态权限

AndroidManifest.xml 中声明权限:

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

此权限为普通权限,无需动态申请。

安卓开发怎么确定数据连接可用  第1张


通过 ConnectivityManager 获取网络信息

核心逻辑是通过 ConnectivityManager 获取当前网络状态,并判断是否为移动数据连接。

步骤说明

  1. 获取 ConnectivityManager 实例

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
  2. 检查网络是否可用(兼容不同 API 版本)

    • API < 23:使用 getActiveNetworkInfo()
      NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
      boolean isAvailable = (activeNetwork != null) && activeNetwork.isConnected();
    • API ≥ 23:使用 getNetworkCapabilities()
      Network network = cm.getActiveNetwork();
      NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
      boolean isAvailable = (capabilities != null) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) 
              && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
  3. 判断是否为移动数据连接

    • API < 23:通过 NetworkInfo.getType()
      boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE;
    • API ≥ 23:通过 NetworkCapabilities.hasTransport()
      boolean isMobile = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);

完整示例代码

public boolean isDataConnectionAvailable(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (cm == null) return false;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23+
        Network network = cm.getActiveNetwork();
        if (network == null) return false;
        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
        return capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
    } else { // API < 23
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        return activeNetwork != null && activeNetwork.isConnected() 
                && activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE;
    }
}

注意事项

问题 解决方案
权限未声明 确保在 AndroidManifest.xml 中添加 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
设备无 SIM 卡或飞行模式 需额外判断 TelephonyManager.getSimState() 或监听网络状态变化(如注册 NetworkCallback
网络类型误判 使用 NetworkCapabilities.hasTransport() 替代已弃用的 NetworkInfo.getSubtype()

相关问题与解答

问题1:如何检查设备是否连接到 WiFi?

解答
通过 ConnectivityManager 判断当前网络类型是否为 WIFI

boolean isWiFiConnected() {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Network network = cm.getActiveNetwork();
        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
        return capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
    } else {
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        return activeNetwork != null && activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
    }
}

问题2:如何监听网络连接状态变化?

解答
注册 NetworkCallback 监听网络变化(适用于 API ≥ 21):

public void registerNetworkCallback(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkRequest request = new NetworkRequest.Builder().build();
    cm.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            super.onAvailable(network);
            // 网络可用时回调
        }
        @Override
        public void onLost(Network network) {
            super.onLost(network);
            // 网络断开时回调
        }
    });
}
0