2013-05-06 11 views
7

Widzę wyjątek wyjątku wskaźnika pustego w menedżerze połączeń. Z usługi intent sprawdzam stan sieci przez isOnWIFI (this). Wyjątek występuje w linii cm.getActiveNetworkInfo(). To dziwne, ponieważ sprawdzam wartość zerową, zanim to zadzwonię. Uwaga: uprawnienia zostały ustawione.ConnectivityManager getActiveNetworkInfo wyjątek wskaźnika null

public static boolean isOnWIFI(Context context) { 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

     return cm != null 
       //here occurs NullPointerException 
       && cm.getActiveNetworkInfo() != null 
       && ((cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null && cm.getNetworkInfo(
         ConnectivityManager.TYPE_WIFI).isConnected())); 

} 

Wszelkie przemyślenia, dlaczego tak się dzieje? Nie mogę tego debugować, ponieważ jest to tylko sporadyczne z raportów o błędach. Jedynym rozwiązaniem, które widzę, jest umieszczenie go w try catch block. Dzięki.

+0

jakie uprawnienia są ustawione? –

+0

vandzi

+0

Nie jestem pewien, ale możesz sprawdzić, dodając jeszcze jedno zezwolenie android.permission.ACCESS_WIFI_STATE –

Odpowiedz

2
Try this. Read more here 

http://developer.android.com/training/basics/network-ops/managing.html

public static boolean isOnWIFI(Context context) { 

ConnectivityManager cm = (ConnectivityManager) this.getSystemService(context.CONNECTIVITY_SERVICE); 

if(cm != null){ 

    NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 

    boolean isWiFi = networkInfo.getType() == ConnectivityManager.TYPE_WIFI; 

    // if user is connected to network 
    if (isWifi) { 
     return true; 

    }else { 
    return false; 

    } 

} 
else{ 
    //cm is null 
    return false 

} 
} 
+0

Nie widzę różnicy. Sprawdzam również cm! = Null, a następnie otrzymuję wyjątek wskaźnika null cm.getActiveNetworkInfo. Jak już powiedziałem, to tylko sporadycznie – vandzi

+0

@vandzi: czy debugujesz kod? Skąd w swojej działalności wywołujesz tę metodę? Twój kontekst jest zerowy, o ile się domyślałem, ponieważ nie ma problemu z kodem. –

+0

@haris Czy ConnectivityManager może mieć wartość zerową? Czy naprawdę potrzebujemy czeku na cm! = Null? Jakie przypadki mogą być zerowe? –

-1

Zrobiłem jeden szablon z tego rodzaju problemu, teraz działa dobrze. Możesz spróbować tego kodu, wypróbowałem go na wielu urządzeniach i nie ma problemu. getActiveNetworkInfo() problem. Zanim spróbowałem getAllNetworkInfo() i nie rozumiem, co jest nie tak, ale getAllNetworkInfo() działa głupie na niektórych urządzeniach.

+0

Opublikuj odpowiedni kod. –

+0

ConnectivityManager cm = (ConnectivityManager) c.getSystemService (Context.CONNECTIVITY_SERVICE); NetworkInfo [] netInfo = cm.getAllNetworkInfo(); dla (NetworkInfo nix: NETinfo) { \t \t \t if (nix.getType() == ConnectivityManager.TYPE_MOBILE) \t \t \t \t if (nix.isConnected()) { \t \t \t \t \t isAnyNetworkAvailableType = "ruchome" ; –

+0

To jest szalone, kiedy uruchamiam urządzenie, a internet nie działa poprawnie. Kiedy włączam aplikację internetową jest nadal dobra, wykrywa ona zmiany, ale jeśli włączę Internet aplikacji, nie rozpoznaję zmian. Również aplikacja wykrywa zmianę po włączeniu, ale nie wyłączeniu. –

0

Kiedy pracowałem z usług, to rozwiązać mój problem .. Przed i po prostu przy użyciu! Info.isConnected(), ale to nie wystarczyło

ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
     NetworkInfo info = cm.getActiveNetworkInfo(); 

     if(info==null || !info.isConnected()) { 
      stopSelf(); 
      return; 

     } 
5

android_dev ma rację. Problem w kodzie pochodzi z cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()));

Tak! wcześniej sprawdzasz, cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null, ale po raz drugi wywołując numer getNetworkInfo(), android po raz drugi pobierze i pobierze informacje o sieci, tyle że tym razem nie natrafi na aktywną sieć, która ponownie zwraca wartość zerową. Chodzi o to, nie dlatego, że nazywa getNetworkInfo() milisekundy przed i didn't uzyskać null, oznacza, że ​​nie zamierzamy dostać to milisekundy po

0

getActiveNetworkInfo zwraca NULL jeśli nie nie ma domyślne połączenie dostępne za docs >>getActiveNetworkInfo .Tak co radzę ci zrobić, to sprawdzić dla sieci, każdy indywidualnie, jak poniżej

NetworkInfo WiFiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
NetworkInfo mobileInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

następnie sprawdzić, czy są one dostępne

if(mobileInfo != null & mobileInfo.isConnectedOrConnecting() || WiFiInfo != null & WiFiInfo.isConnectedOrConnecting()) 
    { 
     //do your task here 
    } 
else { 
    //show an alert dialog or something  
} 
Powiązane problemy