2015-08-27 31 views
23

Desidero utilizzare il Gestore connettività che fornisce il metodo getAllNetworkInfo() per verificare la disponibilità della rete in Android. Questo metodo è stato deprecato nel livello API 23. E il doc Developer sta suggerendo di utilizzare invece getAllNetworks(). Ho provato ma non ho ottenuto le funzionalità esatte che stavo ottenendo dal mio vecchio codice. Per favore qualcuno potrebbe guidarmi come usare il metodo getAllNetworks(). Di seguito è riportato il codice che sto usando:Android getAllNetworkInfo() è obsoleto. Qual è l'alternativa?

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

Eventuali duplicati di [ConnectivityManager getNetworkInfo (int) deprecato] (http://stackoverflow.com/questions/32547006/connectivitymanager-getnetworkinfoint-deprecated) –

+0

risposta qui - http: // stackoverflow.com/questions/32547006/connectivitymanager-getnetworkinfoint-deprecated –

risposta

1

Prova seguente codice:

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

Grazie per la risposta. Ma qui setProcessDefaultNetwork() è deprecato –

+2

connectivityManager.getAllNetworks() e connectivityManager.getNetworkInfo (network) richiede l'API 21 –

27

quando aggiorno il mio codice deprecato e ancora voglia di sostenere Api all'indietro. Uso questo:

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

In questo modo ciascun dispositivo di utilizzare il codice appropriato per esso. Esempio: utils

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

È che tutti i tuoi dispositivi sono ** Male **? : O ;-) –

10

che ho fatto che possono aiutare a controllare:

  • Se è collegato in rete.
  • Se WiFi è collegato.
  • Se i dati mobili sono collegati.

utilizza vecchio o nuovo API seconda piattaforma di esecuzione:

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

Tieni presente che su alcuni dispositivi strani là fuori: 'connMgr.getNetworkInfo (mNetwork)' può lanciare un NullPointerExcecption. Mi è successo oggi, sembra che sia stato lanciato dal metodo nativo all'interno di ** IConnectivityManager **. La soluzione alternativa sarebbe provare/catturare questo all'interno del ciclo _for_ e decidere il fallback sul metodo deprecato per questa rete specifica. –

+0

@MariusC grazie per la risposta, per favore inviami la traccia dello stack di quel crash su yakiv.mospan su gmail.com. È una pessima pratica avvolgere Nullpointer nel try-catch. Abbiamo bisogno di evitare anche Nullpointer stesso.Forse qualcosa non va con 'mNetwork', forse quel dispositivo strano non supporta alcune delle reti che sono state restituite da' getAllNetwokrs'? –

+0

@MariusC btw, quale dispositivo era, funzionava su altri dispositivi, sei sicuro di avere l'autorizzazione 'ACCESS_NETWORK_STATE'? –

-1

provare questo .E 'il modo più semplice.

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

Per qualcuno ha bisogno versione Kotlin, (Di seguito è riportato stesso codice con Maor Hadad di)

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 
} 

Questo codice è un metodo di estensione per il contesto.

Annotare questo codice in qualsiasi file kotlin (.kt), quindi è possibile utilizzare questo metodo in qualsiasi classe che implementa il contesto (come Attività).

0

Prova questo

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; 
       } 
      } 
     } 
Problemi correlati