How to Detect Cellular Network Type (2G, 3G, 4G and 5G) in Android? (original) (raw)

`package org.geeksforgeeks.demo

import android.Manifest import android.content.Context import android.content.pm.PackageManager import android.os.Bundle import android.telephony.TelephonyManager import android.widget.Button import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import android.net.ConnectivityManager import android.net.NetworkCapabilities import androidx.core.app.ActivityCompat

class MainActivity : AppCompatActivity() {

companion object {
    // Request code used for identifying the permission request
    const val PERMISSION_REQUEST_CODE = 1
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // Find the button from layout
    val button: Button = findViewById(R.id.button)

    // Set click listener for the button
    button.setOnClickListener {
        // Check if READ_PHONE_STATE permission is already granted
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
            != PackageManager.PERMISSION_GRANTED
        ) {
            // If not granted, request the permission from user
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.READ_PHONE_STATE),
                PERMISSION_REQUEST_CODE
            )
        } else {
            // If permission is granted, call the network type function
            val message = getNetworkType(this)
            Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
        }
    }
}

// This function returns the type of current network: WIFI, 2G, 3G, 4G, 5G, etc.
private fun getNetworkType(context: Context): String {
    // Get ConnectivityManager to access network state
    val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    // Get the currently active network (null if not connected)
    val capabilities =
        connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
            ?: return "-" // If no active network, return "-"

    return when {
        // If connected to WiFi
        capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> "WIFI"

        // If connected to mobile data
        capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
            val telephonyManager =
                context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager

            // Note: Permission is already checked in onClick, this is a safety fallback
            if (ActivityCompat.checkSelfPermission(
                    context,
                    Manifest.permission.READ_PHONE_STATE
                )
                != PackageManager.PERMISSION_GRANTED
            ) {
                return "PERMISSION_NOT_GRANTED"
            }

            // Match the data network type to human-readable names
            return when (telephonyManager.dataNetworkType) {
                TelephonyManager.NETWORK_TYPE_GPRS,
                TelephonyManager.NETWORK_TYPE_EDGE,
                TelephonyManager.NETWORK_TYPE_CDMA,
                TelephonyManager.NETWORK_TYPE_1xRTT,
                TelephonyManager.NETWORK_TYPE_IDEN,
                TelephonyManager.NETWORK_TYPE_GSM -> "2G"

                TelephonyManager.NETWORK_TYPE_UMTS,
                TelephonyManager.NETWORK_TYPE_EVDO_0,
                TelephonyManager.NETWORK_TYPE_EVDO_A,
                TelephonyManager.NETWORK_TYPE_HSDPA,
                TelephonyManager.NETWORK_TYPE_HSUPA,
                TelephonyManager.NETWORK_TYPE_HSPA,
                TelephonyManager.NETWORK_TYPE_EVDO_B,
                TelephonyManager.NETWORK_TYPE_EHRPD,
                TelephonyManager.NETWORK_TYPE_HSPAP,
                TelephonyManager.NETWORK_TYPE_TD_SCDMA -> "3G"

                TelephonyManager.NETWORK_TYPE_LTE,
                TelephonyManager.NETWORK_TYPE_IWLAN,
                19 -> "4G"

                TelephonyManager.NETWORK_TYPE_NR -> "5G"

                else -> "CELLULAR"
            }
        }

        // Fallback in case network is not WiFi or cellular
        else -> "UNKNOWN"
    }
}

// Handle the result of permission request
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)

    if (requestCode == PERMISSION_REQUEST_CODE) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // If permission is granted, get the network type
            val message = getNetworkType(this)
            Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
        } else {
            // If permission denied
            Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show()
        }
    }
}

}

`