Android中getRealMetrics与defaultDisplay.getMetrics过时问题求解决方案
解决DisplayMetrics相关过时API的替代方案
方案一:适配全版本的densityDpi获取代码
直接替换原有逻辑,用官方推荐的API替代过时方法:
val densityDpi: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Android 11及以上:使用Display的metrics属性 context.display?.metrics?.densityDpi ?: DisplayMetrics.DENSITY_DEFAULT } else { // Android 10及以下:用getRealMetrics替代过时的getMetrics,添加注解消除警告 val displayMetrics = DisplayMetrics() @Suppress("DEPRECATION") context.getSystemService(WindowManager::class.java)?.defaultDisplay?.getRealMetrics(displayMetrics) displayMetrics.densityDpi }
方案二:针对Android 11+的窗口精确Metrics获取
如果需要获取当前应用窗口的真实显示参数(包含系统UI占用空间),可以用WindowMetrics:
val densityDpi: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val windowManager = context.getSystemService(WindowManager::class.java) val windowMetrics = windowManager.currentWindowMetrics windowMetrics.density.dpi } else { val displayMetrics = DisplayMetrics() @Suppress("DEPRECATION") context.getSystemService(WindowManager::class.java)?.defaultDisplay?.getRealMetrics(displayMetrics) displayMetrics.densityDpi }
补充说明
如果场景不需要严格区分真实屏幕和应用窗口,也可以直接使用context.resources.displayMetrics.densityDpi,这个API未过时,能满足大多数常规需求。
内容的提问来源于stack exchange,提问作者Hrithik Rajput
相关产品推荐
相关产品推荐

