Ağ durumunu oku

Android, uygulamaların bağlantıdaki dinamik değişiklikleri öğrenmesini sağlar. Bağlantı değişikliklerini izlemek ve bunlara yanıt vermek için aşağıdaki sınıfları kullanın:

  • ConnectivityManager, uygulamanıza sistemdeki bağlantı durumunu bildirir.
  • Network sınıfı, cihazın bağlı olduğu ağlardan birini temsil eder. ConnectivityManager ile ağ hakkında bilgi toplamak veya ağdaki yuvaları bağlamak için Network nesnesini anahtar olarak kullanabilirsiniz. Ağ bağlantısı kesildiğinde Network nesnesi kullanılamaz. Cihaz daha sonra aynı cihaza yeniden bağlansa bile yeni bir Network nesnesi yeni ağı temsil eder.
  • LinkProperties nesnesi, bir ağın bağlantısı hakkında bilgiler (ör. DNS sunucularının listesi, yerel IP adresleri ve ağ için yüklü ağ rotaları) içerir.
  • NetworkCapabilities nesnesi, ağın özellikleri (kablosuz, mobil, Bluetooth) ve ağın yapabilecekleri gibi bilgiler içerir. Örneğin, ağın MMS gönderip gönderemediğini, doğrulama amacıyla yönlendirme yapan bir portalın arkasında olup olmadığını veya ölçülü olup olmadığını belirlemek için nesneyi sorgulayabilirsiniz.

Herhangi bir zamanda bağlantının anlık durumuyla ilgilenen uygulamalar, kullanılabilir ağın türünü öğrenmek için ConnectivityManager yöntemlerini çağırabilir. Bu yöntemler, hata ayıklama konusunda ve zaman zaman herhangi bir zamanda mevcut olan bağlantının anlık görüntüsünü incelemek için faydalıdır.

Ancak eşzamanlı ConnectivityManager yöntemleri, bir görüşmeden sonra olan hiçbir şey hakkında uygulamanıza bilgi vermediğinden kullanıcı arayüzünü güncellemenize izin vermez. Ayrıca, uygulama davranışını ağ bağlantısının kesilmesine veya ağ özelliklerinin değişmesine göre ayarlayamazlar.

Bağlantı herhangi bir zamanda değişebilir ve çoğu uygulamanın cihazdaki ağ durumunu her zaman yeni ve güncel bir şekilde göstermesi gerekir. Uygulamalar, uygulamanın önem verdiği değişikliklerle ilgili uyarı almak için ConnectivityManager ile bir geri arama kaydı yapabilir. Geri çağırma özelliğini kullanarak uygulamanız, hızlı güncellemeleri kaçırabilecek pahalı anket yapmak zorunda kalmadan bağlantıda ilgili herhangi bir değişikliğe anında tepki verebilir.

Cihazın bağlantı durumu hakkında bilgi edinmek için NetworkCallback ve diğer yöntemleri kullanmak özel bir izin gerektirmez. Ancak bazı ağlar belirli izinlere tabidir. Örneğin, uygulamaların kullanamadığı kısıtlanmış ağlar olabilir. Arka plan ağa bağlanmak için CHANGE_NETWORK_STATE izni gerekir. Bazı aramaların çalışması için de belirli izinler gerekebilir. Ayrıntılar için her görüşmeye ait özel belgeleri inceleyin.

Anlık durum bilgisi al

Android destekli bir cihaz, aynı anda birçok bağlantıyı koruyabilir. Mevcut ağ durumu hakkında bilgi almak için önce ConnectivityManager öğesinin bir örneğini alın:

Kotlin

val connectivityManager = getSystemService(ConnectivityManager::class.java)

Java

ConnectivityManager connectivityManager = getSystemService(ConnectivityManager.class);

Ardından, uygulamanızın mevcut varsayılan ağına referans almak için bu örneği kullanın:

Kotlin

val currentNetwork = connectivityManager.getActiveNetwork()

Java

Network currentNetwork = connectivityManager.getActiveNetwork();

Uygulamanız, bir ağa referans vererek ağla ilgili bilgi isteyebilir:

Kotlin

val caps = connectivityManager.getNetworkCapabilities(currentNetwork)
val linkProperties = connectivityManager.getLinkProperties(currentNetwork)

Java

NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(currentNetwork);
LinkProperties linkProperties = connectivityManager.getLinkProperties(currentNetwork);

Daha kullanışlı işlevler için bir NetworkCallback kaydedin. Ağ geri çağırmalarını kaydetme hakkında daha fazla bilgi için Ağ etkinliklerini dinleme konusuna bakın.

NetworkCapabilities ve LinkProperties

NetworkCapabilities ve LinkProperties nesneleri, sistemin bir ağ hakkında bildiği tüm özellikler hakkında bilgi verir.

LinkProperties nesnesi rotalar, bağlantı adresleri, arayüz adı, proxy bilgileri (varsa) ve DNS sunucuları hakkında bilgi sahibi olur. İhtiyacınız olan bilgileri almak için LinkProperties nesnesinde ilgili yöntemi çağırın.

NetworkCapabilities nesnesi, ağ aktarımları ve bunların özellikleri ile ilgili bilgileri içerir.

Taşıma, bir ağın çalıştığı fiziksel aracının soyutlanmasıdır. Taşıma için yaygın örnekler ethernet, kablosuz ve mobildir. VPN'ler ve eşler arası kablosuz ağlar da aktarım olarak kullanılabilir. Android'de, bir ağda aynı anda birden fazla aktarım olabilir. Buna örnek olarak hem kablosuz hem de mobil ağlar üzerinden çalışan bir VPN verilebilir. VPN'de kablosuz ağ, mobil ve VPN aktarımları bulunur. Bir ağın belirli bir aktarımı olup olmadığını öğrenmek için NetworkCapabilities.TRANSPORT_* sabitlerinden biriyle NetworkCapabilities.hasTransport(int) yöntemini kullanın.

Yetenek, ağın bir özelliğini tanımlar. MMS, NOT_METERED ve INTERNET özellikleri örnek olarak gösterilebilir. MMS özellikli bir ağ, Multimedya Mesaj Hizmeti mesajları gönderip alabilir. Bu özelliğe sahip olmayan bir ağ ise bunu yapamaz. NOT_METERED özelliğine sahip bir ağ, kullanıcıyı veriler için faturalandırmaz. Uygulamanız, NetworkCapabilities.NET_CAPABILITY_* sabit değerlerinden biriyle NetworkCapabilities.hasCapability(int) yöntemini kullanarak uygun özellikleri kontrol edebilir.

En kullanışlı NET_CAPABILITY_* sabitleri şunları içerir:

  • NET_CAPABILITY_INTERNET: Ağın internete erişecek şekilde ayarlandığını gösterir. Bu, kurulum ile ilgilidir; herkese açık sunuculara erişimin gerçek kabiliyeti değildir. Örneğin, bir ağ internete erişecek şekilde kurulabilir ancak doğrulama amacıyla yönlendirme yapan bir portala tabi olabilir.

    Bir operatörün mobil ağı genellikle INTERNET özelliğine sahiptir. Yerel bir P2P kablosuz ağı ise genellikle bu özelliğe sahip değildir. Gerçek bağlantı için bkz. NET_CAPABILITY_VALIDATED.

  • NET_CAPABILITY_NOT_METERED: Ağın ölçülmediğini gösterir. Kullanıcı parasal maliyetler, veri sınırlamaları veya pil performansı sorunları nedeniyle söz konusu bağlantıda yoğun veri kullanımına karşı hassas olan ağlar sayaçlı olarak sınıflandırılır.

  • NET_CAPABILITY_NOT_VPN: ağın sanal bir özel ağ olmadığını belirtir.

  • NET_CAPABILITY_VALIDATED: Ağın denetlendiğinde genel internete gerçek erişim sağladığını belirtir. Giriş portalının arkasındaki ağlarda veya alan adı çözümü sağlamayan ağlarda bu özellik bulunmaz. Sistemin gerçekten erişim sağlayan bir ağ hakkında söyleyebileceği en yakın değerdir. Ancak doğrulanmış bir ağ, ilke olarak yine de IP tabanlı filtrelemeye tabi tutulabilir veya zayıf sinyal gibi sorunlar nedeniyle ani bağlantı kayıpları yaşayabilir.

  • NET_CAPABILITY_CAPTIVE_PORTAL: Ağın denetlendiğinde giriş portalı olduğunu gösterir.

Daha özel uygulamaların ilgilenebileceği başka özellikler de vardır. Daha fazla bilgi için NetworkCapabilities.hasCapability(int) sayfasındaki parametre tanımlarını okuyun.

Bir ağın özellikleri herhangi bir zamanda değişebilir. Sistem, doğrulama amacıyla yönlendirme yapan bir portal algıladığında kullanıcıyı giriş yapmaya davet eden bir bildirim gösterir. Bu süreç devam ederken, ağ NET_CAPABILITY_INTERNET ve NET_CAPABILITY_CAPTIVE_PORTAL özelliklerine sahip olsa da NET_CAPABILITY_VALIDATED özelliklerine sahip değildir.

Kullanıcı işlem yapıp giriş portalı sayfasına giriş yaptığında cihaz herkese açık internete erişebilir, ağ ise NET_CAPABILITY_VALIDATED özelliğini kazanıp NET_CAPABILITY_CAPTIVE_PORTAL özelliğini kaybeder.

Benzer şekilde, ağın aktarımları dinamik olarak değişebilir. Örneğin, bir VPN, temel ağı için mobilden kablosuz ağa geçiş gibi yeni ortaya çıkan daha hızlı bir ağı kullanacak şekilde kendisini yeniden yapılandırabilir. Bu durumda ağ, TRANSPORT_CELLULAR aktarımını kaybeder ve TRANSPORT_WIFI aktarımını kazanırken TRANSPORT_VPN aktarımını korur.

Ağ etkinliklerini dinleme

Ağ etkinlikleri hakkında bilgi edinmek için NetworkCallback sınıfını ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback) ve ConnectivityManager.registerNetworkCallback(NetworkCallback) ile birlikte kullanın. Bu iki yöntem farklı amaçlara hizmet eder.

Tüm Android uygulamalarının varsayılan bir ağı vardır. Bu ağ, sistem tarafından belirlenir. Sistem genellikle sayaçlı ağlar yerine sayaçlı ağları, daha yavaş ağlara ise daha hızlı ağları tercih eder.

Bir uygulama HttpsURLConnection gibi bir ağ isteği yayınladığında sistem, bu isteği varsayılan ağı kullanarak karşılar. Uygulamalar diğer ağlarda da trafik gönderebilir. Daha fazla bilgi için ek ağlar ile ilgili bölüme bakın.

Varsayılan ağ olarak ayarlanan ağ, bir uygulamanın kullanım süresi boyunca herhangi bir zamanda değişebilir. Bilinen, etkin, ölçüm yapılmayan ve mobilden hızlı bir kablosuz ağ erişim noktasının kapsama alanında bulunan cihazlar buna örnek olarak verilebilir. Cihaz bu erişim noktasına bağlanır ve tüm uygulamalar için varsayılan ağı yeni kablosuz ağa geçirir.

Yeni bir ağ varsayılan hâline geldiğinde, uygulamanın açtığı tüm yeni bağlantılar bu ağı kullanır. Bir noktada, önceki varsayılan ağda kalan tüm bağlantılar zorla sonlandırılır. Uygulamanın, varsayılan ağın ne zaman değiştiğini bilmesi önemliyse aşağıdaki şekilde bir varsayılan ağ geri çağırması kaydeder:

Kotlin

connectivityManager.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network : Network) {
        Log.e(TAG, "The default network is now: " + network)
    }

    override fun onLost(network : Network) {
        Log.e(TAG, "The application no longer has a default network. The last default network was " + network)
    }

    override fun onCapabilitiesChanged(network : Network, networkCapabilities : NetworkCapabilities) {
        Log.e(TAG, "The default network changed capabilities: " + networkCapabilities)
    }

    override fun onLinkPropertiesChanged(network : Network, linkProperties : LinkProperties) {
        Log.e(TAG, "The default network changed link properties: " + linkProperties)
    }
})

Java

connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(Network network) {
        Log.e(TAG, "The default network is now: " + network);
    }

    @Override
    public void onLost(Network network) {
        Log.e(TAG, "The application no longer has a default network. The last default network was " + network);
    }

    @Override
    public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
        Log.e(TAG, "The default network changed capabilities: " + networkCapabilities);
    }

    @Override
    public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
        Log.e(TAG, "The default network changed link properties: " + linkProperties);
    }
});

Yeni bir ağ varsayılan hale geldiğinde uygulama yeni ağ için onAvailable(Network) numarasına bir çağrı alır. Bağlantı değişikliklerine uygun şekilde tepki vermek için onCapabilitiesChanged(Network,NetworkCapabilities), onLinkPropertiesChanged(Network,LinkProperties) veya her ikisini birden uygulayın.

registerDefaultNetworkCallback() ile kaydedilen bir geri arama için onLost(), ağın varsayılan ağ olma durumunu kaybettiği anlamına gelir. Bağlantısı kesilmiş olabilir.

NetworkCapabilities.hasTransport(int) sorgusunu sorgulayarak varsayılan ağın kullandığı aktarımlar hakkında bilgi edinebilirsiniz. Ancak bu, ağın bant genişliği veya sayaçlığı açısından zayıf bir proxy'dir. Uygulamanız kablosuz ağın her zaman sınırsız olduğunu varsayamaz ve her zaman mobilden daha iyi bant genişliği sağlar.

Bunun yerine, bant genişliğini ölçmek için NetworkCapabilities.getLinkDownstreamBandwidthKbps(), sayaçlılığı belirlemek için NET_CAPABILITY_NOT_METERED bağımsız değişkenleriyle NetworkCapabilites.hasCapability(int) kullanın. Daha fazla bilgi için NetworkCapabilities ve LinkProperties ile ilgili bölüme bakın.

Varsayılan olarak geri çağırma yöntemleri, uygulamanızın bağlantı iş parçacığında çağrılır. Bu iş parçacığı, ConnectivityManager tarafından kullanılan ayrı bir iş parçacığıdır. Geri çağırma uygulamanızın artık çalışması gerekiyorsa ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler) varyantını kullanarak bunları ayrı bir çalışan iş parçacığında çağırın.

Artık kullanmayacaksanız ConnectivityManager.unregisterNetworkCallback(NetworkCallback) numaralı telefonu arayarak geri aramanızın kaydını iptal edin. Özellikle geri çağırmayı onResume() içinde kaydediyorsanız ana etkinliğinizin onPause() bu işlemi yapmak için iyi bir yerdir.

Ek ağlar

Varsayılan ağ, çoğu uygulama için tek alakalı ağ olsa da bazı uygulamalar mevcut diğer ağlarla ilgilenebilir. Uygulamalar, bunları öğrenmek için ihtiyaçlarına uygun bir NetworkRequest oluşturup ConnectivityManager.registerNetworkCallback(NetworkRequest, NetworkCallback) numaralı telefonu arayın.

Bu işlem, varsayılan ağı dinlemeye benzer. Bununla birlikte, herhangi bir zamanda bir uygulama için geçerli olan yalnızca bir varsayılan ağ olsa da bu sürüm, uygulamanızın mevcut tüm ağları aynı anda görmesine olanak tanır. Bu nedenle onLost(Network) yapılması, ağın bağlantısının artık varsayılan olmadığı anlamına gelir.

Uygulama, ConnectivityManager adlı kullanıcıya ne tür ağları dinlemek istediğini bildirmek için bir NetworkRequest oluşturur. Aşağıdaki örnekte, yalnızca sayaçsız internet bağlantılarıyla ilgilenen bir uygulama için NetworkRequest oluşturma işleminin nasıl yapılacağı gösterilmektedir:

Kotlin

val request = NetworkRequest.Builder()
  .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
  .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .build()

connectivityManager.registerNetworkCallback(request, myNetworkCallback)

Java

NetworkRequest request = new NetworkRequest.Builder()
  .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
  .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .build();

connectivityManager.registerNetworkCallback(request, myNetworkCallback);

Bu, uygulamanızın sistemdeki ölçülmeyen ağlarla ilgili tüm değişiklikleri haberdar edeceği anlamına gelir.

Varsayılan ağ geri çağırması için de Handler kabul eden bir registerNetworkCallback(NetworkRequest, NetworkCallback, Handler) sürümü bulunmaktadır. Bu nedenle uygulamanızın Connectivity ileti dizisini yüklemez.

Geri arama artık alakalı olmadığında ConnectivityManager.unregisterNetworkCallback(NetworkCallback) numaralı telefonu arayın. Bir uygulama aynı anda birden fazla ağ geri çağırması kaydedebilir.

Kolaylık sağlaması açısından NetworkRequest nesnesi, çoğu uygulamanın ihtiyaç duyduğu ortak özellikleri içerir. Bu özellikler arasında şunlar bulunur:

Uygulamanızı yazarken, varsayılan değerleri kontrol ederek kullanım alanınızla eşleşip eşleşmediğini kontrol edin ve bu özelliklere sahip olmayan ağlar hakkında uygulamanızın bilgilendirilmesini istiyorsanız bunları temizleyin. Diğer yandan, uygulamanızın etkileşimde bulunmadığı ağlardaki herhangi bir bağlantı değişikliği durumunda çağrılmamak için özellikler ekleyin.

Örneğin, uygulamanızın MMS mesajları göndermesi gerekiyorsa MMS mesajı gönderemeyen tüm ağların bildirilmesini önlemek için NetworkRequest öğesine NET_CAPABILITY_MMS ekleyin. Uygulamanız yalnızca P2P kablosuz bağlantıyla ilgileniyorsanız TRANSPORT_WIFI_AWARE değerini ekleyin. NET_CAPABILITY_INTERNET ve NET_CAPABILITY_VALIDATED, internetteki bir sunucuyla veri aktarabilmek istiyorsanız kullanışlıdır.

Örnek geri çağırma sırası

Bu bölümde, mobil bağlantısı olan bir cihazda hem varsayılan bir geri çağırma hem de bir normal geri çağırma kaydedilmesi halinde uygulamanın alabileceği geri çağırma sırası açıklanmaktadır. Bu örnekte, cihaz iyi bir kablosuz erişim noktasına bağlanır, daha sonra bağlantısını keser. Örnekte, cihazda Mobil veri her zaman açık ayarının da etkin olduğu varsayılır.

Zaman çizelgesi aşağıdaki gibidir:

  1. Uygulama registerNetworkCallback() çağrısı yaptığında, geri arama anında mobil şebeke için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() ağlarından gelen aramaları alır, çünkü yalnızca bu ağlar kullanılabilir. Başka bir ağ varsa uygulama diğer ağ için de geri çağırma alır.

    Kayıt ağı geri çağırma etkinliğini ve bu etkinlik tarafından tetiklenen geri çağırmaları gösteren durum şeması
    Şekil 1. registerNetworkCallback() arandıktan sonra uygulama durumu.

  2. Ardından uygulama registerDefaultNetworkCallback() numarasını çağırır. Mobil ağ varsayılan ağ olduğundan, varsayılan ağ geri çağırması mobil şebeke için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() numaralı telefona gelen aramaları almaya başlar. Varsayılan olmayan başka bir ağ çalışırsa uygulama varsayılan olmayan ağa yapılan aramaları alamaz.

    Varsayılan ağ geri çağırma etkinliğini ve etkinlik tarafından tetiklenen geri çağırmaların kaydedilmesini gösteren durum şeması
    Şekil 2. Varsayılan ağ kaydedildikten sonra uygulama durumu

  3. Daha sonra, cihaz bir (sınırsız) kablosuz ağa bağlanır. Normal ağ geri çağırması kablosuz ağ için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() çağrılarına gelen aramaları alır.

    Uygulama yeni bir ağa bağlandığında tetiklenen geri çağırmaları gösteren durum şeması
    Şekil 3. Sayaçsız bir kablosuz ağa bağlandıktan sonra uygulama durumu.

  4. Bu noktada kablosuz ağın doğrulanması biraz zaman alabilir. Bu durumda, normal ağ geri çağırması için yapılan onNetworkCapabilitiesChanged() çağrıları, NET_CAPABILITY_VALIDATED özelliğini içermez. Kısa bir süre sonra onNetworkCapabilitiesChanged() bir çağrı alır ve yeni özellikler arasında NET_CAPABILITY_VALIDATED bulunur. Çoğu durumda, doğrulama işlemi çok hızlıdır.

    Kablosuz ağ doğrulandığında, esasen ölçüm yapılmadığı için sistem, mobil ağı tercih eder. Kablosuz ağ varsayılan ağ haline gelir. Dolayısıyla, varsayılan ağ geri çağırması kablosuz ağ için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() numaralı telefona bir çağrı alır. Mobil ağ arka plana geçer ve normal ağ geri çağırması mobil ağ için onLosing() arasına bir çağrı alır.

    Bu örnekte, mobil verinin bu cihaz için her zaman açık olduğu varsayıldığından mobil ağın bağlantısı hiçbir zaman kesilmez. Bu ayar kapatılırsa bir süre sonra mobil ağ bağlantısı kesilir ve normal ağ geri çağırması onLost() numaralı telefona bir çağrı alır.

    Bir kablosuz ağ bağlantısı doğrulandığında tetiklenen geri çağırmaları gösteren durum şeması
    Şekil 4. Kablosuz ağ doğrulandıktan sonra uygulama durumu.

  5. Daha sonra, kapsama alanı dışına çıktığı için cihazın kablosuz bağlantısı aniden kesiliyor. Kablosuz ağ bağlantısı kesildiğinden normal ağ geri çağırması, kablosuz ağ için onLost() numaralı telefona bir çağrı alır. Mobil, yeni varsayılan ağ olduğundan, varsayılan ağ geri çağırması mobil şebeke için onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() adreslerine yapılan aramaları alır.

    Kablosuz ağ bağlantısı kesildiğinde tetiklenen geri çağırmaları gösteren durum diyagramı
    Şekil 5. Kablosuz ağ bağlantısı kesildikten sonra uygulama durumu.

Mobil veri her zaman açık ayarı kapalıysa kablosuz ağ bağlantısı kesildiğinde cihaz bir mobil ağa yeniden bağlanmaya çalışır. Resim benzerdir ancak onAvailable() çağrıları için ek bir kısa gecikme vardır ve normal ağ geri çağırması da mobil cihaz kullanılabilir olduğundan onAvailable(), onNetworkCapabilitiesChanged() ve onLinkPropertiesChanged() numaralı telefona gelen aramaları alır.

Veri aktarımı için ağın kullanımına ilişkin kısıtlamalar

Ağ geri çağırma işlevi olan bir ağı görebilmek, uygulamanızın veri aktarımı için ağı kullanabileceği anlamına gelmez. Bazı ağlar internet bağlantısı sağlamaz, bazı ağlar da ayrıcalıklı uygulamalarla kısıtlanmış olabilir. İnternet bağlantısını kontrol etmek için NET_CAPABILITY_INTERNET ve NET_CAPABILITY_VALIDATED sayfalarına göz atın.

Arka plan ağlarının kullanımı da izin kontrollerine tabidir. Uygulamanız arka plan ağ kullanmak istiyorsa CHANGE_NETWORK_STATE iznine ihtiyacı vardır.

Bu izne sahip uygulamalar, cihaz bir kablosuz ağa bağlıyken sistemin mobil ağ gibi etkin olmayan bir ağı açmaya çalışmasına olanak tanır. Böyle bir uygulama, ağ açıldığında bir NetworkCallback ile ConnectivityManager.requestNetwork(NetworkRequest, NetworkCallback) çağrısı yapar.