How to Get the Device's IMEI/ESN Programmatically in Android using Jetpack Compose?
Last Updated :
19 Mar, 2025
Android applications many times require the unique identity of the user while developing applications. This unique identity is used to identify the user of the application. Many android apps use the IMEI number as the unique identity of each user. In this article, we will take a look at How to get Device IMEI and ESN Programmatically in android using Jetpack Compose.
Important: From Android 10+, we can no longer access the IMEI number of an android device. This required the permission READ_PRIVILEGED_PHONE_STATE which is only accessible to system apps.
Step by Step Implementation
Step 1: Create a New Project in Android Studio
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. While choosing the template, select Empty Compose Activity. If you do not find this template, try upgrading the Android Studio to the latest version. We demonstrated the application in Kotlin, so make sure you select Kotlin as the primary language while creating a New Project.
Step 3: Adding permissions in the Manifest file
Navigate to app > manifests > AndroidManifest.xml and add the below permissions to it in the manifest tag.
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Step 2: Working with the MainActivity.kt file
Go to the MainActivity.kt file and refer to the following code. Below is the code for the MainActivity.kt file. Comments are added inside the code to understand the code in more detail.
MainActivity.kt:
Kotlin
package com.geeksforgeeks.demo
import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.Context.TELEPHONY_SERVICE
import android.content.pm.PackageManager
import android.os.*
import android.telephony.TelephonyManager
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.annotation.RequiresApi
import androidx.compose.foundation.layout.*
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.*
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.*
import androidx.core.app.ActivityCompat
import com.geeksforgeeks.demo.ui.theme.DemoTheme
class MainActivity : ComponentActivity() {
@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
DemoTheme {
val context = LocalContext.current
val activity = context as Activity
DisplayIMEI(context, activity)
}
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray,
deviceId: Int
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId)
// checking request code.
if (requestCode == 101) {
// checking if permission is granted.
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED
) {
Toast.makeText(this, "Permission granted.", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, "Permission denied.", Toast.LENGTH_SHORT).show()
}
}
}
}
@RequiresApi(Build.VERSION_CODES.O)
@Composable
fun DisplayIMEI(context: Context, activity: Activity) {
Column(
modifier = Modifier
.fillMaxWidth()
.fillMaxHeight(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
// checking for permissions
if (ActivityCompat.checkSelfPermission(
context,
Manifest.permission.READ_PHONE_STATE
) != PackageManager.PERMISSION_GRANTED
) {
// if permissions are not provided, request for permissions
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.READ_PHONE_STATE), 101
)
}
Text(
text = "IMEI Number of Android Device",
fontSize = 20.sp,
modifier = Modifier.padding(5.dp),
fontWeight = FontWeight.Bold
)
val telephonyManager = context.getSystemService(TELEPHONY_SERVICE) as TelephonyManager
// get imei from Telephony Manager.
val imei = telephonyManager.imei
// IMEI text display
Text(
text = imei,
modifier = Modifier.padding(5.dp),
fontSize = 20.sp,
fontWeight = FontWeight.Bold
)
}
}
Output: