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

API 33升级后无网络时APP跳转无连接页面问题求助

问题解决:API33升级后无网无法进入APP的代码调整

问题根源

你的网络检查代码使用了getActiveNetworkInfo()方法,这个方法在Android 10(API29)已被废弃,API33环境下返回值不可靠,会导致网络状态判断错误;同时原逻辑直接通过网络状态拦截APP启动,这才是无网时无法进入APP的核心原因。

代码调整步骤

1. 替换废弃的网络检查方法

使用Android官方推荐的新API实现兼容多版本的网络状态检查,确保判断准确:

public static boolean checkConnection(@NonNull Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Network activeNetwork = connectivityManager.getActiveNetwork();
        if (activeNetwork == null) return false;
        
        NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork);
        // 校验是否具备有效网络传输能力(WiFi/蜂窝/以太网)
        return networkCapabilities != null && 
               (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
                || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET));
    } else {
        // 兼容API23-28的旧版本逻辑
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        return networkInfo != null && networkInfo.isConnected();
    }
}

2. 处理「已连接但无数据」的场景

如果需要判断网络是否能实际访问互联网,不能仅依赖连接状态,建议添加轻量的可用性校验(注意要在子线程执行,避免阻塞主线程):

public static boolean isNetworkAvailable(@NonNull Context context) {
    if (!checkConnection(context)) return false;
    try {
        // 发起简单请求校验网络可用性,可替换为你信任的域名
        URL url = new URL("https://www.google.com");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setConnectTimeout(3000);
        connection.setReadTimeout(3000);
        return connection.getResponseCode() == 200;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}

3. 修改APP启动逻辑(核心)

移除「无网时拦截APP进入」的逻辑:

  • 允许直接进入APP主页面
  • 在主页面顶部添加无网络提示(比如Banner或Toast)
  • 监听网络状态变化,当网络恢复时自动触发数据刷新

4. 权限声明调整

确保AndroidManifest.xml中包含必要的网络权限:

<!-- 基础网络状态检查权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 访问互联网权限(如果APP需要联网功能) -->
<uses-permission android:name="android.permission.INTERNET" />

5. 实时监听网络状态(可选)

使用NetworkCallback替代废弃的网络广播,实时获取网络状态变化:

private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(@NonNull Network network) {
        super.onAvailable(network);
        // 网络恢复,执行数据刷新逻辑
    }

    @Override
    public void onLost(@NonNull Network network) {
        super.onLost(network);
        // 网络断开,显示提示
    }
};

// 注册监听
public void registerNetworkListener(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        connectivityManager.registerDefaultNetworkCallback(networkCallback);
    } else {
        NetworkRequest request = new NetworkRequest.Builder().build();
        connectivityManager.registerNetworkCallback(request, networkCallback);
    }
}

// 页面销毁时注销监听
public void unregisterNetworkListener(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    connectivityManager.unregisterNetworkCallback(networkCallback);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:37:37