Як перевірити на пристрої 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 посередині діапазону ковша? вона округляється вниз чи вгору?
пройдіть

tvdpi - близько 1,3
Ethan_AI

3
для Nexus 6p я отримую 3,5, до якої категорії він потрапить?
Манохар Редді

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
Нижче відповідь - це вищезазначена відповідь, потрібно бути більш загальним;)
Ніл

FYI, з деякими новими пристроями (наприклад, Nexus 7) слід також включити DENSITY_TV.
Анні

1
@annie - Гарний момент. Дякую. Щодо рівня 16 API, він також повинен включати 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) і щільність, і щільністьDpi повертають дивні значення, такі як 1,33 (щільність), 213 (щільністьDpi). Тому моє рішення - додати цей прапор:

<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 значень.xml-файлів, покладіть їх під відповідні папки res / values- [xxx] /.


6
213dpi - добре відома щільність, "tvdpi": developer.android.com/guide/practices/…
Крістофер Орр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.