2015-08-13 15 views
5

W moim Projekcie mam Map.First Idę do pozycji routera Wifi, skanuję listę wifi i wybieram Operator2 i Mark it.Następnie idę do innej pozycji zbierać Same Poprzednie Operator2 szczegóły (nie), a następnie Idę inną pozycją, powtórz to jeszcze raz.Jak uzyskać zaznaczenie tego samego operatora wifi z listy Wi-Fi ponownie w systemie Android?

Potrafię pierwszy raz wybrać Operatora Wi-Fi. Czas wtórny Nie wiem Jak zablokować Określone poprzednio wybrane szczegóły Operatora i uzyskać szczegóły operatora ponownie. Tak Proszę, pomóż mi rozwiązać ten problem.

enter image description here

mój kod:

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

AKTUALIZACJA ODPOWIEDŹ:

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

Zapisywanie danych do SharedPreferences:

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

Uzyskaj dane z 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

Czy moja odpowiedź Ci pomogła? Jeśli nie, wyjaśnij dlaczego, pozostawiając komentarz do odpowiedzi. –

+0

Zaktualizowano odpowiedź, aby pomóc w utrzymaniu SharedPreferences poza działaniem. Mam nadzieję, że to pomoże. –

Odpowiedz

2

Jeśli rozumiem zostanie poprawnie, czego potrzebujesz to mechanizm utrzymujący się co sieci WiFi użytkownik uprzednio wybrany (jeśli występują).

Możesz to osiągnąć, używając SharedPreferences.

Na początku swojej metodzie onReceive, kwerendy współdzielonych preferencji w aplikacji dla każdego zapisanego SSID WiFi:

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

Jeśli savedSsid jest niezerowe, użytkownik uprzednio wybrany WiFi, i można pominąć pokazując swój dialog:

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

Ostatnią rzeczą, którą musisz zrobić, to zapisać wybrany WiFi SSID jako część 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(); 

Aby uzyskać więcej informacji na temat SharedPreferences, zobacz artykuł the Android Developer Guide.


UPDATE

dla konkretnego usecase, czyli BroadcastReceiver rezyduje jako samodzielny klasy, trzeba uzyskać dostęp SharedPreferences przez instancji Context odebraną jako argument w onReceive tak:

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

Ta linia powinna zastąpić oba wystąpienia linii:

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

Zobacz documentation dla getSharedPreferences (String, int).

+0

dziękuję za pytanie .. odpowiedź jest dobra. Widzisz powyższy kod. Nie mogłem wywołać 'getActivity(). GetPreferences (Context.MODE_PRIVATE)' ponieważ WifiReceiver jest osobną klasą z rozszerzeniem 'BroadcastReceiver'. Próbuję wywoływać kontekst zamiast 'getActivity()' jego nie działa. – reegan29

+0

Czy Twój WifiReceiver jest klasą zagnieżdżoną w klasie Aktywności lub samodzielnej? –

+0

standalone klasa .. Proszę zobaczyć mój zaktualizowany kod. – reegan29