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

Android网络信息查询遇未解析引用错误,求解决方案

问题解决:Android网络信息查询代码的未解析引用错误

错误原因分析

1. activeNetwork?.network 未解析引用

你用的activeNetwork是NetworkInfo类型,这个类没有network属性,而且NetworkInfo在API 29已经被官方废弃,正确的做法是直接通过ConnectivityManager.getActiveNetwork()获取Network实例,用来查询网络能力。

2. telephonyManager.carrierFrequencyInfo 未解析引用

这个属性是**Android 12(API 31)**才新增的API,如果你的项目编译SDK版本低于31,编译器就会找不到这个引用。另外该API需要ACCESS_FINE_LOCATION权限,且仅在移动网络连接状态下可用。


修正后的完整Kotlin代码

下面是兼容API 21+的替代实现,同时处理了权限和版本兼容问题:

import android.Manifest
import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.telephony.TelephonyManager
import android.telephony.CellInfo
import android.telephony.CellInfoLte
import android.os.Build

fun checkNetworkInfo(context: Context) {
    // 1. 检查网络连接状态与类型
    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val activeNetwork: Network? = cm.activeNetwork
    val networkCapabilities = activeNetwork?.let { cm.getNetworkCapabilities(it) }
    
    val isConnected = networkCapabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true
    val isWiFi = networkCapabilities?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true
    val isMobile = networkCapabilities?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == true

    // 2. 获取移动网络类型(兼容旧API)
    var mobileType = "Unknown"
    if (isMobile) {
        val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        mobileType = when (telephonyManager.networkType) {
            TelephonyManager.NETWORK_TYPE_GPRS -> "GPRS"
            TelephonyManager.NETWORK_TYPE_EDGE -> "EDGE"
            TelephonyManager.NETWORK_TYPE_UMTS -> "UMTS"
            TelephonyManager.NETWORK_TYPE_HSDPA -> "HSDPA"
            TelephonyManager.NETWORK_TYPE_HSUPA -> "HSUPA"
            TelephonyManager.NETWORK_TYPE_HSPA -> "HSPA"
            TelephonyManager.NETWORK_TYPE_CDMA -> "CDMA"
            TelephonyManager.NETWORK_TYPE_EVDO_0 -> "EVDO revision 0"
            TelephonyManager.NETWORK_TYPE_EVDO_A -> "EVDO revision A"
            TelephonyManager.NETWORK_TYPE_1xRTT -> "1xRTT"
            TelephonyManager.NETWORK_TYPE_LTE -> "LTE"
            TelephonyManager.NETWORK_TYPE_NR -> "5G"
            else -> "Unknown"
        }
    }

    // 3. 获取运营商频率(兼容API 21+)
    var carrierFrequency = "Not available"
    val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    // 检查权限和API版本
    if (context.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == android.content.pm.PackageManager.PERMISSION_GRANTED) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // API 26+ 获取CellInfo
            val cellInfoList: List<CellInfo>? = telephonyManager.allCellInfo
            cellInfoList?.forEach { cellInfo ->
                if (cellInfo is CellInfoLte && cellInfo.isRegistered) {
                    val dlFreq = cellInfo.cellSignalStrength.downlinkFrequency
                    carrierFrequency = if (dlFreq != 0) "${dlFreq} Hz" else "Not available"
                }
            }
        }
        // API 31+ 可选使用官方新增的carrierFrequencyInfo
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            telephonyManager.carrierFrequencyInfo?.let { info ->
                carrierFrequency = "${info.dlBandwidth} Hz"
            }
        }
    } else {
        carrierFrequency = "Need ACCESS_FINE_LOCATION permission"
    }

    // 输出结果
    println("Connected: $isConnected")
    println("WiFi: $isWiFi")
    println("Mobile: $isMobile")
    println("Mobile Type: $mobileType")
    println("Carrier Frequency: $carrierFrequency")
}

注意事项

  • 权限声明:在AndroidManifest.xml中添加权限:
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  • 动态权限:Android 6.0(API 23)及以上需要动态请求ACCESS_FINE_LOCATION权限才能获取频率信息。
  • API版本兼容:如果你的项目需要兼容更低版本,可以根据实际情况调整CellInfo的处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:15:31