web-dev-qa-db-fra.com

Obtenez la vitesse actuelle d'Internet (mobile et Wifi) en utilisant Android

J'ai une application qui doit fonctionner en mode hors ligne et en ligne. L'application doit faire des demandes au serveur d'application en fonction de la vitesse Internet de la connexion réseau actuelle (Wifi ou Data).

Si le Wifi est connecté, je peux obtenir la puissance du signal Wifi de la connexion actuelle en utilisant ce code.

WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), 5);

OR

wifiInfo.getLinkSpeed();

Si l'Internet mobile est connecté, j'ai pu obtenir la force de chant en utilisant la classe d'écoute

@Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);
        int obj  = signalStrength.getGsmSignalStrength();
        int dBm = (2 * obj) -113;
 }

Les codes ci-dessus obtiennent la force du signal, pas la vitesse. Alors, comment puis-je obtenir la vitesse actuelle du réseau connecté?

Normalement, les applications de test de vitesse trouvées dans les magasins ou les sites Web vérifient la vitesse en envoyant ou en téléchargeant un fichier spécifique ou en envoyant une requête ping à un serveur distant, puis en calculant la vitesse en utilisant le temps écoulé.

Cette fonctionnalité de téléchargement/téléchargement ou de ping n'est pas prise en charge par le serveur d'applications avec lequel je communique, donc je ne suis pas en mesure de l'utiliser.

Alors, existe-t-il un autre moyen de vérifier la vitesse de la connexion Internet actuelle qui peut être effectuée en temps réel?

Toute piste pourrait être utile.

PS: Ce lien a le code pour vérifier le type de connectivité du réseau actuel. Mais il y a des cas où j'ai un signal LTE avec une pleine puissance mais pas/une connexion Internet très lente. Donc, cela aussi, ne sera pas une solution précise pour moi.

https://Gist.github.com/emil2k/5130324

17
user198530

Vous ne pouvez pas obtenir la vitesse de téléchargement/téléchargement sans cingler aucun serveur. Comme votre serveur ne prend pas en charge le ping, vous pouvez utiliser un site de ping tiers.

Avec la bibliothèque JSpeedTest vous pouvez le faire facilement. Certaines de vos fonctionnalités souhaitées sont disponibles dans cette bibliothèque. Tel que

  • téléchargement du test de vitesse
  • téléchargement de test de vitesse
  • téléchargement de progression de téléchargement/téléchargement
  • nom d'hôte/port/uri configurable (nom d'utilisateur et mot de passe pour FTP)
  • délai d'expiration de socket et taille de bloc configurables
  • configurer le stockage de fichiers de téléchargement

Gradle:

compile 'fr.bmartel:jspeedtest:1.32.1'

Exemple de code:

SpeedTestSocket speedTestSocket = new SpeedTestSocket();

// add a listener to wait for speedtest completion and progress
speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {

    @Override
    public void onCompletion(SpeedTestReport report) {
        // called when download/upload is complete
        System.out.println("[COMPLETED] rate in octet/s : " + report.getTransferRateOctet());
        System.out.println("[COMPLETED] rate in bit/s   : " + report.getTransferRateBit());
    }

    @Override
    public void onError(SpeedTestError speedTestError, String errorMessage) {
         // called when a download/upload error occur
    }

    @Override
    public void onProgress(float percent, SpeedTestReport report) {
        // called to notify download/upload progress
        System.out.println("[PROGRESS] progress : " + percent + "%");
        System.out.println("[PROGRESS] rate in octet/s : " + report.getTransferRateOctet());
        System.out.println("[PROGRESS] rate in bit/s   : " + report.getTransferRateBit());
    }
});
2
Anisuzzaman Babla