我们最近注意到一个数据异常,因为许多设备通过DisplayMetrics误报了他们的xdpi和ydpi.
作为一个具体的例子,运行4.4.2的所有SPH-L710 Sprint Galaxy S III设备报告的xdpi和ydpi为~160.分辨率为1280×720,这将测量到~9英寸的屏幕尺寸,显然不是这种情况.在4.4.2之前,该设备模型分别正确报告其xdpi和ydpi:~304和~306.
我们通过DisplayMetrics访问此信息,如下所示:
DisplayMetrics dm = getResources().getDisplayMetrics(); xdpi = dm.xdpi; ydpi = dm.ydpi;
有没有人注意到这些指标是不一致/不可靠的?有更准确的方法来访问这些信息吗?
编辑:我发现有关xdpi / ydpi不准确的this post. Romain和Dianne似乎都承认这个问题 – 因此DisplayMetrics文档没有记录这些不可靠的属性这一事实对我来说似乎是不负责任的.
解决方法
从API 17开始,您可以调用getRealMetrics以获得更准确的结果.
DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getRealMetrics(dm); xdpi = dm.xdpi; ydpi = dm.ydpi;
public void getRealMetrics (DisplayMetrics outMetrics)
Added in API level 17 Gets display metrics based on the real size of
this display.The size is adjusted based on the current rotation of the display.
The real size may be smaller than the physical size of the screen when
the window manager is emulating a smaller display (using adb shell am
display-size).Parameters outMetrics A DisplayMetrics object to receive the metrics.