Android Q a ajouté un nouveau type de réseau, NETWORK_TYPE_NR, pour la 5G, il n'est pas disponible pour Android Pie. Pourtant, le Samsung S10 5G qui vient de sortir a entièrement pris en charge la fonction 5G, il peut afficher une icône 5G sur la barre d'état lorsqu'il est sur le réseau 5G.
Est-il possible pour une application tierce de savoir que le téléphone est sur un réseau 5G pour un appareil Pie?
Toute aide sera appréciée.
Le lien suivant est la définition du nouveau type de réseau. Il n'est pas disponible sur la branche Android Pie.
Code source de la version Pie https://android.googlesource.com/platform/frameworks/base/+/refs/heads/pie-release-2/telephony/java/android/telephony/TelephonyManager.java
< / li>Le dernier code source contenant NETWORK_TYPE_NR https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/telephony/java/android/telephony/TelephonyManager.java#2375
5 Réponses :
Je pense qu'ils ont rétroporté le code de Q vers Pie car la logique de la 5G a été implémentée à la fin de l'année dernière en Q (alpha).
Donc lors de l'utilisation
TelephonyManager.getNetworkType ()
vous obtiendrez probablement
20 (5G)
EDIT[
Comme le commentaire ci-dessous: Le type de réseau sera 13 donc cela ne résout pas le problème.
MODIFIER
Essayez d'utiliser la réflexion
static boolean isNRConnected(TelephonyManager telephonyManager) { try { Object obj = Class.forName(telephonyManager.getClass().getName()) .getDeclaredMethod("getServiceState", new Class[0]).invoke(telephonyManager, new Object[0]); Method[] methods = Class.forName(obj.getClass().getName()).getDeclaredMethods(); for (Method method : methods) { if (method.getName().equals("getNrStatus") || method.getName().equals("getNrState")) { method.setAccessible(true); return ((Integer) method.invoke(obj, new Object[0])).intValue() == 3; } } } catch (Exception e) { e.printStackTrace(); } return false; }
Non, il renvoie 13 (LTE) comme n'importe quel téléphone fonctionnant dans Pie.
Avez-vous ce téléphone et une couverture 5G? Vous pouvez essayer d'appeler la méthode getNrStatus
à partir de la classe ServiceState. Si ce retour 3
, la 5G doit être connectée.
Il n'existe pas de méthode de ce type getNrStatus
dans la classe ServiceState, même pas sous Android Q. Le code ne se compilera pas.
Vous devez utiliser la réflexion.
Géré pour obtenir un SM-G977, l'exemple de code ci-dessus fonctionne. C'est la bonne réponse! BTW, comment extraire le code source du firmware? @Pavel Machala
N'utilisez pas la réflexion, Android ne le recommande pas, ils le forcent également via des interfaces SDK natives
Vous avez raison, utiliser PhoneStateListener et le rappel onDisplayInfo est le moyen préféré sous Android 11. Cependant, l'utilisation de la réflexion a été proposée pour Android 9 et 10. Elle semble fonctionner dans les appareils Samsung mais d'autres fabricants ont utilisé une implémentation différente.
J'ai extrait le ServiceState.java du micrologiciel SM-G977N et il confirme qu'ils ont ajouté
ServiceState.getNrStatus()
5G (NR) est active si NetworkRegistrationState.NR_STATUS_CONNECTED = 3;
L'astuce de réflexion est morte depuis Pie, voir développeur. android.com/distribute/best-practices/develop/… .
Pas vrai. Vous pouvez toujours utiliser la réflexion sur les méthodes publiques. Si vous utilisez la réflexion sur la méthode / les champs privés / protégés, vous êtes en difficulté.
Impossible d'ajouter ceci en commentaire, mais comme @Pavel Machala l'a dit, en regardant le La classe ServiceState dans l'AOSP donne ce qui suit:
/** * Get the NR 5G status of the mobile data network. * @return the NR 5G status. * @hide */ public @NRStatus int getNrStatus() { final NetworkRegistrationState regState = getNetworkRegistrationState( NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); if (regState == null) return NetworkRegistrationState.NR_STATUS_NONE; return regState.getNrStatus(); }
Il existe une documentation officielle pour détecter la 5G sur Android 11. https://developer.android.com/about/versions/11/ fonctionnalités / 5g # détection
Appelez TelephonyManager.listen ()
, en passant LISTEN_DISPLAY_INFO_CHANGED
, pour déterminer si l'utilisateur dispose d'une connexion réseau 5G.
comme @Hunter l'a suggéré, vous devez utiliser "écouter" depuis le gestionnaire de téléphonie, mais si c'est api 30+, vous devez avoir l'autorisation READ_PHONE
accordée et écouter LISTEN_DISPLAY_INFO_CHANGED
onDisplayInfoChanged
from PhoneStateListener
private class CustomPhoneStateListener : PhoneStateListener() { override fun onDisplayInfoChanged(telephonyDisplayInfo: TelephonyDisplayInfo) { super.onDisplayInfoChanged(telephonyDisplayInfo) when (telephonyDisplayInfo.overrideNetworkType) { //5G OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO, OVERRIDE_NETWORK_TYPE_NR_NSA, OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE -> setNetworkChange(NETWORK_TYPE_NR) OVERRIDE_NETWORK_TYPE_LTE_CA -> { setNetworkChange(19) //LTE+ } else -> setNetworkChange(telephonyDisplayInfo.networkType) } } else { setNetworkChange(telephonyDisplayInfo.networkType) } } }
L'auditeur doit être quelque chose comme ceci:
(context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager).listen(customPhoneStateListener,PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED)
Lien: https://developer.android.com/about/versions / 11 / features / 5g # detection