Код: Выделить всё
@SuppressLint("MissingPermission")
suspend fun getNetworkType_2(context: Context, telephonyManager: TelephonyManager): String = suspendCancellableCoroutine { cont ->
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED ||
ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
cont.resume("Permission Required")
return@suspendCancellableCoroutine
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
CoroutineScope(Dispatchers.Main).launch {
val listener = object : PhoneStateListener() {
override fun onDisplayInfoChanged(displayInfo: TelephonyDisplayInfo) {
val networkType = telephonyManager.dataNetworkType
val voiceType = telephonyManager.voiceNetworkType
val overrideType = displayInfo.overrideNetworkType
val cellInfos = telephonyManager.allCellInfo ?: emptyList()
val nrRegistered = cellInfos.any { it is CellInfoNr && it.isRegistered }
val lteRegistered = cellInfos.any { it is CellInfoLte && it.isRegistered }
val bands = cellInfos.mapNotNull {
when (it) {
is CellInfoLte -> (it.cellIdentity as? CellIdentityLte)?.earfcn?.let { earfcn -> "L$earfcn" }
is CellInfoNr -> (it.cellIdentity as? CellIdentityNr)?.nrarfcn?.let { nrarfcn -> "N$nrarfcn" }
else -> null
}
}
val hasNrBand = bands.any { it.startsWith("N") }
telephonyManager.listen(this, PhoneStateListener.LISTEN_NONE)
Log.d("GeneralMetrics","Logs for identify 5G NR (NSA)")
Log.d("GeneralMetrics","===========================")
Log.d("GeneralMetrics","networkType: $networkType")
Log.d("GeneralMetrics","voiceType: $voiceType")
Log.d("GeneralMetrics","overrideType: $overrideType")
Log.d("GeneralMetrics","cellInfos: $cellInfos")
Log.d("GeneralMetrics","nrRegistered: $nrRegistered")
Log.d("GeneralMetrics","lteRegistered: $lteRegistered")
Log.d("GeneralMetrics","bands: $bands")
Log.d("GeneralMetrics","hasNrBand: $hasNrBand")
Log.d("GeneralMetrics","===========================")
val finalNetworkType = when {
// ✅ 5G NR (SA): Only NR registered
nrRegistered && !lteRegistered -> "5G NR (SA)"
// ✅ 5G NR (NSA): LTE registered, override says NSA, and voice is not NR
lteRegistered && overrideType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA &&
voiceType != TelephonyManager.NETWORK_TYPE_NR -> "5G NR (NSA)"
// ✅ 4G (LTE): LTE registered, network and voice both LTE
lteRegistered && networkType == TelephonyManager.NETWORK_TYPE_LTE &&
voiceType == TelephonyManager.NETWORK_TYPE_LTE -> "4G (LTE)"
// ✅ NR fallback
networkType == TelephonyManager.NETWORK_TYPE_NR -> "5G NR (Unclassified)"
// ✅ SA override fallback
overrideType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED && nrRegistered -> "5G NR (SA)"
else -> getNetworkDescription(networkType, overrideType)
}
Log.d("NetworkType", "Final Network Type: $finalNetworkType, dataNetworkType=$networkType, overrideType=$overrideType, lteRegistered=$lteRegistered, nrRegistered=$nrRegistered, voiceType=$voiceType")
if (cont.isActive) {
cont.resume(finalNetworkType)
}
}
}
telephonyManager.listen(listener,
PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED or
PhoneStateListener.LISTEN_CELL_INFO or
PhoneStateListener.LISTEN_DATA_CONNECTION_STATE)
cont.invokeOnCancellation {
telephonyManager.listen(listener, PhoneStateListener.LISTEN_NONE)
}
}
} else {
val networkType = telephonyManager.dataNetworkType
cont.resume(getNetworkDescription(networkType, TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE))
}
}
fun getNetworkDescription(networkType: Int, overrideType: Int): String {
return when (overrideType) {
TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA -> "4G (LTE+ Carrier Aggregation)"
TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO -> "4G (LTE Advanced Pro)"
else -> when (networkType) {
TelephonyManager.NETWORK_TYPE_GSM -> "2G (GSM)"
TelephonyManager.NETWORK_TYPE_EDGE -> "2G (EDGE)"
TelephonyManager.NETWORK_TYPE_CDMA -> "2G (CDMA)"
TelephonyManager.NETWORK_TYPE_1xRTT -> "2G (1xRTT)"
TelephonyManager.NETWORK_TYPE_IDEN -> "2G (iDEN)"
TelephonyManager.NETWORK_TYPE_UMTS -> "3G (UMTS)"
TelephonyManager.NETWORK_TYPE_EVDO_0 -> "3G (EVDO Rev. 0)"
TelephonyManager.NETWORK_TYPE_EVDO_A -> "3G (EVDO Rev. A)"
TelephonyManager.NETWORK_TYPE_EVDO_B -> "3G (EVDO Rev. B)"
TelephonyManager.NETWORK_TYPE_HSDPA -> "3G (HSDPA)"
TelephonyManager.NETWORK_TYPE_HSUPA -> "3G (HSUPA)"
TelephonyManager.NETWORK_TYPE_HSPA -> "3G (HSPA)"
TelephonyManager.NETWORK_TYPE_EHRPD -> "3G (eHRPD)"
TelephonyManager.NETWORK_TYPE_HSPAP -> "3G (HSPA+)"
TelephonyManager.NETWORK_TYPE_LTE -> "4G (LTE)"
TelephonyManager.NETWORK_TYPE_NR -> "5G NR (Unclassified)"
TelephonyManager.NETWORK_TYPE_UNKNOWN -> "Unknown"
else -> "Other ($networkType)"
}
}
}
Основная проблема для обнаружения NR (NSA) состоит в том, что в этом случае нет NR -клеток .. < /p>
Как найти, где я нахожусь в 5G NR (NSA) или 4G (LTE)? Приложение. < /p>
Код: Выделить всё
/**
* Override network type when the device is connected to
* {@link TelephonyManager#NETWORK_TYPE_LTE} network and has E-UTRA-NR Dual Connectivity(EN-DC)
* capability or is currently connected to the secondary
* {@link TelephonyManager#NETWORK_TYPE_NR} cellular network.
*/
public static final int OVERRIDE_NETWORK_TYPE_NR_NSA = 3;
/* I need to catch only this: """or is currently connected to the secondary {@link TelephonyManager#NETWORK_TYPE_NR} cellular network."""*/
Подробнее здесь: https://stackoverflow.com/questions/796 ... android-14
Мобильная версия