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

如何在Xamarin Forms应用中检查网络信号强度并限制不稳定访问?

在Xamarin Forms中检查网络连接状态与信号强度

一、解决现有代码的崩溃问题

你的代码崩溃主要由三个原因导致:权限缺失、API版本兼容性问题、空指针风险,以下是修正方案:

1. 补充必要权限

在Android项目的AndroidManifest.xml中添加网络状态相关权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Android 12+ 获取蜂窝网络信息需额外权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" android:maxSdkVersion="30" />

2. 适配Android 10+的API(替代弃用的ActiveNetworkInfo)

using Android.Content;
using Android.Net;
using Android.Telephony;
using Android.OS;

public static class NetworkUtils
{
    // 检查是否为稳定快速连接
    public static bool IsConnectedFast(Context context)
    {
        if (context == null) return false;

        ConnectivityManager cm = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService);
        if (cm == null) return false;

        // 适配Android 10+的网络状态获取方式
        Network activeNetwork = cm.ActiveNetwork;
        NetworkCapabilities capabilities = cm.GetNetworkCapabilities(activeNetwork);
        if (capabilities == null) return false;

        // 验证是否具备有效网络连接
        bool hasValidConnection = capabilities.HasCapability(NetCapability.Internet) && capabilities.HasCapability(NetCapability.Validated);
        if (!hasValidConnection) return false;

        // 判断连接类型是否为快速网络
        if (capabilities.HasTransport(TransportType.Wifi))
        {
            return true; // WiFi默认视为稳定快速连接
        }
        else if (capabilities.HasTransport(TransportType.Cellular))
        {
            TelephonyManager tm = (TelephonyManager)context.GetSystemService(Context.TelephonyService);
            if (tm == null) return false;
            
            return IsCellularConnectionFast(tm.DataNetworkType);
        }

        return false;
    }

    // 判断蜂窝网络是否为快速连接
    private static bool IsCellularConnectionFast(TelephonyManagerDataNetworkType networkType)
    {
        return networkType switch
        {
            TelephonyManagerDataNetworkType.Lte => true,
            TelephonyManagerDataNetworkType.Hspa => true,
            TelephonyManagerDataNetworkType.HspaPlus => true,
            TelephonyManagerDataNetworkType.EvdorevA => true,
            TelephonyManagerDataNetworkType.Nr => true, // 5G
            _ => false,
        };
    }
}

二、获取WiFi/移动网络信号强度

1. WiFi信号强度获取

public static int GetWifiSignalStrength(Context context)
{
    WifiManager wifiManager = (WifiManager)context.GetSystemService(Context.WifiService);
    if (wifiManager == null || !wifiManager.IsWifiEnabled) return -1;

    WifiInfo wifiInfo = wifiManager.ConnectionInfo;
    // 将RSSI值(-100到-50)转换为0-100的百分比
    int rssi = wifiInfo.Rssi;
    if (rssi <= -100) return 0;
    if (rssi >= -50) return 100;
    return 2 * (rssi + 100);
}

2. 移动网络信号强度获取

public static int GetCellularSignalStrength(Context context)
{
    TelephonyManager tm = (TelephonyManager)context.GetSystemService(Context.TelephonyService);
    if (tm == null) return -1;

    if (Build.VERSION.SdkInt >= BuildVersionCodes.S)
    {
        SignalStrength signalStrength = tm.SignalStrength;
        if (signalStrength == null) return -1;
        
        // LTE信号强度(RSRP)范围-140到-44,转换为百分比
        int rsrp = signalStrength.LteRsrp;
        if (rsrp == SignalStrength.Invalid) return -1;
        if (rsrp <= -140) return 0;
        if (rsrp >= -44) return 100;
        return (rsrp + 140) * 100 / 96;
    }
    else
    {
        SignalStrength signalStrength = tm.SignalStrength;
        if (signalStrength == null) return -1;
        
        // GSM信号强度范围0-31,转换为百分比
        int gsmSignal = signalStrength.GsmSignalStrength;
        if (gsmSignal == 99) return -1;
        return (gsmSignal * 100) / 31;
    }
}

三、Xamarin Forms跨平台统一实现

通过依赖服务封装,实现跨平台调用:

1. 定义共享接口(Shared/PCL项目)

public interface INetworkService
{
    bool IsConnectedFast();
    int GetWifiSignalStrength();
    int GetCellularSignalStrength();
}

2. Android端实现

[assembly: Dependency(typeof(NetworkServiceAndroid))]
namespace YourApp.Droid
{
    public class NetworkServiceAndroid : INetworkService
    {
        private Context Context => Android.App.Application.Context;

        public bool IsConnectedFast()
        {
            return NetworkUtils.IsConnectedFast(Context);
        }

        public int GetWifiSignalStrength()
        {
            return NetworkUtils.GetWifiSignalStrength(Context);
        }

        public int GetCellularSignalStrength()
        {
            return NetworkUtils.GetCellularSignalStrength(Context);
        }
    }
}

3. 业务逻辑中使用

var networkService = DependencyService.Get<INetworkService>();
bool isStable = networkService.IsConnectedFast();
int wifiStrength = networkService.GetWifiSignalStrength();
int cellularStrength = networkService.GetCellularSignalStrength();

// 根据网络状态限制服务器访问
if (!isStable || (wifiStrength != -1 && wifiStrength < 20) || (cellularStrength != -1 && cellularStrength < 20))
{
    DisplayAlert("提示", "当前网络不稳定,请检查网络后重试", "确定");
    // 阻止后续服务器请求操作
}
else
{
    // 执行正常服务器访问逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:54:57