2
votes

Comment détecter que Samsung S10 5G fonctionne sur le réseau 5G?

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.


0 commentaires

5 Réponses :


2
votes

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;
}


7 commentaires

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.



0
votes

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;


2 commentaires

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é.



0
votes

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();
}


0 commentaires

1
votes

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.


0 commentaires

0
votes

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


0 commentaires