İnternet teknolojisi hayatımızın hemen her anında bizlere kolaylıklar sunmaktadır. Mobil uygulamaların birçoğu internet teknolojini, telefon şarj yönetimi, akıllı ev yazılımlar(IOT), veri alışverişi vb konuları yapabilmek için kullanmaktadır. Mobil uygulama yazılımları için internet bu kadar ihtiyaç ise telefonda internetin olup olmadığını kontrol etmek çok önemli bir konu değil mi?
Bu makalede, Kotlin dili ile oluşturulmuş bir Android uygulama içerisinden telefonda internet kontrolü ve var olan internetin Wifi mi yoksa mobil veriden mi (cellular) geldiğini tespit etmeyi örnekleyeceğim.
Örneğimin ekran görüntüsü aşağıdaki gibi olacak.
Bu projenin yapım adımlarına başlayalım.
1-Proje Oluşturma
Ben bu örneği Kotlin dili ile yazdığım için projenizi oluştururken Language alanını Kotlin seçmelisiniz.
2-Gerekli Kütüphanenin Yüklenmesi
Projeyi belirttiğim gibi oluşturduktan sonra, projemin app dizinin altındaki build.gradle dosyasını açıyoruz. Dependencies kod bloklarının arasına aşağıdaki kodları yerleştirerek LocalBroadcastManager kütüphanelerini yüklüyoruz.
1 |
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0' |
3- İzinlerin Eklenmesi
Telefondaki internet durum bilgisini alabilmek için AndroidManifest dosyasına kırmızı ile belirttiğim yere kodu eklemelisiniz. AndroidManifest dosyası; app -> src -> main dizininin içindedir.
1 |
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> |
4- Kontrolleri Sağlayacağım Sınıfı Oluşturma
NetworkMonitorUtil adında oluşturduğum sınıfta internetin tüm durumlarını kontrol ettim ve durumu result değişkenine atadım.
Android’in yeni sürümlerinde bazı yöntemler kullanımdan kaldırıldığından, internet bağlantısını kontrol etmek için iki farklı yol kullanacağız:
- Android 9 (Pie) ve sonraki sürümlere sahip cihazlar için, ağın ne zaman kullanılabilir olup olmadığını ve network ağının ne tür olduğunu (Wifi, Cellular vb.) tespit etme yöntemlerine sahip olan NetworkCallback’i kullandım.
- Android 8 (Oreo) ve altındaki cihazlar için, ağ durumu her değiştiğinde kodu çalıştırmak için CONNECTIVITY_ACTION yöntemini LocalBroadcastManager ile birleştirdim.
Daha detaylı açıklamalar için kod yorumlarını okuyabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.os.Build enum class ConnectionType { Wifi, Cellular } class NetworkMonitorUtil(context: Context) { private var mContext = context private lateinit var networkCallback: ConnectivityManager.NetworkCallback lateinit var result: ((isAvailable: Boolean, type: ConnectionType?) -> Unit) @Suppress("DEPRECATION") fun register() { //Android 9 ve üstü versiyonlarda NetworkCallback ile internet kontrolü if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { val connectivityManager = mContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager //uygulama ilk açıldığında internet olmama durumunun kontrolu if (connectivityManager.activeNetwork == null) { result(false,null) } //internet varken, sonrasında internet kapatıldığında onLost metodu çalışır networkCallback = object : ConnectivityManager.NetworkCallback() { override fun onLost(network: Network) { super.onLost(network) result(false, null) } //İnternetin geldiği ağın Wifi mi yoksa mobil yeri mi(Cellular) olduğunun tespiti override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { super.onCapabilitiesChanged(network, networkCapabilities) when { networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> { // WIFI result(true,ConnectionType.Wifi) } else -> { // CELLULAR result(true,ConnectionType.Cellular) } } } } connectivityManager.registerDefaultNetworkCallback(networkCallback) } else { //Android 8 ve altı versiyonlarda Intent Filter ile internet kontrolü val intentFilter = IntentFilter() intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE") mContext.registerReceiver(networkChangeReceiver, intentFilter) } } //uygulama kapatıldığında network sinyallerinin dinlemesini durdurulması fun unregister() { //Android 9 ve üstü versiyonlarda if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { val connectivityManager = mContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager connectivityManager.unregisterNetworkCallback(networkCallback) } else { //Android 8 ve altı versiyonlarda mContext.unregisterReceiver(networkChangeReceiver) } } //Network sinyallerini dinleyerek (BroadcastReceiver), internet değişikliklerini takip etme @Suppress("DEPRECATION") private val networkChangeReceiver: BroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val activeNetworkInfo = connectivityManager.activeNetworkInfo if (activeNetworkInfo != null) { //Network bağlantı tipinin kontrolu (WIFI ya da Mobil veri) when (activeNetworkInfo.type) { ConnectivityManager.TYPE_WIFI -> { // WIFI result(true, ConnectionType.Wifi) } else -> { // CELLULAR result(true, ConnectionType.Cellular) } } } else { result(false, null) } } } } |
5- NetworkMonitorUtil Sınıfının Kullanılması
İlk önce MainActivity sınıfında, NetworkMonitorUtil sınıfını çağırdık. Sonrasında onResume() metodunun içinde register metodunu kullanarak NetworkMonitorUtil sınıfındaki kontrollerimizin çalışmasını sağladık. Son olarak onCreate metodunda NetworkMonitorUtil sınıfında elde ettiğimiz internet kontrollerinin sonuçlarını arayüz tasarımında gösterilmesini sağladım. İlgili kodların açıklamalarıyla birlikte aşağıdan ulaşabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { private val networkMonitor = NetworkMonitorUtil(this) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //NetworkMonitorUtil sınıfında elde ettğimiz internet kontrollerinin sonuçlarını //kullanıcı arayüzünde gösterme networkMonitor.result = { isAvailable, type -> runOnUiThread { when (isAvailable) { true -> { when (type) { ConnectionType.Wifi -> { internet_status.text = "Wifi Connection" } ConnectionType.Cellular -> { internet_status.text = "Cellular Connection" } else -> { } } } false -> { internet_status.text = "No Connection" } } } } } override fun onResume() { super.onResume() networkMonitor.register() } override fun onStop() { super.onStop() networkMonitor.unregister() } } |
Projemin kodlarına github linkinden hızlıca ulaşabilirsiniz.
Kaynak: https://johncodeos.com/how-to-check-for-internet-connection-in-android-using-kotlin/