Как проверить, есть ли на устройстве Android экран HDPI или экран MDPI?


121

Я хочу проверить это, чтобы получать разные изображения через Интернет. Как это сделать?

Ответы:


221
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
Значения плотности описаны на сайте developer.android.com/guide/practices/screens_support.html
esilver

1
@SteD можно ли сказать, что будет за устройство? например, рассмотрим случай, когда dpi составляет 140 в середине диапазона сегмента? оно округляется в большую или меньшую сторону?
wal

tvdpi составляет около 1,3
Ethan_AI 05

3
для nexus 6p я получаю 3.5, в какую категорию он попадет?
Manohar Reddy

2
oneplus3T имеет 2.625, в чем мы должны это учитывать?
Parth Anjaria

188

Вы можете проверить плотность экрана с помощью:

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_TVи DisplayMetrics.DENSITY_XXHIGH. За последней информацией обращайтесь к документации ; Я не собираюсь утруждать себя этим ответом.


Он должен существовать в SDK уровня 4 (платформа 1.6) и выше. Какой уровень SDK вы используете? (В SDK 3 вы можете использовать, densityкак предлагает SteD.)
Тед Хопп,

Мне нужна целевая платформа 1.5. Приведенный ниже ответ может соответствовать моему запросу.
virsir

4
Приведенный ниже ответ теперь является приведенным выше ответом, он должен быть более общим;)
Нил

К вашему сведению, с некоторыми новыми устройствами (например, Nexus 7) вы также должны включить DENSITY_TV.
annie

1
@annie - Хорошее замечание. Спасибо. Начиная с уровня API 16, он также должен включать DENSITY_XXHIGH. Я добавил к ответу отказ от ответственности, чтобы охватить все будущие случаи. :)
Тед Хопп

10

По состоянию на 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, всегда консультируйтесь с официальными документами перед использованием


4

Из приведенных выше ответов я объединил их и создал следующую функцию:

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

}

2

Чтобы React Native мог проверить текущий размер устройства.

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

0

На некоторых устройствах (у меня Galaxy Tab3) и density, и densityDpi возвращают странные значения, такие как 1,33 (плотность), 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": developer.android.com/guide/practices/…
Кристофер Орр,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.