在Android手机上检测5G连接

在Android手机上检测5G连接,android,telephonymanager,Android,Telephonymanager,我正在尝试确定手机连接的类型。 我使用了不同的方法,比如建议的方法,但结果是,在三星安卓10和5G连接上,我一直使用4G。 如何读取正确的网络类型 private fun getNetworkType(telephonyManager: TelephonyManager): String { return when (telephonyManager.networkType) { TelephonyManager.NETWORK_TYPE_UNKNOWN -> "u

我正在尝试确定手机连接的类型。 我使用了不同的方法,比如建议的方法,但结果是,在三星安卓10和5G连接上,我一直使用4G。 如何读取正确的网络类型

private fun getNetworkType(telephonyManager: TelephonyManager): String {
    return when (telephonyManager.networkType) {
        TelephonyManager.NETWORK_TYPE_UNKNOWN -> "unknown"

        TelephonyManager.NETWORK_TYPE_GPRS,
        TelephonyManager.NETWORK_TYPE_EDGE,
        TelephonyManager.NETWORK_TYPE_CDMA,
        TelephonyManager.NETWORK_TYPE_1xRTT,
        TelephonyManager.NETWORK_TYPE_IDEN,
        TelephonyManager.NETWORK_TYPE_GSM -> "2G"

        TelephonyManager.NETWORK_TYPE_UMTS,
        TelephonyManager.NETWORK_TYPE_EVDO_0,
        TelephonyManager.NETWORK_TYPE_EVDO_A,
        TelephonyManager.NETWORK_TYPE_HSDPA,
        TelephonyManager.NETWORK_TYPE_HSUPA,
        TelephonyManager.NETWORK_TYPE_HSPA,
        TelephonyManager.NETWORK_TYPE_EVDO_B,
        TelephonyManager.NETWORK_TYPE_EHRPD,
        TelephonyManager.NETWORK_TYPE_HSPAP,
        TelephonyManager.NETWORK_TYPE_TD_SCDMA -> "3G"

        TelephonyManager.NETWORK_TYPE_LTE,
        TelephonyManager.NETWORK_TYPE_IWLAN -> "4G"

        TelephonyManager.NETWORK_TYPE_NR -> "5G"

        else -> "something else"
    }
}

private fun getRadioTechnology(telephonyManager: TelephonyManager): String {
    try {
        val obj = Class.forName(telephonyManager.javaClass.name)
                .getDeclaredMethod("getServiceState", *arrayOfNulls(0)).invoke(telephonyManager, *arrayOfNulls(0))
        val methods: Array<Method> = Class.forName(obj.javaClass.name).declaredMethods
        for (method in methods) {
            if (method.name == "getRadioTechnology" ) {
                method.isAccessible = true
                val radioTechnology = (method.invoke(obj) as Int).toInt()
                return "$radioTechnology"
            }
        }
    } catch (e: Exception) {
        Log.e("Test5G", "", e)
    }
    return ""
}

@SuppressLint("MissingPermission")
fun getActiveSubscriptionInfoList(): String {
    val subscriptionInfos = SubscriptionManager.from(this).activeSubscriptionInfoList
    var ret: String = ""
    for(sub in subscriptionInfos) {
        val id = sub.subscriptionId
        val telephonyManager = telephonyManager.createForSubscriptionId(id);
        ret += getRadioTechnology(telephonyManager)
    }
    return ret
}
private fun getNetworkType(telephonyManager:telephonyManager):字符串{
返回时间(telephonyManager.networkType){
TelephonyManager.NETWORK\u TYPE\u UNKNOWN->“UNKNOWN”
TelephonyManager.NETWORK\u TYPE\u GPRS,
TelephonyManager.NETWORK\u TYPE\u EDGE,
TelephonyManager.NETWORK\u TYPE\u CDMA,
TelephonyManager.NETWORK\u TYPE\u 1xRTT,
TelephonyManager.NETWORK\u TYPE\u IDEN,
TelephonyManager.NETWORK_TYPE_GSM->“2G”
TelephonyManager.NETWORK\u TYPE\u UMTS,
TelephonyManager.NETWORK\u TYPE\u EVDO\u 0,
TelephonyManager.NETWORK_TYPE_EVDO_A,
TelephonyManager.NETWORK\u TYPE\u HSDPA,
TelephonyManager.NETWORK\u TYPE\u HSUPA,
TelephonyManager.NETWORK\u TYPE\u HSPA,
TelephonyManager.NETWORK_TYPE_EVDO_B,
TelephonyManager.NETWORK\u TYPE\u EHRPD,
TelephonyManager.NETWORK\u TYPE\u HSPAP,
TelephonyManager.NETWORK\u TYPE\u TD\u SCDMA->“3G”
TelephonyManager.NETWORK\u TYPE\u LTE,
TelephonyManager.NETWORK\u TYPE\u IWLAN->“4G”
TelephonyManager.NETWORK_TYPE_NR->“5G”
其他->“其他东西”
}
}
private fun getRadioTechnology(telephonyManager:telephonyManager):字符串{
试一试{
val obj=Class.forName(telephonyManager.javaClass.name)
.getDeclaredMethod(“getServiceState”,*arrayOfNulls(0)).invoke(telephonyManager,*arrayOfNulls(0))
val方法:Array=Class.forName(obj.javaClass.name).declaredMethods
for(方法中的方法){
if(method.name==“getRadioTechnology”){
method.isAccessible=true
val radioTechnology=(method.invoke(obj)作为Int.toInt()
返回“$radioTechnology”
}
}
}捕获(e:例外){
Log.e(“Test5G”,“e”)
}
返回“”
}
@SuppressLint(“丢失许可”)
fun getActiveSubscriptionInfoList():字符串{
val subscriptioninfo=SubscriptionManager.from(this).activesubscriptioninfo列表
var ret:String=“”
对于(SubscriptionInfo中的子项){
val id=sub.subscriptionId
val telephonyManager=telephonyManager.createForSubscriptionId(id);
ret+=getRadioTechnology(电话管理器)
}
回程网
}
我就是这样做的:

telephonyManager.listen(object : PhoneStateListener() {
    override fun onServiceStateChanged(serviceState: ServiceState) {
        val isNrAvailable = serviceState.toString().contains("nrState=CONNECTED")
        // use isNrAvailable
    }
}, PhoneStateListener.LISTEN_SERVICE_STATE)


这回答了你的问题吗?不,没有。实际上,我在我的问题中已经把这个答案联系了起来。它并不总是起作用。你解决了这个问题吗?我也有同样的问题:/@Javier请在下面找到答案