2015-08-13 10 views
5

Nel mio progetto ho una mappa. Prima vado nella posizione del router Wifi, scruto la lista wifi e seleziono Operator2 e segnalo. Successivamente vado in un'altra posizione raccolgo gli stessi dettagli precedenti di Operator2 (non), quindi Vado in un'altra posizione ripetilo di nuovo.Come ottenere selezionato lo stesso operatore wifi dalla lista wifi ancora e ancora in Android?

Posso in primo luogo selezionare l'operatore WiFi. La prossima volta non so Come bloccare il particolare Dettagli dell'operatore selezionato in precedenza e ottenere di nuovo i dettagli dell'operatore. Per favore aiutami a risolvere questo problema.

enter image description here

My Code:

public class WifiReceiver extends BroadcastReceiver { 

private WifiManager wifiManager; 
private PlanMapperActivity viewerActivity; 
private Context newContext; 

private String operator; 
private String macAddress; 
private int signalStrength; 
private String wifiMode; 
private int frequency; 
private String htMode; 
private String security; 
private int channelNumber; 



private AlertDialog wifiAlertDialog; 
private ListView wifiListView; 
private ProgressDialog progress; 

private Boolean checkWifiSelected; 
private Boolean checkServayStart; 

private String operatorName; 

List<ScanResult> wifiSRList; 

private static final String WPA2 = "WPA2"; 
private static final String WEP = "WEP"; 
private static final String EAP = "EAP"; 
private static final String STORED_OPERATOR = "com.kenturf.wifiheatmap.SELECTED_OPERATOR"; 

private int requiredLevel; 
private int ssidCount; 

public WifiReceiver(Context ctx,PlanMapperActivity planMapper) { 
    this.viewerActivity = planMapper; 
    this.newContext = ctx; 
} 

public WifiReceiver(WifiManager myWifiManager,ProgressDialog wifiProgress,Boolean isWifiSelected,Boolean isSurveyStart) { 
    this.wifiManager = myWifiManager; 
    this.progress = wifiProgress; 
    this.checkWifiSelected = isWifiSelected; 
    this.checkServayStart = isSurveyStart; 
} 

@Override 
public void onReceive(final Context context, Intent intent) { 

    wifiSRList = wifiManager.getScanResults(); 

    if (wifiSRList.size() == 0) { 
     Toast.makeText(context,"wifi List 0",Toast.LENGTH_SHORT).show(); 
    } 

    if (checkWifiSelected) { 
     LayoutInflater wifiLayout = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View wifiView = wifiLayout.inflate(R.layout.dialog_fragment_wifi,null); 

     AlertDialog.Builder wifiDialog = new AlertDialog.Builder(context); 
     wifiDialog.setCancelable(false); 
     wifiDialog.setView(wifiView); 

     wifiAlertDialog = wifiDialog.create(); 
     wifiListView = (ListView)wifiView.findViewById(R.id.user_wifi_detail); 
    } 


    Collections.sort(wifiSRList, new Comparator<ScanResult>() { 
     @Override 
     public int compare(ScanResult lhs, ScanResult rhs) { 
      return (lhs.level > rhs.level ? -1 : (lhs.level == rhs.level ? 0 : 1)); 
     } 
    }); 


    if (checkWifiSelected) { 
     String[] wifiListString = new String[wifiSRList.size()]; 

     for (int i = 0; i < wifiSRList.size(); i++) { 
      wifiListString[i] = (wifiSRList.get(i).SSID); 
     } 

     wifiListView.setAdapter(new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, wifiListString)); 

     wifiAlertDialog.show(); 
     progress.dismiss(); 

     wifiListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       operator = wifiSRList.get(position).SSID; 
       macAddress = wifiSRList.get(position).BSSID; 
       signalStrength = wifiSRList.get(position).level; 
       frequency = wifiSRList.get(position).frequency; 

       final String cap = wifiSRList.get(position).capabilities; 
       final String[] securityModes = {WEP, WPA2, EAP}; 
       for (int i = securityModes.length - 1; i >= 0; i--) { 
        if (cap.contains(securityModes[i])) { 
         security = securityModes[i]; 
        } 
       } 

       setOperator(operator); 
       GetSetClass.wifiOperator = operator; 

       /* error start ..cannot resolved method getPreferences() */ 
       SharedPreferences sharedPref = context.getPreferences(Context.MODE_PRIVATE); // error line 
       SharedPreferences.Editor editor = sharedPref.edit(); 
       editor.putString(STORED_OPERATOR, operator); 
       editor.apply(); 
       /* error end */ 

       operatorName = operator; 
       setMacAddress(macAddress); 
       setSignalStrength(signalStrength); 
       setFrequency(frequency); 
       setSecurity(security); 
       setChannelNumber(convertFrequencyToChannel(frequency)); 
       wifiAlertDialog.dismiss(); 

       checkWifiSelected = false; 
      } 
     }); 
    } 

    if(checkServayStart) { 
     /* error start ..cannot resolved method getPreferences()*/ 
     SharedPreferences shPref = context.getPreferences(Context.MODE_PRIVATE); // error line 
     String savedOperator = shPref.getString(STORED_OPERATOR,null); 

     Log.e("operator : ", "saved operator is : " + savedOperator); 
     /* error end */ 

     if (wifiSRList != null) { 
      ssidCount = wifiSRList.size(); 
      for(int i = wifiSRList.size() - 1; i >= 0; i--) { 
       if (GetSetClass.wifiOperator.equals(wifiSRList.get(i).SSID)) { 
        String requiredOperator = wifiSRList.get(i).SSID; 
         requiredLevel = wifiSRList.get(i).level; 
         context.unregisterReceiver(this); 
        AlertDialog.Builder myBuilder = new AlertDialog.Builder(context); 

        setRequiredLevel(requiredLevel); 

        myBuilder.setTitle("Current Signal"); 
        myBuilder.setMessage("Operator : " + requiredOperator + " \n\nSignal Strength : " + requiredLevel + " dBm"); 
        myBuilder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          dialog.dismiss(); 
         } 
        }); 
        myBuilder.show(); 
       } else { 
        Toast.makeText(context,"Operator Mismatch",Toast.LENGTH_SHORT).show(); 
       } 
      } 

      progress.dismiss(); 
     } 
    } 
} 

public static int convertFrequencyToChannel(int freq) { 
    if (freq >= 2412 && freq <= 2484) { 
     return (freq - 2412)/5 + 1; 
    } else if (freq >= 5170 && freq <= 5825) { 
     return (freq - 5170)/5 + 34; 
    } else { 
     return -1; 
    } 
} 
} 

RISPOSTA AGGIORNAMENTO:

private static final String STORED_FILE = "com.package.name.SELECTED_FILE"; 
private static final String STORED_OPERATOR = "com.package.name.SELECTED_OPERATOR"; 

Salvare i dati SharedPreferences:

SharedPreferences sharedPref = context.getSharedPreferences(STORED_FILE,Context.MODE_PRIVATE); 
SharedPreferences.Editor editor = sharedPref.edit(); 
editor.putString(STORED_OPERATOR, operator); 
editor.apply(); 

ottenere i dati da SharedPreferences:

SharedPreferences shPref = context.getSharedPreferences(STORED_FILE,Context.MODE_PRIVATE); 
String savedOperator = shPref.getString(STORED_OPERATOR,null); 

Log.e("operator : ", "saved operator is : " + savedOperator); 
+0

La mia risposta l'ha aiutata? In caso contrario, si prega di spiegare il motivo lasciando un commento per la risposta. –

+0

È stata aggiornata la risposta per aiutare a ottenere una condivisione di SharedPreferences all'esterno di un'attività. Spero che sia d'aiuto. –

risposta

2

Se ho capito bene, che cosa avete bisogno è un meccanismo per la persistenza quello della rete di WiFi l'utente ha precedentemente selezionato (se presente).

È possibile ottenere ciò utilizzando SharedPreferences.

All'inizio del tuo metodo onReceive, si esegue una query preferenze condivise del vostro app per qualsiasi SSID WiFi salvato:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); 
String savedSsid = sharedPref.getString("saved_wifi_ssid", null); 

Se savedSsid non è nullo, l'utente ha selezionato in precedenza una connessione WiFi, e si può saltare mostrando il vostro dialogo:

if (savedSsid != null) { 
    // Do whatever you need to do with the stored SSID. 
    // Return from onReceive to avoid displaying your dialog. 
    return; 
} 

l'ultima cosa che devi fare è quello di memorizzare selezionato WiFi SSID come parte del vostro onItemClick:

wifi_SSID = wifiList.get(position).SSID; 
// ... other code ... 
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); 
SharedPreferences.Editor editor = sharedPref.edit(); 
editor.putString("saved_wifi_ssid", wifi_SSID); 
editor.commit(); 

Vedere the Android Developer Guide per ulteriori informazioni su SharedPreferences.


UPDATE

Per il vostro caso d'uso specifico, vale a dire la BroadcastReceiver risiede come classe autonoma, è necessario accedere SharedPreferences attraverso la Context esempio si riceve come argomento in onReceive in questo modo:

SharedPreferences sharedPref = context.getSharedPreferences("name_for_your_shared_preferences_file", Context.MODE_PRIVATE); 

Questa riga deve sostituire entrambe le occorrenze della riga:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); 

Vedere documentation per getSharedPreferences (String, int).

+0

grazie per avermi chiesto .. la tua risposta è buona .. vedi sopra il mio codice. Non riuscivo a chiamare 'getActivity(). GetPreferences (Context.MODE_PRIVATE)' perché WifiReceiver è una classe separata con estensione 'BroadcastReceiver'. Provo a chiamare context invece di 'getActivity()' non funziona. – reegan29

+0

Il tuo dispositivo WifiReceiver è una classe annidata in un'attività o in una classe autonoma? –

+0

classe standalone .. Si prega di consultare il mio codice aggiornato .. – reegan29

Problemi correlati