2013-07-26 4 views
0

Je voudrais vérifier si la méthode wifiManager.startScan() a effectivement réussi à faire un balayage d'AP. Cette méthode renvoie true si le démarrage a commencé, mais pas si l'analyse a réussi. En effet, je reçois parfois le message "Échec d'initialisation d'AP" dans le LogCat même si wifiManager.startScan() renvoie vrai ... Alors, comment puis-je redémarrer une nouvelle analyse quand j'ai ce message dans le logcat?Vérifiez si le succès de startScan

Ceci est une partie de mon code actuel:

while(wifiManager.startScan()==false){ 
wifiManager.startScan(); 
} 

PS:

Le code complet de mon BroadcastReceiver:

package paquet.wifiview2; 

import android.net.wifi.ScanResult; 
import android.net.wifi.WifiManager; 
import android.util.Log; 
import android.widget.Toast; 

import java.util.List; 

import android.annotation.SuppressLint; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 


public class WifiBroadcastReceiver extends BroadcastReceiver { 

    private WifiManager wifiManager; 
    private WifiAdapter wifiAdapter; 
    private List<WifiItem> listeWifiItem; 
    private int position=0; 
    private boolean start=true; 
    private int numberdisplay=4; 
    private float[][] valueRSSI = new float[5][10]; 
    private String[] macAdress = new String[5]; 
    private int[] sampleposition = new int[5]; 
    private String[] sSID = new String[5]; 
    private int totalsample=50; 
    private boolean copy=false; 
    private static boolean broadcastFinish=true; 
    //private boolean scanStart=false; 


    @SuppressLint("ShowToast") 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     macAdress[0]="5c:0e:8b:26:d7:72"; 
     macAdress[1]="5c:0e:8b:26:d7:70"; 
     macAdress[2]="00:16:9c:92:04:30"; 
     macAdress[3]="00:1c:df:7f:6b:85"; 
     macAdress[4]="5c:0e:8b:21:81:12"; 

     Log.d("info3","broadcastFinish (Receiver) : " + broadcastFinish); 


     wifiManager = ((WifiActivity) context).getCurrentWifiManager(); 
     wifiAdapter = ((WifiActivity) context).getWifiAdapter(); 
     listeWifiItem = ((WifiActivity) context).getListeWifiItem(); 
     if(position>numberdisplay){position=0;} 

     // Check if the object is well instantiated 
     if (wifiManager != null) { 

      // Check if wifi is turned on 
      if (wifiManager.isWifiEnabled()) { 


       List<ScanResult> listeScan = wifiManager.getScanResults();// Getting the scan 
       if (sampleposition[numberdisplay-1]==totalsample || start==true){ //If the number of samples is equal to the wished number 

        // For each scan 

          if(start==false && position<=numberdisplay-1){ // If you don't initialize and if you haven't real all the AP 
           if(position == 0){copy=true;listeWifiItem.clear();} // If you start to read your list, you have to delete your old list before 
           if(copy==true){ //If you start to read your list effectively 
            while(position<=numberdisplay-1){ // While you haven't read all the AP. 
             if(sampleposition[position]!=0 && (position == 0 || macAdress[position]!=macAdress[0] && macAdress[position]!=macAdress[position-1])){ 
              //If the sample quantity of a position isn't null and if you haven't copy the concerned mac address 
              for(int i=0;i<=1;i++){ 
               WifiItem item = new WifiItem(); 
               item.setAdresseMac(macAdress[position]); 
               if(i==1){item.setAPName("old : " + sSID[position]);} else{item.setAPName(sSID[position]);} 
               item.setForceSignal((valueRSSI[position][i])/(sampleposition[position])); 
               Log.d("Info1",sSID[position] + " | macAdress[" + position + "] : " + macAdress[position] + " - RSSI : " + (valueRSSI[position][i])/(sampleposition[position]) + " dBm - echantillons : " + (sampleposition[position])); 
               listeWifiItem.add(item); 
              } 
             } 
            sampleposition[position]=0; //réinitialisation du nombre d'échantillon par position 
            position++;//Incrementation of the readed position 
            } 
           } 
          } 
          else{ //Initialization of WifiItem 
           while(position<=numberdisplay-1) { //You read all the scanned AP 
            for(int i=0;i<=1;i++){ 
            WifiItem item = new WifiItem(); 
            item.setAdresseMac("00:00:00:00:00"); 
            item.setAPName("Initalisation"); 
             if (start == true){item.setForceSignal(1);} //Si on initalise bien, on affiche juste 1 
            listeWifiItem.add(item); 
            } 
            for(int i=0;i<=9;i++){valueRSSI[position][i]=0;}//réinitialisation de la RSSI par position 
            sampleposition[position]=0;//réinitialisation du nombre d'échantillon par position 
            position++;//Incrémentation de la position lue 

           } 
          } 
          if(position==numberdisplay){start=false;position=0;} //If you have exceed the wanted number of displayed points, you go back to 0 and don't start. 

       // Refreshing of the list 
        copy=false; 
        wifiAdapter.notifyDataSetChanged(); 
       } 

       else { 
        if(position <=numberdisplay-1){ //If you haven't exceed the wanted number of positions 
         for (ScanResult scanResult : listeScan) { 
          broadcastFinish = false; 
          if(sampleposition[position]==0){ //If you haven't start to sample 
           if(macAdress[position].equals(scanResult.BSSID)){ //Initialisation réelle des valeurs des positions 
            for(int i=9;i>=1;i--){valueRSSI[position][i] = valueRSSI[position][i-1];} //Saving the old values of the RSSI average 
            valueRSSI[position][0] = scanResult.level; //Starting to make a new average of 50 samples 
            sSID[position] = scanResult.SSID; 
            Log.d("WifiActivity", scanResult.SSID + " MAC : " + scanResult.BSSID + " LEVEL " + scanResult.level + " | macadress : " + macAdress[position]); 
            if(valueRSSI[position][0]!=0){sampleposition[position]++;} 
            break; 
           } 
          } 
          else{ 
           if(macAdress[position].equals(scanResult.BSSID) && sampleposition[position]<=totalsample){ 
            valueRSSI[position][0] = valueRSSI[position][0] + scanResult.level; 
            Log.d("WifiActivity", scanResult.SSID + " MAC : " + scanResult.BSSID + " LEVEL " + scanResult.level + " | macadress : " + macAdress[position]); 
            sampleposition[position]++; 
            break; 
           } 
          } 
         } 
         broadcastFinish = true; 

        } 
        if(sampleposition[position]>=totalsample){position++;} 
       } 
      } 
     } 

     else { 
      Toast.makeText(context, "Vous devez activer votre WiFi", Toast.LENGTH_SHORT); 
     } 
    } 


    public static boolean getBroadcastFinish() { 
      return broadcastFinish; 
     } 

} 

Répondre

0

Ce que vous faites est de commencer la numérisation deux fois par cycle de votre boucle. Je suppose que ce que vous voulez est:

boolean success = false; 
while(success == false){ 
    success = wifiManager.startScan(); 
} 

S'il vous plaît noter que vous pouvez bloquer le thread d'interface utilisateur si vous n'effectuez pas ce code dans un thread d'arrière-plan. En outre, startScan renvoyant true ne dit pas que les nouveaux résultats d'analyse sont disponibles. Pour cela, vous devez enregistrer un BroadcastReceiver pour WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.

+0

J'ai jamais enregistré un 'BroadcastReceiver' pour cela: ' \t @Override \t protégé vide onResume() { \t registerReceiver (BroadcastReceiver, nouvelle IntentFilter ( \t WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); \t super.onResume(); Mais quand vous dites que je pourrais bloquer le thread de l'interface utilisateur, voulez-vous dire que je devrais attendre un tel moment avant de redémarrer une nouvelle analyse? – lukronos

+0

Non, je veux dire que l'interface utilisateur pourrait se bloquer si startScan échoue depuis longtemps pour une raison quelconque. Vous devriez attendre jusqu'à ce que le BroadcastReceiver reçoive une mise à jour, puis lancer une nouvelle analyse, btw. Est-ce que ma réponse m'a aidé? –

+0

Ok, merci! Mais comment puis-je attendre jusqu'à ce que le BroadcastReceiver reçoive une mise à jour? J'ai essayé de créer une méthode statique comme ceci 'public static boolean getBroadcastFinish() {return broadcastFinish;}' dans BroadcastReceiver.java et obtenez: 'broadcastFinish = WifiBroadcastReceiver.getBroadcastFinish(); Log.d ("info3", "broadcastFinish (activity):" + broadcastFinish); si (broadcastFinish == true) {...} ' \t \t \t \t dans mon MainActivity, mais le code fonctionne à nouveau, même si j'écris' broadcastFinish = false; 'lorsque le BroadcastReceiver utilise l'analyse ... Désolé pour mon anglais. – lukronos

Questions connexes