2009-11-23 11 views
60

Chcę sprawdzić, kiedy wyłączy się sieć telefonu w Androidzie. Czy mogę uchwycić to wydarzenie?Detektor sieci Android

Nie otrzymuję odpowiedniego interfejsu API ani żadnego przykładu, który wyjaśniałby to samo. Jeśli ktoś zrobiłby lub jakiekolwiek przykładowe linki byłyby naprawdę pomocne.

Odpowiedz

144

Nowa klasa Java:

public class ConnectionChangeReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 
    NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_MOBILE); 
    if (activeNetInfo != null) 
    { 
     Toast.makeText(context, "Active Network Type : " + activeNetInfo.getTypeName(), Toast.LENGTH_SHORT).show(); 
    } 
    if(mobNetInfo != null) 
    { 
     Toast.makeText(context, "Mobile Network Type : " + mobNetInfo.getTypeName(), Toast.LENGTH_SHORT).show(); 
    } 
    } 
} 

New xml w swoim AndroidManifest.xml ramach "oczywistego" element:

<!-- Needed to check when the network connection changes --> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

New xml w AndroidManifest.xml pod "Aplikacja" elementu:

<receiver android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver" 
      android:label="NetworkConnection"> 
    <intent-filter> 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
    </intent-filter> 
</receiver> 
+0

hej Dzięki temu działało zgodnie z oczekiwaniami – Sam97305421562

+0

jak @noillusioin mówi, activeNetInfo może być null. Oznacza to, że połączenie sieciowe JUST DISCONNECTED zostało wyłączone, jeśli wiesz (zapisałeś stan), że byłeś wcześniej podłączony. – larham1

+0

Należy również sprawdzić NetworkInfo.isConnected – shuriquen

7

Powyższa odpowiedź działa tylko po włączeniu mobilnej transmisji danych. W przeciwnym razie obiekt ConnectivityManager będzie mieć wartość NULL i nie będzie można już pobrać informacji NetworkInfo. Zamiast tego należy użyć PhoneStateListener lub TelephonyManager.

16

Używam małej konfiguracji do sprawdzenia przepustowości w celu określenia sposobu skalowania elementów, takich jak obrazy.

ramach działania, w AndroidManifest:

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

W działalności, w których kontrole są wykonywane:

boolean network; 
int bandwidth; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    network = isDataConnected(); 
    bandwidth = isHighBandwidth(); 
    registerReceiver(new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      network = isDataConnected(); 
      bandwidth = isHighBandwidth(); 
     } 
    }, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); 
    ... 
} 
... 
private boolean isDataConnected() { 
    try { 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     return cm.getActiveNetworkInfo().isConnectedOrConnecting(); 
    } catch (Exception e) { 
     return false; 
    } 
} 

private int isHighBandwidth() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo info = cm.getActiveNetworkInfo(); 
    if (info.getType() == ConnectivityManager.TYPE_WIFI) { 
     WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
     return wm.getConnectionInfo().getLinkSpeed(); 
    } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) { 
     TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     return tm.getNetworkType(); 
    } 
    return 0; 
} 

Przykładem użycia może być następnie:

if (network) { 
    if (bandwidth > 16) { 
     // Code for large items 
    } else if (bandwidth <= 16 && bandwidth > 8) { 
     // Code for medium items 
    } else { 
     //Code for small items 
    } 
} else { 
    //Code for disconnected 
} 

To nie jest najładniejsza, ale pozwala na wystarczającą elastyczność, że mogę zmienić ograniczenie przepustowości dla pozycji de w oczekiwaniu na to, czym są i moje wymagania wobec nich.

+0

Znalazłem to bardzo przydatne, dzięki :) – Skynet

9

przypadku korzystania Android Annotations jest opcją dla spróbować tego w swoich działaniach - to wszystko, reszta jest generowana:

@Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION, 
     registerAt = Receiver.RegisterAt.OnResumeOnPause) 
void onConnectivityChange() { 
    //react 
} 

Użyj tego tylko jeśli już używać AndroidAnnotations - Umieszczenie tej zależności wewnątrz projektu tylko dla ten kawałek kodu byłby przesadą.

+0

Czy możesz podać więcej wyjaśnień na temat tej odpowiedzi. Próbowałem coś znaleźć, ale nie mogłem. W bibliotece adnotacji google nie ma adnotacji @Receiver. Dzięki! – Sniper

+0

Hej, odsyłam do biblioteki AndroidAnnotations innej firmy. Aktualizuję swoją odpowiedź. –

+0

Tak, prawda, z tą biblioteką jest to możliwe, a także znalazłem to https://github.com/jd-alexander/flender sprawdzić, czy nie jest źle, ale można go używać tylko z gradle kompilacji 1.3, z nową wtyczką gradown build nie działa – Sniper

Powiązane problemy