Как определить различия между 4G (LTE) и 5G NR (АНБ) в Android 14+?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как определить различия между 4G (LTE) и 5G NR (АНБ) в Android 14+?

Сообщение Anonymous »

Код: Выделить всё

    @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)"
}
}
}
Проблема с этим кодом в Whis Im Im Im 4g LTE Network (Источник: G-NET Track Pro Info) Эта сеть как 5G NR (NSA), потому что (я не знаю, почему), overdetype == TelephonyDisplayInfo.Override_network_type_nr_nsa in 4g (lte) и 5G (Lte) и 5G (LTE) и 5G (LTE) и 5G (Lte) и 5G (LTE) и 5G (LTE) и 5G (LTE) и 5G (LTE) и 5G (LTE). (NSA) .. < /p>
Основная проблема для обнаружения 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;
Кроме того:*#*#4636#*#* меню Показать nr_nsa как для голоса, так и для сети, но G-Net Track Pro отчеты как 4G LTE, а не 5G NR (NSA), и я думаю, что это нормально, потому что нет логотипа 5G в течение жизни.>

Подробнее здесь: https://stackoverflow.com/questions/796 ... android-14
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»