如何获取屏幕DPI

4

我试图获取屏幕的dpi,但目前还没有成功。我尝试了:

    DisplayMetrics dm = new DisplayMetrics();
    mainContext.getWindowManager().getDefaultDisplay().getMetrics(dm);
    SCREEN_DPI = dm.densityDpi;

但是在三星Galaxy Tab 10.1和三星Galaxy S I9000上,SCREEN_DPI的值都为160。我也尝试了SCREEN_DPI = dm.density,但两种情况下我得到的值都是1.0

非常感谢您的帮助。


1
我在模拟器上遇到了问题。我认为这个问题与库有关,而不是设备。 - Bobs
3个回答

2

本问题的重复问题请参考此链接

虽然 Android 没有使用直接像素映射,但它使用少量量化的 Density Independent Pixel 值,然后将其缩放到实际屏幕大小。因此密度属性将是这些常量之一(120、160 或 240 dpi)。

如果您需要实际密度(可能为 OpenGL 应用程序),则可以分别从 xdpi 和 ydpi 属性获取水平和垂直密度。


2
不,这并不是重复的。我已经按照那篇帖子所说的做了。正如我解释的那样,它并没有起作用:对于具有不同密度的设备,我得到的密度是相同的。 - Alesqui
2
@Alesqui:那么这些设备就属于相同的密度桶。三星可以将它们归类为任何他们希望的密度桶。 - CommonsWare
1
仅从数字上看,I9000的ydpi为250,xdpi为200;由于Pentile子像素排列,我认为它被归类为较低的dpi类别。Tab似乎自然而然地属于mdpi。 - Kevin Coppock

1
尝试使用getRealMetrics()代替:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getRealMetrics(metrics);

这个API在API 17中正式添加,但在我的有限测试中,即使在4.0设备上也可以正常工作,因此它可能是在那之前隐藏的API。
官方文档在这里,尽管似乎有更多的原因导致其他API不能按照你的期望工作,而不仅仅是那里的文字所暗示的。

0
根据@CommonsWare的说法:“三星可以将它们(设备)分类为任何密度桶”,因此,在这种情况下,两个设备都在相同的密度桶中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接