2015-06-03 3 views
11

Ich bin da eine Möglichkeit zu Flag, wenn eine WIFI-Verbindung getrennt/abgesetzt wurde ODER wenn der Benutzer tatsächlich das WIFI-Netzwerk geändert hat?Android Check WIFI-Status (getrennt oder Benutzer geändert WIFI) Wie man es FLAG?

Ich brauche meine App zu tun: Verbinden mit einem WIFI XYZ, wenn XYZ Verbindung trennen (FLAG 1) oder abgesetzt Dann wieder mit XYZ verbinden. Aber ist der Benutzer zu einem anderen Wifi BTOpen (FLAG 2) ändern dann erlauben Sie die Verbindung und stoppe meinen Dienst. Wenn sich der Benutzer erneut mit XYZ verbindet, wird die Schleife erneut gestartet.

Was ich so weit ist:

<!-- WIFI Receiver --> 
    <receiver android:name=".ReceiverWifi" > 
     <intent-filter> 
      <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
     </intent-filter> 
    </receiver> 
    <service android:name=".ServiceWifiMonitor" /> 
    <receiver android:name=".ServiceController" > 
     <intent-filter > 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <category android:name="android.intent.action.QUICKBOOT_POWERON" /> 
     </intent-filter> 
    </receiver> 

BroadcastReceiver:

myApplication = (MyApplication) context.getApplicationContext(); 
    conManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    networkInfo = conManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 


    boolean isConnected = networkInfo != null && networkInfo.isConnected(); 
    int reconnectedCount = myApplication.getReconnectedCount(); 


    if (wifiManager.isWifiEnabled()) { 


     if("android.net.conn.CONNECTIVITY_CHANGE".equals(intent.getAction())) { 


      //Start and Stop Service 
      if(myApplication.isReconnect()) startServiceWifiMonitor(); else stopServiceWifiMonitor(); 



      if (isConnected) { 
       //There is a WIFI Connection 
       myApplication.setConnectedWifi(NetworkUtil.getCurrentSSID(context)); 
       myApplication.setWifiStatus("connected"); 




       if (NetworkUtil.isConnectedToXYZ(context)) { 
        startServiceWifiMonitor(); 

        if(pref.getisFirstTime()) 
        { 
         myApplication.setWifiByChoise("XYZ"); 
         pref.setisFirstTime(false); 
        } 
        else { myApplication.setisReconnect(true); } 
       } 
       else { 
        //Connected to different NetWork 
        if(myApplication.isReconnect() && NetworkUtil.isXYZAvailable(context)) 
        { 
         //ReConnect to XYZ 
         NetworkUtil.connectToXYZ(context); 
         myApplication.setReconnectedCount(reconnectedCount++); 
        } 
        else { resetValues("AAAA"); } 
       } 


      }//end if 
      else 
      { 
       if(NetworkUtil.isXYZAvailable(context) && myApplication.getWifiByChoise().equals("XYZ")) 
       { 
        NetworkUtil.connectToXYZ(context); 
        myApplication.setReconnectedCount(reconnectedCount++); 
       } 
       else { resetValues(""); } 
      } 
     }//end CONNECTIVITY_CHANGE 

Service Monitor:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.i(TAG, "onStartCommand > Received start id " + startId + ": " + intent); 

     objHandler.postDelayed(mTasks, 1000); 

    return START_STICKY; 
}//end onStartCommand 



private Runnable mTasks = new Runnable() { 
    public void run() { 

     if(myApplication.getWifiByChoise().equals("XYZ") && NetworkUtil.isXYZAvailable(context)) {    
      try 
      { 
       //Get the numbers of Reconnection 
       int count = myApplication.getReconnectedCount(); 

       if(!NetworkUtil.isWifiConnected(context)) 
       { 

        NetworkUtil.connectToXYZ(context); 
        myApplication.setisReconnect(true); 
        myApplication.setReconnectedCount(count++); 
       } 

       if(!NetworkUtil.isConnectedToXYZ(context)) 
       { 

        NetworkUtil.connectToXYZ(context); 
        myApplication.setisReconnect(true); 
        myApplication.setReconnectedCount(count++); 
       } 
      } catch (Exception e) {e.printStackTrace();} 
     } 
     else { stopSelf(); } 
     int ms_interval = 3000; 
     objHandler.postDelayed(mTasks, ms_interval); 
    } 
};//end Runnable mTasks 

Das Problem mit meiner app ist, dass: Es abgestürzt das Gerät Es scheint, als ob es den ganzen Speicher rammt. manchmal mit dem Wifi XYZ bekommen trennen es wird nicht wieder verbinden und wenn Benutzer zu einem anderen wifi ändern, wird es die Verbindung nicht zulassen.

Ich schätze Ihre Hilfe sehr. Vielen Dank.

Antwort

6

das Netzwerk angeschlossen Name Anreise von

public String getWifiName(Context context) { 
    WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    if (manager.isWifiEnabled()) { 
     WifiInfo wifiInfo = manager.getConnectionInfo(); 
     if (wifiInfo != null) { 
      DetailedState state = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState()); 
      if (state == DetailedState.CONNECTED || state == DetailedState.OBTAINING_IPADDR) { 
       return wifiInfo.getSSID(); 
      } 
     } 
    } 
    return null; 
} 

zu verwenden, wenn dieser Name Ihre networkSSID übereinstimmt, dh XYZ, als den Dienst wieder aufnehmen, sonst, wenn es nicht passt, als den Dienst beenden

if getWifiName(this).compareTo("XYZ") == 0 { //XYZ is your network name on which you want to resume the service 
    //code to resume 
} else { 
    //code to stop the service 
} 
3

Dies ist, wie ich es in meiner app handhaben:

public class WifiStateWatcher extends BroadcastReceiver { 

    private MainActivity activity; 

    public WifiStateWatcher(MainActivity activity) { 
     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 
    } 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     SupplicantState supState; 
     WifiManager wifiManager = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE); 
     WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
     supState = wifiInfo.getSupplicantState(); 

     if (supState.equals(SupplicantState.COMPLETED)) { 
      //we are connected to Wi-Fi network 
     } else { 
      //we lost Wi-Fi connectivity 
     } 
    } 
} 

Sie android.permission.ACCESS_WIFI_STATE zul benötigen ission

0

Was Sie getan haben, ist fast richtig. Sie müssen den Netzwerk-SSD-Namen mit dem Benutzer verbunden wifi Name überprüfen. Wenn es abgestimmt dann tun Sie Ihren Teil.

WifiManager wifiManager= (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
if (wifiManager.isWifiEnabled()) { 
    WifiInfo networkInfo = wifiManager.getConnectionInfo(); 
    if (networkInfo != null) { 
     DetailedState state = WifiInfo.getDetailedStateOf(networkInfo .getSupplicantState()); 
     if (state == DetailedState.CONNECTED) { 
      return networkInfo.getSSID(); 
     } 
    } 
} 
return null; 

Jetzt haben Sie die Netzwerk-SSID so versuchen, mit dem Sie Ihre WLAN-Name und SSID zu überprüfen, dann werden Sie den Verbindungsstatus kennen ..... Glücklich Programmierung

0

Auch habe gerade überprüft diese und , dass der Hauptunterschied ist herausgefunden:

/** IP traffic should be available. */ 
DetailedState.CONNECTED 

und:

/** 
* … 
* This state indicates that the supplicant has completed its 
* processing for the association phase and that data connection is 
* fully configured. Note, however, that there may not be any IP 
* address associated with the connection yet. Typically, a DHCP 
* request needs to be sent at this point to obtain an address. 
*/ 
SupplicantState.COMPLETED 

Damit WiFi vertrauen vollständig oben ist, fügte ich jetzt die Kontrollen, dass:

boolean isConnected = activeNetworkInfo.isConnected(); 

und DetailedState.CONNECTED :)

glücklich Codierung

Verwandte Themen