Jak sprawdzić, czy urządzenie z Androidem to ekran HDPI czy ekran MDPI?


121

Chcę to sprawdzić, aby pobierać różne obrazy przez Internet. Jak to zrobić?

Odpowiedzi:


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


1
@SteD czy można powiedzieć, jakie będzie urządzenie? np. rozważ przypadek, w którym dpi wynosi 140 w środku zakresu łyżki? czy to zaokrągla w dół czy w górę?
wal,

tvdpi to około 1.3
Ethan_AI

3
w przypadku Nexusa 6p otrzymam 3.5, do jakiej kategorii będzie należał?
Manohar Reddy

2
oneplus3T ma 2,625, w czym powinniśmy wziąć to pod uwagę?
Parth Anjaria

188

Możesz sprawdzić gęstość ekranu za pomocą:

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

EDYCJA Należy pamiętać, że wraz z rozwojem systemu Android w switchprzypadkach należy uwzględnić inne wartości . Od tej edycji obejmuje to DisplayMetrics.DENSITY_TVi DisplayMetrics.DENSITY_XXHIGH. Aby uzyskać najnowsze informacje, zapoznaj się z dokumentacją ; Nie mam zamiaru utrzymywać tej odpowiedzi.


Powinien istnieć w SDK na poziomie 4 (platforma 1.6) i nowszych. Z jakiego poziomu SDK korzystasz? (W SDK 3 możesz użyć densityzgodnie z sugestią SteD.)
Ted Hopp,

Muszę wybrać platformę 1.5. Poniższa odpowiedź może pasować do mojej prośby.
virsir

4
Poniższa odpowiedź jest teraz powyższą odpowiedzią, musi być bardziej ogólna;)
Neil

FYI, w przypadku niektórych nowych urządzeń (takich jak Nexus 7) należy również dołączyć DENSITY_TV.
annie

1
@annie - Słuszna uwaga. Dzięki. Od poziomu API 16 powinien również zawierać DENSITY_XXHIGH. Dodałem zastrzeżenie do odpowiedzi, aby uwzględnić wszystkie przyszłe przypadki. :)
Ted Hopp

10

Od 2018 roku możesz użyć poniższej metody -

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

Ale jak wskazał @Ted, zawsze zapoznaj się z oficjalną dokumentacją przed użyciem


4

Z powyższych odpowiedzi połączyłem je i stworzyłem poniższą funkcję:

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

Teraz, na którym urządzeniu chcesz uzyskać informacje o gęstości i który folder będzie używany, po prostu dodaj powyższą metodę w tym działaniu i dodaj poniższy wiersz w onCreate

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

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

}

2

Aby React Native sprawdził, jaki jest aktualnie rozmiar urządzenia

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


To nie zadziała. PixelRatio.get()zwróci zakres wartości w zależności od rozmiaru ekranu ustawionego w ustawieniach systemu Android oraz rozdzielczości dpi. Te wartości nie będą pokrywać się z dokładnymi wartościami, które wyznaczyłeś.
EnKrypt

0

Na niektórych urządzeniach (moim jest Galaxy Tab3), zarówno gęstość, jak i densityDpi zwracają dziwne wartości, takie jak 1,33 (gęstość), 213 (densityDpi). Więc moim rozwiązaniem jest dodanie tej flagi:

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

do 4 plików values.xml, umieść je w odpowiednich folderach res / values- [xxx] /.


6
213dpi to dobrze znana gęstość, „tvdpi”: developer.android.com/guide/practices/…
Christopher Orr
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.