2010-05-20 7 views
3

J'essaye d'utiliser le Wifimanager pour calculer le niveau de signal des points d'accès trouvés pendant un balayage.Problème avec WifiManager.calculateSignalLevel (RSSI, 5)

J'utilise la méthode suivante:

WifiManager.calculateSignalLevel(int, int)

Mais il semble revenir toujours le même entier quel que soit le niveau RSSI est.

Voici mon code:


public int calculateQoS(int aRSSI){ 

    signalLevel = WifiManager.calculateSignalLevel(RSSI, 5); 

    return signalLevel; 

} 

public void testCalculateQoS(){ 

      Log.d("signal", "signal = : " 
        + connMonitor.calculateQoS(-44) 
        + " " + connMonitor.calculateQoS(-80) 
        + " " + connMonitor.calculateQoS(-120) 
        + " " + connMonitor.calculateQoS(-20)); 

     } 

Les sorties de journalisation 1 pour tous les cas de test pour calculateQoS (int).

Ai-je manqué quelque chose de simple ici? Pourquoi le SignalLevel est toujours 1?

Répondre

10

Il semble que calculateSignalLevel est mis en œuvre ainsi:

public static int calculateSignalLevel(int rssi, int numLevels) { 
    if (rssi <= MIN_RSSI) { 
     return 0; 
    } else if (rssi >= MAX_RSSI) { 
     return numLevels - 1; 
    } else { 
     int partitionSize = (MAX_RSSI - MIN_RSSI)/(numLevels - 1); 
     return (rssi - MIN_RSSI)/partitionSize; 
    } 
} 

Peut-être que cet extrait de code peut expliquer votre problème. A noter également:

http://code.google.com/p/android/issues/detail?id=2555

+1

Merci pour cette réponse et surtout pour le code de la mise en œuvre. Selon le problème des références (qui est toujours ouvert comme aujourd'hui), toutes les valeurs de numLevels supérieures à 45 entraînent une division par zéro. – Ridcully

6

grâce à cette question que je pourrais éviter problème sur les versions de l'API bas alors celui que je suis ciblage. Je l'ai donc fait pour que vous puissiez l'utiliser sur n'importe quelle version de la plateforme.

public int getWifiSignalStrength(Context context){ 
    int MIN_RSSI  = -100; 
    int MAX_RSSI  = -55; 
    int levels   = 101; 
    WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);    
    WifiInfo info  = wifi.getConnectionInfo(); 
    int rssi   = info.getRssi(); 

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH){ 
     return WifiManager.calculateSignalLevel(info.getRssi(), levels); 
    } else {    
     // this is the code since 4.0.1 
     if (rssi <= MIN_RSSI) { 
      return 0; 
     } else if (rssi >= MAX_RSSI) { 
      return levels - 1; 
     } else { 
      float inputRange = (MAX_RSSI - MIN_RSSI); 
      float outputRange = (levels - 1); 
      return (int)((float)(rssi - MIN_RSSI) * outputRange/inputRange); 
     } 
    } 
}//end method 
2

Ce problème est que dans Android 2.3,
vous pouvez le remplacer par le dernier code de WiFiManger d'un androïde 4,2

Voici le code:

public int calculateSignalLevel(int rssi, int numLevels) { 
    if(rssi <= MIN_RSSI) { 
     return 0; 
    } else if(rssi >= MAX_RSSI) { 
     return numLevels - 1; 
    } else { 
     float inputRange = (MAX_RSSI - MIN_RSSI); 
     float outputRange = (numLevels - 1); 
     if(inputRange != 0) 
      return (int) ((float) (rssi - MIN_RSSI) * outputRange/inputRange); 
    } 
    return 0; 
}