如何检查Android设备是HDPI屏幕还是MDPI屏幕?

134

我想检查这个以获取不同的互联网图片。如何做到?

7个回答

237
density = getResources().getDisplayMetrics().density;

// return 0.75 if it's LDPI
// return 1.0 if it's MDPI
// return 1.5 if it's HDPI
// return 2.0 if it's XHDPI
// return 3.0 if it's XXHDPI
// return 4.0 if it's XXXHDPI

9
密度数值的描述可在此页面查阅:http://developer.android.com/guide/practices/screens_support.html - esilver
1
@SteD 有没有可能预测一个设备是什么?例如,考虑 dpi 在桶范围中间为 140 的情况,它会四舍五入到哪一边? - wal
4
对于我的 Nexus 6P,我得到了3.5分,它属于哪个类别? - Manohar
2
OnePlus3T有2.625,我们应该考虑它在哪里? - Parth Anjaria
1
3.5 另外,这并不能明确回答问题。 - Keith Loughnane
显示剩余2条评论

190

你可以通过以下方式检查屏幕密度:

switch (getResources().getDisplayMetrics().densityDpi) {
case DisplayMetrics.DENSITY_LOW:
    // ...
    break;
case DisplayMetrics.DENSITY_MEDIUM:
    // ...
    break;
case DisplayMetrics.DENSITY_HIGH:
    // ...
    break;
case DisplayMetrics.DENSITY_XHIGH:
    // ...
    break;
}

编辑 请注意随着Android的演变,switch语句中应包含其他值。截至此次编辑,这些值包括DisplayMetrics.DENSITY_TVDisplayMetrics.DENSITY_XXHIGH。查阅文档以获取最新信息;我不打算维护这个答案。


它应该存在于SDK级别4(平台1.6)及以上。您使用的是哪个SDK级别?(在SDK 3中,您可以像SteD建议的那样使用“density”)。 - Ted Hopp
我需要针对平台1.5进行开发。下面的答案可能符合我的要求。 - virsir
4
以下回答现在成为了上面的回答,需要更加通用。 - Neil
顺便提一下,对于一些新设备(如Nexus 7),您还应该包括DENSITY_TV。 - annie
1
@annie - 很好的观点。谢谢。从API级别16开始,它还应该包括DENSITY_XXHIGH。我在答案中添加了免责声明以涵盖所有未来情况。 :) - Ted Hopp
1
看起来这些值是有序的。因此,如果您不想错过特定的dpi,则可以使用“if(dpi> = DisplayMetrics ...)”序列。 - M.kazem Akhgary

19

截至2018年,您可以使用以下方法 -

    public static String getDeviceDensityString(Context context) {
    switch (context.getResources().getDisplayMetrics().densityDpi) {
        case DisplayMetrics.DENSITY_LOW:
            return "ldpi";
        case DisplayMetrics.DENSITY_MEDIUM:
            return "mdpi";
        case DisplayMetrics.DENSITY_TV:
        case DisplayMetrics.DENSITY_HIGH:
            return "hdpi";
        case DisplayMetrics.DENSITY_260:
        case DisplayMetrics.DENSITY_280:
        case DisplayMetrics.DENSITY_300:
        case DisplayMetrics.DENSITY_XHIGH:
            return "xhdpi";
        case DisplayMetrics.DENSITY_340:
        case DisplayMetrics.DENSITY_360:
        case DisplayMetrics.DENSITY_400:
        case DisplayMetrics.DENSITY_420:
        case DisplayMetrics.DENSITY_440:
        case DisplayMetrics.DENSITY_XXHIGH:
            return "xxhdpi";
        case DisplayMetrics.DENSITY_560:
        case DisplayMetrics.DENSITY_XXXHIGH:
            return "xxxhdpi";
    }
}

但正如@Ted所指出的,使用前请始终参考官方文档。


根据Android文档,这也是正确的方法。当API中添加新的DENSITY_?值时,应该重构此方法。 在那之前,请使用密度间隔检查我的答案:https://dev59.com/mW435IYBdhLWcg3w-1V_#64948456,如果我在间隔方法上有误,请大家纠正我。 - I.Step

5

从上面的答案中,我结合它们并创建了以下函数:

    public static String getDeviceDensity(Context context){
    String deviceDensity = "";
    switch (context.getResources().getDisplayMetrics().densityDpi) {
        case DisplayMetrics.DENSITY_LOW:
            deviceDensity =  0.75 + " ldpi";
            break;
        case DisplayMetrics.DENSITY_MEDIUM:
            deviceDensity =  1.0 + " mdpi";
            break;
        case DisplayMetrics.DENSITY_HIGH:
            deviceDensity =  1.5 + " hdpi";
            break;
        case DisplayMetrics.DENSITY_XHIGH:
            deviceDensity =  2.0 + " xhdpi";
            break;
        case DisplayMetrics.DENSITY_XXHIGH:
            deviceDensity =  3.0 + " xxhdpi";
            break;
        case DisplayMetrics.DENSITY_XXXHIGH:
            deviceDensity =  4.0 + " xxxhdpi";
            break;
        default:
            deviceDensity = "Not found";
    }
    return deviceDensity;
}

现在,如果您想获取设备的像素密度信息以及要使用的文件夹,请将上述方法添加到该活动中,并在onCreate中添加以下行。
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    Log.d("Screen Density: ", Helper.getDeviceDensity(this));

}

3

在检查断点值时,您应始终检查区间!

根据Android文档:https://developer.android.com/reference/android/util/DisplayMetrics

在Kotlin中检查的方法如下:

    when {
                val density: Float = context?.resources?.displayMetrics?.density

                // ldpi
                (density <= 0.75f) -> mulFactor = 0.75f

                // mdpi
                (density >= 0.75f && density <= 1.0f) -> mulFactor = 1.0f

                // hdpi
                (density > 1.0f && density <= 1.5f) -> mulFactor = 1.5f

                // xhdpi
                (density > 1.5f && density <= 2.0f) -> mulFactor = 2.0f

                // xxhdpi
                (density > 2.0f && density <= 3.0f) -> mulFactor = 3.0f

                // xxxhdpi
                (density > 3.0f) -> mulFactor = 4.0f

         }
         return mulFactor;

2

React Native可以检查设备当前的尺寸

原始答案: Original Answer

import { PixelRatio } from 'react-native';   
 switch(PixelRatio.get()) {
      case 1:
      return "mdpi";
      case 1.5:
      return "hdpi";
      case 2:
      return "xhdpi";
      case 3:
      return "xxhdpi";
      case 3.5:
      return "xxxhdpi";
    }


这个不可行。PixelRatio.get()会根据设置在Android系统中的显示大小和dpi,返回一系列值,这些值与您所设想的完全一致的数值不会重合。 - EnKrypt

1
在某些设备上(我的是 Galaxy Tab3),density 和 densityDpi 返回奇怪的值,比如 1.33(density)、213(densityDpi)。因此,我的解决方案是添加以下标志:

<item type="bool" name="is_mdpi">[bool]</item>
<item type="bool" name="is_hdpi">[bool]</item>
<item type="bool" name="is_xhdpi">[bool]</item>
<item type="bool" name="is_xxhdpi">[bool]</item>

将这些添加到 4 个 values.xml 文件中,并将其放置在相应的 res/values-[xxx]/ 文件夹下。


6
213dpi是一个众所周知的密度,而"tvdpi"则是指针对电视屏幕的特定密度选项。更多相关信息可参考http://developer.android.com/guide/practices/screens_support.html#qualifiers。 - Christopher Orr

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