How to check an Android device is HDPI screen or MDPI screen?

AndroidSizeScreen

Android Problem Overview


I want to check this to fetch different images by internet. How to do that?

Android Solutions


Solution 1 - Android

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

Solution 2 - Android

You can check the screen density with:

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

EDIT Be aware that as Android evolves, other values should be included in the switch cases. As of this edit, this includes DisplayMetrics.DENSITY_TV and DisplayMetrics.DENSITY_XXHIGH. Consult the docs for the latest info; I'm not going to bother maintaining this answer.

Solution 3 - Android

As of 2018, you can use the below method -

    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";
    }
}

But as @Ted pointed always consult the official docs before using

Solution 4 - Android

From the above answers, I combined them and created the below function:

    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;
}

Now, on which device you want to get the density information and which folder it will be used, just add the above method in that activity and add the below line in onCreate

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

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

}

Solution 5 - Android

For React Native to check which size is currently of device

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";
    }

Solution 6 - Android

On some devices (mine is Galaxy Tab3), both density and densityDpi return strange values like 1.33(density), 213(densityDpi). So my solution is to add these flag :

> <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>

to 4 values.xml files, put these under corresponding res/values-[xxx]/ folders.

Solution 7 - Android

You should always check the interval not only break point values!

According to android documentation: https://developer.android.com/reference/android/util/DisplayMetrics

Check it like this in 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;

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionvirsirView Question on Stackoverflow
Solution 1 - AndroidSteDView Answer on Stackoverflow
Solution 2 - AndroidTed HoppView Answer on Stackoverflow
Solution 3 - AndroidAnkit AggarwalView Answer on Stackoverflow
Solution 4 - AndroidNaveed AhmadView Answer on Stackoverflow
Solution 5 - AndroidMuhammad Umair MoosaniView Answer on Stackoverflow
Solution 6 - AndroidnltView Answer on Stackoverflow
Solution 7 - AndroidI.StepView Answer on Stackoverflow