To get screen dimensions in pixels on Android, use these methods depending on your use case and API level:
1. Using DisplayMetrics
(All API Levels)
This method works for all versions of Android and provides the current app window size (excluding system UI like the status bar):
val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val displayMetrics = DisplayMetrics()
// For app window size (excluding system UI):
windowManager.defaultDisplay?.getMetrics(displayMetrics)
// For full screen size (including system UI):
windowManager.defaultDisplay?.getRealMetrics(displayMetrics)
val screenWidthPx = displayMetrics.widthPixels
val screenHeightPx = displayMetrics.heightPixels
2. Using WindowMetrics
(API 30+)
For modern Android versions (API 30+), use WindowMetrics
for accurate results:
val windowMetrics = context.getSystemService(WindowManager::class.java).currentWindowMetrics
val bounds = windowMetrics.bounds
val screenWidthPx = bounds.width()
val screenHeightPx = bounds.height()
3. Using Jetpack Compose
In Compose, use LocalConfiguration
:
val configuration = LocalConfiguration.current
val screenWidthPx = configuration.screenWidthDp * configuration.densityDpi / 160f
val screenHeightPx = configuration.screenHeightDp * configuration.densityDpi / 160f
4. For Full Physical Screen Size
To get the physical screen resolution (ignoring software buttons/status bars):
val displayMetrics = Resources.getSystem().displayMetrics
val screenWidthPx = displayMetrics.widthPixels
val screenHeightPx = displayMetrics.heightPixels
Key Notes
- Orientation Awareness:
val isPortrait = configuration.orientation == Configuration.ORIENTATION_PORTRAIT
val currentWidthPx = if (isPortrait) screenWidthPx else screenHeightPx
- Multi-Window Mode: Use
WindowMetrics
(API 30+) for accurate results in split-screen mode. - Deprecated Methods: Avoid
Display#getSize()
andDisplay#getRealSize()
.
Example Usage
// Get full screen dimensions (API 30+)
fun getScreenSize(context: Context): Pair<Int, Int> {
val windowManager = context.getSystemService(WindowManager::class.java)
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val metrics = windowManager.currentWindowMetrics
Pair(metrics.bounds.width(), metrics.bounds.height())
} else {
val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay?.getRealMetrics(displayMetrics)
Pair(displayMetrics.widthPixels, displayMetrics.heightPixels)
}
}
Output Comparison
Method | Includes System UI | Multi-Window Aware | Orientation Aware |
---|---|---|---|
DisplayMetrics | ❌ | ❌ | ✅ |
WindowMetrics | ✅ | ✅ | ✅ |
Resources#display | ✅ | ❌ | ✅ |
Choose the method based on your target API level and whether you need to account for system UI elements. For modern apps targeting API 30+, WindowMetrics
is recommended.