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
相关产品推荐
相关产品推荐

