安卓Instrumentation测试获取屏幕尺寸异常问题求助
解决UiDevice获取屏幕分辨率与实际不符的问题
看起来你遇到的问题是因为UiDevice.getDisplayHeight()和getDisplayWidth()返回的并不是屏幕的真实物理像素,而是应用可使用的显示区域像素(或者系统缩放后的逻辑像素),这也是为什么你看到的数值和实际屏幕尺寸2244×1080不符。下面给出具体的解决方案和原因分析:
问题根源
UiDevice的这两个方法返回的是当前测试应用窗口可用的显示尺寸,会排除系统状态栏、导航栏等系统UI占用的空间;同时如果设备开启了显示缩放功能(比如系统设置里的"显示大小"调整),这个数值还会是经过缩放后的逻辑像素值,并非屏幕的真实物理分辨率。而你添加的<supports-screens>配置只是告诉系统你的应用支持哪些屏幕尺寸,不会改变测试时获取分辨率的方式,所以无法解决这个问题。
正确获取真实物理屏幕分辨率的方法
要拿到屏幕的真实物理像素,你需要通过DisplayMetrics的getRealMetrics()方法(Android API 17+),或者Android 10及以上的WindowMetrics来获取,以下是具体代码示例:
方法1:使用DisplayMetrics.getRealMetrics()(兼容API 17+)
import android.content.Context; import android.util.DisplayMetrics; import android.view.Display; import android.view.WindowManager; import androidx.test.platform.app.InstrumentationRegistry; import org.junit.Test; import android.util.Log; public class ScreenResolutionTest { @Test public void getRealScreenPixels() { // 获取测试上下文 Context context = InstrumentationRegistry.getInstrumentation().getContext(); WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = windowManager.getDefaultDisplay(); DisplayMetrics realMetrics = new DisplayMetrics(); // getRealMetrics会返回屏幕的真实物理像素,包含状态栏、导航栏等所有区域 display.getRealMetrics(realMetrics); int realScreenWidth = realMetrics.widthPixels; int realScreenHeight = realMetrics.heightPixels; Log.d("RealScreen", "真实屏幕宽度:" + realScreenWidth + "px,真实屏幕高度:" + realScreenHeight + "px"); } }
方法2:使用WindowMetrics(Android 10+,API 30+)
如果你的测试设备是Android 10及以上,可以用更推荐的WindowMetrics API:
import android.content.Context; import android.view.WindowManager; import android.graphics.Rect; import androidx.test.platform.app.InstrumentationRegistry; import org.junit.Test; import android.util.Log; public class ScreenResolutionTest { @Test public void getRealScreenPixelsForAndroid10Plus() { Context context = InstrumentationRegistry.getInstrumentation().getContext(); WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { // 获取屏幕最大可用窗口尺寸,对应真实屏幕分辨率 WindowMetrics maxWindowMetrics = windowManager.getMaximumWindowMetrics(); Rect maxBounds = maxWindowMetrics.getBounds(); int realWidth = maxBounds.width(); int realHeight = maxBounds.height(); Log.d("RealScreen", "真实屏幕宽度:" + realWidth + "px,真实屏幕高度:" + realHeight + "px"); } } }
验证结果
运行上述测试代码后,你应该能得到和实际屏幕一致的2244×1080像素值。如果还是有问题,可以检查设备是否开启了显示缩放功能(系统设置→显示→显示大小),缩放会改变系统逻辑像素与物理像素的比例,但getRealMetrics()和WindowMetrics依然能获取到真实的物理像素值。
内容的提问来源于stack exchange,提问作者JohnnyChan
相关产品推荐
相关产品推荐

