2010-02-19 12 views
38

Potrzebuję odbierać transmisje dla akcji sieciowych, takich jak sieć podłączona, odłączona itp. Używam odbiornika telewizyjnego do tego celu. Czy ktokolwiek może mi powiedzieć, które działania intencji muszę przechwycić dla zdarzeń sieciowych, teraz, jak na moje wyszukiwanie w Internecie Używam android.net.ConnectivityManager.CONNECTIVITY_ACTION.Działanie intencji dla zdarzeń sieciowych w systemie Android sdk

Oto moja klasa odbiornik transmisji:

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

public class NetworkStateReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 


    if (intent.getAction().equals(
      android.net.ConnectivityManager.CONNECTIVITY_ACTION)) { 

     // do something.. 
    } 
} 
} 

i Dodałem także uprawnienia dostępu stan sieci:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

Oto jak ja zadeklarowały tej klasy w pliku manifestu

<receiver class=".NetworkStateReceiver" android:name=".NetworkStateReceiver"> 
    <intent-filter> 
      <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> 
    </intent-filter> 
</receiver> 

Proszę zasugerować mi właściwe działanie, jeśli się mylę LUB jeśli jest jakakolwiek inna droga łapać zdarzenia sieciowe.

Odpowiedz

51

Oto przykład praca:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

<receiver android:name=".receiver.ConnectivityReceiver"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 

. Odpowiedź

public class ConnectivityReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(ConnectivityReceiver.class.getSimpleName(), "action: " 
       + intent.getAction()); 
    } 

} 
+0

Według mojego testu I nie trzeba żadnych uprawnień do odbiera transmisje, czy wlan jest teraz w górę/w dół, czy 3g jest teraz w górę/w dół. Jestem trochę zdezorientowany, co jest android.net.conn.CONNECTIVITY_CHANGE, a następnie dobre dla? –

+0

Jeśli spojrzysz jeszcze raz, zobaczysz, że CONNECTIVITY_CHANGE nie jest uprawnieniem, to rejestracja odbiornika intent (który możesz alternatywnie zrobić w kodzie). – Hamid

+0

Odpowiedź wygląda tak samo jak pytanie. Dlaczego więc NIE działa przed odpowiedzią? –

5

Yanchenko jest bardzo przydatna, ja tylko upraszczając nieco, aby uzyskać status połączenia, należy zmodyfikować onReceive jak poniżej:

public class ConnectivityReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(ConnectivityReceiver.class.getSimpleName(), "action: " 
       + intent.getAction()); 
     MyConstants.IS_NETWORK_AVAILABLE = haveNetworkConnection(context); 
     //IS_NETWORK_AVAILABLE this variable in your activities to check networkavailability. 

    } 


    private boolean haveNetworkConnection(Context context) { 
     boolean haveConnectedWifi = false; 
     boolean haveConnectedMobile = false; 

     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 
     for (NetworkInfo ni : netInfo) { 
      if (ni.getTypeName().equalsIgnoreCase("WIFI")) 
       if (ni.isConnected()) 
        haveConnectedWifi = true; 
      if (ni.getTypeName().equalsIgnoreCase("MOBILE")) 
       if (ni.isConnected()) 
        haveConnectedMobile = true; 
     } 
     return haveConnectedWifi || haveConnectedMobile;  
    } 
} 
+0

w Ravi K Sharma, czy wiesz o android.net.ConnectivityManager.EXTRA_NO_CONNECTIVITY? To dodatkowa wartość boolowska w dodatkach Intent od poziomu API 1, który mówi, czy istnieje łączność czy nie. –

+1

Odnośnie wczorajszego komentarza zauważyłem, że nie było to precyzyjne. Wygląda na to, że EXTRA_NO_CONNECTIVITY, przynajmniej w pewnych okolicznościach, dodaje się tylko do dodatków Intent, jeśli nie ma łączności. Uzyskanie dostępu do niego za pomocą getBooleanExtra (ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) powinno przynieść wartość logiczną, która jest prawdziwa, jeśli w ogóle nie ma łączności, i false, jeśli istnieje jakaś łączność. Poza tym kod w tej odpowiedzi to ** wzorzec anty **, ponieważ analiza jest ograniczona. Nie wykryje tetheringu przez Bluetooth, tetheringu przez USB ani łączności LAN. Nie rób tego. –

+2

Uznanie dla tego kodu, widząc jak Ravi zapomniałem: http://stackoverflow.com/a/4239410/182653 – paulw1128

Powiązane problemy