2015-08-27 8 views
23

Ich möchte den Connectivity Manager verwenden, der die Methode getAllNetworkInfo() zur Überprüfung der Verfügbarkeit von Netzwerk in Android bereitstellt. Diese Methode wurde in API-Ebene 23 nicht weiter unterstützt. Das Developer-Dokument schlägt stattdessen die Verwendung von getAllNetworks() vor. Ich habe versucht, aber nicht die genauen Funktionen zu bekommen, die ich aus meinem alten Code herausgeholt habe. Bitte, jemand könnte mir helfen, die Methode getAllNetworks() zu benutzen. Unten ist der Code, die ich verwende:Android getAllNetworkInfo() ist veraltet. Was ist die Alternative?

public boolean isConnectingToInternet(){ 
    ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (connectivity != null) 
     { 
      @SuppressWarnings("deprecation") 
     NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
      //use getAllNetworks() instead 
      if (info != null) 
       for (int i = 0; i < info.length; i++) 
        if (info[i].getState() == NetworkInfo.State.CONNECTED) 
        { 
         return true; 
        } 
     } 
     return false; 
} 
+0

Mögliche Duplikat [ConnectivityManager GetNetworkInfo (int) veraltet] (http://stackoverflow.com/questions/32547006/connectivitymanager-getnetworkinfoint-deprecated) –

+0

Antwort hier - http: // stackoverflow.com/questions/32547006/connectivitymanager-getnetworkinfoint-deprezed –

Antwort

1

Versuchen folgenden Code:

ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);  
    Network[] networks = connectivityManager.getAllNetworks(); 
    NetworkInfo networkInfo; 
    Network network; 
     for (int i = 0; i < networks.length; i++){    
      network = networks[i]; 
      networkInfo = connectivityManager.getNetworkInfo(network); 
      if ((networkInfo.getType() ==  ConnectivityManager.TYPE_WIFI) && (networkInfo.getState().equals(NetworkInfo.State.CONNECTED))) { 
       ConnectivityManager.setProcessDefaultNetwork(network); 
       break; 
      } 
     } 
+2

Danke für die Antwort. Aber hier setProcessDefaultNetwork() ist veraltet –

+2

connectivityManager.getAllNetworks() und connectivityManager.getNetworkInfo (Netzwerk) erfordert API 21 –

27

Wenn ich meinen veralteten Code aktualisieren und will immer noch nach hinten Api unterstützen. Ich benutze dies:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.WANTED API VERSION){ 
//code 
}else{ 
//code 
} 

Auf diese Weise verwenden jedes Gerät den entsprechenden Code dafür. Beispiel:

public class ConnectionDetector { 

    private Context mContext; 

    public ConnectionDetector(Context context) { 
     this.mContext = context; 
    } 
    /** 
    * Checking for all possible internet providers 
    * **/ 
    public boolean isConnectingToInternet() { 
     ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      Network[] networks = connectivityManager.getAllNetworks(); 
      NetworkInfo networkInfo; 
      for (Network mNetwork : networks) { 
       networkInfo = connectivityManager.getNetworkInfo(mNetwork); 
       if (networkInfo.getState().equals(NetworkInfo.State.CONNECTED)) { 
        return true; 
       } 
      } 
     }else { 
      if (connectivityManager != null) { 
       //noinspection deprecation 
       NetworkInfo[] info = connectivityManager.getAllNetworkInfo(); 
       if (info != null) { 
        for (NetworkInfo anInfo : info) { 
         if (anInfo.getState() == NetworkInfo.State.CONNECTED) { 
          LogUtils.d("Network", 
            "NETWORKNAME: " + anInfo.getTypeName()); 
          return true; 
         } 
        } 
       } 
      } 
     } 
     Toast.makeText(mContext,mContext.getString(R.string.please_connect_to_internet),Toast.LENGTH_SHORT).show(); 
     return false; 
    } 
} 
+1

Ist das alle Ihre Geräte ** männlich **? : O ;-) –

10

Ich habe gemacht utils, die Sie überprüfen können helfen:

  • Wenn Netzwerk verbunden ist.
  • Wenn WLAN verbunden ist.
  • Wenn mobile Daten verbunden sind.

nutzt alte oder neue API auf Lauf Plattform abhängig:

import android.annotation.TargetApi; 
import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.Network; 
import android.net.NetworkInfo; 
import android.os.Build; 
import android.support.annotation.NonNull; 

public class NetworkUtils { 

public static boolean isConnected(@NonNull Context context) { 
    ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 
    return (networkInfo != null && networkInfo.isConnected()); 
} 

public static boolean isWifiConnected(@NonNull Context context) { 
    return isConnected(context, ConnectivityManager.TYPE_WIFI); 
} 

public static boolean isMobileConnected(@NonNull Context context) { 
    return isConnected(context, ConnectivityManager.TYPE_MOBILE); 
} 

private static boolean isConnected(@NonNull Context context, int type) { 
    ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { 
     NetworkInfo networkInfo = connMgr.getNetworkInfo(type); 
     return networkInfo != null && networkInfo.isConnected(); 
    } else { 
     return isConnected(connMgr, type); 
    } 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
private static boolean isConnected(@NonNull ConnectivityManager connMgr, int type) { 
    Network[] networks = connMgr.getAllNetworks(); 
    NetworkInfo networkInfo; 
    for (Network mNetwork : networks) { 
     networkInfo = connMgr.getNetworkInfo(mNetwork); 
     if (networkInfo != null && networkInfo.getType() == type && networkInfo.isConnected()) { 
      return true; 
     } 
    } 
    return false; 
} 
} 
+0

Bitte beachten Sie, dass auf einigen seltsamen Geräten das 'connMgr.getNetworkInfo (mNetwork)' einen NullPointerExcection auslösen kann. Es ist mir heute passiert, scheint das von der nativen Methode innerhalb des ** IConnectivityManager ** geworfen zu werden. Die Problemumgehung besteht darin, dies innerhalb Ihrer _for_-Schleife zu versuchen und zu entscheiden, ob Sie auf die veraltete Methode für dieses bestimmte Netzwerk zurückgreifen möchten. –

+0

@MariusC danke für die Antwort, bitte senden Sie mir Stapel von diesem Absturz zu yakiv.mospan at gmail.com. Es ist eine sehr schlechte Übung, den Nullpointer in Try-Catch zu wickeln. Wir müssen stattdessen Nullpointer selbst vermeiden.Vielleicht stimmt etwas nicht mit 'mNetwork', vielleicht unterstützt dieses seltsame Gerät nicht einige der Netzwerke, die von' getAllNetwokrs' zurückgegeben wurden? –

+0

@MariusC btw, welches Gerät war es, funktionierte es auf anderen Geräten, bist du sicher, dass du die Berechtigung 'ACCESS_NETWORK_STATE' hast? –

-1

Versuchen Sie dieses .Es ist der einfachste Weg ist.

public static boolean isNetworkAvailable(Activity activity) { 
     ConnectivityManager connectivity = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (connectivity == null) { 
      return false; 
     } else { 
      NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
      if (info != null) { 
       for (int i = 0; i < info.length; i++) { 
        if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
         return true; 
        } 
       } 
      } 
     } 
     return false; 
    } 
} 
3

Für jemanden braucht Kotlin Version (unter gleichen Code mit Maor Hadads ist)

fun Context.isNetworkConnected(): Boolean { 
    val manager = getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    val allNetworks = manager?.allNetworks?.let { it } ?: return false 
    allNetworks.forEach { network -> 
     val info = manager.getNetworkInfo(network) 
     if (info.state == NetworkInfo.State.CONNECTED) return true 
    } 
    } else { 
    val allNetworkInfo = manager?.allNetworkInfo?.let { it } ?: return false 
    allNetworkInfo.forEach { info -> 
     if (info.state == NetworkInfo.State.CONNECTED) return true 
    } 
    } 
    return false 
} 

Dieser Code eine Erweiterungsmethode für Context ist.

Notieren Sie sich diesen Code in jeder Kotlin-Datei (.kt), dann können Sie diese Methode in jeder Klasse verwenden, die den Kontext implementiert (z. B. Aktivität).

0

Versuchen Sie, diese

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     Network[] networks=cm.getAllNetworks(); 
     if (cm != null) { 
     for (Network netinfo : networks) { 
      NetworkInfo ni = cm.getNetworkInfo(netinfo); 
      if (ni.isConnected() && ni.isAvailable()) { 
        connected = true; 
       } 
      } 
     } 
Verwandte Themen