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()
}
}
}}
`