2015-08-27 24 views
23

Android'de ağın kullanılabilirliğini kontrol etmek için getAllNetworkInfo() yöntemini sağlayan Bağlantı yöneticisini kullanmak istiyorum. Bu yöntem, API 23 düzeyinde kullanımdan kaldırılmıştır. Geliştirici belgesi ise getAllNetworks() işlevini kullanmayı önerir. Denedim ama eski kodumdan çıkardığım işlevselliklere uymadım. Lütfen birisi getAllNetworks() yönteminin nasıl kullanılacağını bana yönlendirebilir. kod aşağıdakiAndroid getAllNetworkInfo() kullanımdan kaldırıldı. Alternatif nedir?

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

Olası yinelenen deneyin [ConnectivityManager getNetworkInfo kaldırılmış (int)] (http://stackoverflow.com/questions/32547006/connectivitymanager-getnetworkinfoint-deprecated) –

+0

Cevap burada - http: // stackoverflow.com/questions/32547006/connectivitymanager-getnetworkinfoint-deprecated –

cevap

1

Dene: Aşağıda kullanıyorum kodudur benim kaldırılmış kodunu güncellemek ve hala geriye Api desteklemek istiyoruz

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

Cevabınız için teşekkürler. Ancak, burada setProcessDefaultNetwork(), –

+2

bağlantısından ayrılmıştır. ConnectivityManager.getAllNetworks() ve connectivityManager.getNetworkInfo (ağ) API 21 gerektirir –

27

. Bunu kullanıyorum: Bu şekilde, her aygıt için uygun kodu kullanın. Örnek: Kontrol etmek yardımcı olabilir

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

Tüm cihazlarınız ** Erkek ** mi? : O ;-) –

10

yaptığım utils: Ağa bağlandı

  • edin.
  • WiFi bağlıysa.
  • Mobil veriler bağlıysa.

Çalışıyorsa platforma bağlı olarak eski veya yeni API kullanır:

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

Lütfen bazı tuhaf cihazlarda şunu unutmayın: 'connMgr.getNetworkInfo (mNetwork)' bir NullPointerExcecption atar. Bugün bana oldu, ** IConnectivityManager ** içinde yerli yöntem tarafından atılmış gibi görünüyor. Çözüm, bunu _for_ döngüsünüzde denemek/yakalamak ve bu özel Ağ için kullanımdan kaldırılan yöntemin geri alınmasına karar vermek olacaktır. –

+0

@MariusC Cevabınız için teşekkür ederiz, lütfen bu kilitlenmenin yığın izini gmail.com adresinden yakiv.mospan'a gönderin. Nullpointer'ı yakalamaya çalışmak çok kötü bir uygulamadır. Bunun yerine Nullpointer'ın kendisinden kaçınmamız gerekiyor.Belki de bir şey yanlış 'mNetwork' ile, belki bu garip aygıt' getAllNetwokrs' tarafından döndürülen bazı ağları desteklemiyor olabilir? –

+0

@MariusC btw, hangi cihazda çalışıyordu, diğer cihazlarda çalışıyordu, 'ACCESS_NETWORK_STATE' izniniz olduğundan emin misiniz? –

-1

bu bir .Bu basit yoldur deneyin. Birisi için

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

Bu kod Bağlamında için bir uzantısı yöntemidir

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 
} 

(Aşağıda Maor Hadad adlı aynı kodudur), Kotlin sürümü gerekiyor.

Bu kodu herhangi bir kotlin dosyasına (.kt) yazıp, bu yöntemi Bağlamı (Etkinlik gibi) uygulayan herhangi bir sınıfta kullanabilirsiniz.

0

bu

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; 
       } 
      } 
     } 
İlgili konular