2014-01-30 9 views
5

Ich muss die Netzwerkänderung im Android-System beachten und bestimmte Aktivitäten entsprechend ausführen.WiFi oder mobiles Netzwerk erkennen

1) Wenn WiFi aktiviert ist, die Funktion A. 2) durchführen, wenn Mobilfunknetz aktiviert ist, die Funktion B. 3) durchführen, wenn WiFi deaktiviert und Mobilfunknetz ist, ermöglicht es, die Funktion A stoppen und starten Funktion B. 4) Wenn das Mobilfunknetz deaktiviert ist und WiFi aktiviert ist, stoppen Sie die Funktion B und starten Sie die Funktion A. 5) Wenn kein Netzwerk verfügbar ist, wird keine Funktion ausgeführt.

Ich versuchte mit CONNECTIVITY_CHANGE. Damit bekomme ich die Absicht viele Male, ich kenne auch ihren Grund. Es gibt auch ein anderes Problem. Berücksichtigen Sie, dass das Mobilfunknetz aktiviert ist. Jetzt, wenn ich WLAN aktiviere, bekomme ich WiFi 2 bis 3 Mal aktiviert, auch Mobile Network deaktiviert wird nicht bestätigt.

Ich habe auch versucht, Registrierung mit PhoneStateListener.LISTEN_DATA_CONNECTION_STATE. Es hat fast funktioniert, aber wenn sowohl WiFi als auch Mobile Network eingeschaltet sind, weiß ich, dass WiFi aktiv ist, und wenn ich WiFi ausschalte, bekomme ich manchmal die Mobile Network-fähige Nachricht und manchmal werde ich nicht.

Ich muss dieses Problem lösen. Bitte hilf mir mit deiner Anleitung.

Antwort

0

Also eigentlich haben Sie vier Zustände als (+ fünfte wenn Internet ist oder nicht)

, wenn das Netzwerk verfügbar ist, müssen Sie für den Internet-Provider überprüfen, indem die Zustände von Wifi und Mobilfunknetz überwacht, Ihre vier Staaten sind

Wifi Änderungszustände und

1. Mobilfunknetz
2. Mobilfunknetz aktiviert ist deaktiviert

Mobilfunknetz Änderungszustände und

1. Wifi ist
aktiviert 2.Wifi ist deaktiviert

zunächst müssen Sie überwachen, ob das Internet verfügbar ist oder nicht, danach müssen Sie ähnliche zwei Hörer hinzufügen (Broadcast Recievers) für Wifi Zustand ändern und Mobile State ändern und für die erforderliche Prüfung Zustand, ich habe

Reciever Implementierung

in einem Empfänger für Änderungen prüfen und dann unten, Zustand Prüfmethode hinzugefügt Überprüfung Zustand

public class Internet_State extends BroadcastReceiver { 
//checked with new state changed when event occurs 
public boolean oldInternetState; 

@Override 
public void onReceive(Context context, Intent intent) { 
    ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    Bundle b = intent.getExtras(); 
    // if Internet available 
    boolean isConnected = !b 
      .getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY); 
      // ignore if no state change 
    if (oldInternetState == isConnected) 
     return; 
    // set new oldInternetState 
    oldInternetState = isConnected; 
    boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE; 
    boolean isWifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) 
      .isAvailable(); 
//you can save these states to be monitored in wifi and mobile change change listners 

    //No internet is 0 state 
    int state = isConnected?1:0; 
      if(state) 
      state = checkState(context) 
    intent.putExtra("state", state); 
      // and then send this intent to your required method which will 
      // check the state and perform function 
} 

@Override 
public void initialize(Context context) { 
    ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
      //save the current internet state at start of the receiver registration 
    oldInternetState = false; 
    if (activeNetwork != null) 
     oldInternetState = activeNetwork.isConnectedOrConnecting(); 
} 

} 

Implementieren zwei, mobile und WiFi-Zustandswechsel Sendung recievers und besser einen Zustand Prüfmethode wie diese

Prüfzustand

Überwachung des Zustands von vier Staaten

hinzufügen
public int checkState(Context context){ 
      ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
     boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE; 
    boolean isWifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) 
      .isAvailable(); 
    //No internet is 0 state 
    int state = isConnected?1:0; 
    if(isWifi && isMobile) 
     state = 1; 
    else if(isWifi && !isMobile) 
     state = 2; 
    if(isMobile && isWifi) 
     state = 3; 
    else if(isMobile && !isWifi) 
     state = 4; 
     return state; 
} 

und rufen Sie diese Methode von 3 Wifi, Internet und Mobile Datenänderungsempfänger, vergessen Sie nicht, nach oldState zu suchen und diesen mit dem geänderten Status abzugleichen.

Mobile alter Zustand von

NetworkInfo allNetInfo = cm 
      .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
    oldDataState = allNetInfo.getState(); 

für Wifi Zustand

int state = intent.getExtras().getInt(WifiManager.EXTRA_WIFI_STATE); 
    if (state == WifiManager.WIFI_STATE_ENABLED) 
     state = 1; 
    else if (state == WifiManager.WIFI_STATE_DISABLED) 
     state = 0; 
    else 
     return; 
    if (state == oldWifiState) 
     return; 
    oldWifiState = state; 

Problem ich WiFi-fähigen 2 bis 3 mal

Mehr als ein Anruf auf Wifi Änderung tritt auf, weil Wifi Zustände ändert, wie TurningOn und TurningOf ausgelöst durch OS, müssen Sie sie auszulöschen, wie ich oben tat wie

if (state == WifiManager.WIFI_STATE_ENABLED) 
     state = 1; 
    else if (state == WifiManager.WIFI_STATE_DISABLED) 
     state = 0; 
    else 
     return; 

nur aktiviert und deaktiviert werden jetzt überwacht.

0

Sie können versuchen, einen Broadcast Receiver zu registrieren, um eine Netzwerkänderung zu bemerken. Siehe: http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html.

Seien Sie vorsichtig, der Status kann sich zu oft ändern und jedes Mal, wenn Ihre Übertragung ausgelöst wird.

+0

Das ist, was meine Frage ist. Wie erkenne ich die Änderungen mit nur einem Auslöser? Diese Technik ermöglicht auch die Aktivierung von Mobile Network und WiFi, wenn beide aktiviert sind. Tatsächlich wird WiFi aktiv sein. Wir müssen dynamisch entscheiden, dass das Mobilfunknetz ausgeschaltet ist, wenn WiFi eingeschaltet ist. – madhu

1
Please find the below code. I suppose it is what you want. In case I misunderstood you, then please let me know: 


    public void checkWifiMobileNetwork(Context context){ 

      ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo(); 

      if (activeNetwork != null && activeNetwork.isConnected()) { 
       android.net.NetworkInfo connWifiType = conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
       android.net.NetworkInfo connMobileType = conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

       if(connWifiType.isConnectedOrConnecting()){ 
        Log.d("NETWORK_STATUS","WIFI_IS_THERE"); 
       }else{ 
        Log.d("NETWORK_STATUS","WIFI_IS_NOT_THERE"); 
       } 

       if(connMobileType.isConnectedOrConnecting()){ 
        Log.d("NETWORK_STATUS","MOBILE_NETWORK_IS_THERE"); 
       }else{ 
        Log.d("NETWORK_STATUS","MOBILE_NETWORK_IS_NOT_THERE"); 
       } 

      }else { 
       //notify user you are not online 
       Log.d("NETWORK_STATUS","WIFI_MOBILE_IS_NOT_THERE"); 

      } 
     } 

Set permission at Manifest: 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
0

Versuchen Sie diesen Code in Ihrer ersten Aktivität in Anwendung.

public class YourActivity extends Activity { 

    Context mContext; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mContext = this; 
     this.registerReceiver(this.mNetworkConReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); // Here you register your receiver 
    } 

    private BroadcastReceiver mNetworkConReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      ConnectivityManager conMngr = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo wifi = conMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
      NetworkInfo mobile = conMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

      if(wifi.isConnected()){ 
       // Wifi is connected 
      }else if(mobile.isConnected() && wifi.isConnected()){ 
       // Mobile Network and Wifi is connected 
      }// Others conditions here... 

     } 
    }; 

} 

Denken Sie daran: Ihr Broadcast-Empfänger wird von Android jedes Mal ausgelöst, wenn sich der Netzwerkstatus ändert.

Verwandte Themen