Wie überprüfe ich, ob ein Android-Gerät ein HDPI-Bildschirm oder ein MDPI-Bildschirm ist?

121

Ich möchte dies überprüfen, um verschiedene Bilder über das Internet abzurufen. Wie geht das?

virsir
quelle

Antworten:

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
SteD
quelle
8
Dichtewerte beschrieben unter: developer.android.com/guide/practices/screens_support.html
esilver
1
@SteD ist es möglich zu sagen, was ein Gerät sein wird? Betrachten Sie z. B. den Fall, dass der dpi 140 in der Mitte des Bucket-Bereichs liegt? rundet es ab oder auf?
Wal
tvdpi ist ungefähr 1.3
Ethan_AI
3
für nexus 6p bekomme ich 3.5, in welche kategorie fällt es?
Manohar Reddy
2
oneplus3T hat 2.625, woran sollten wir das denken?
Parth Anjaria
188

Sie können die Bildschirmdichte überprüfen mit:

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

BEARBEITEN Beachten Sie, dass im Zuge der Weiterentwicklung von Android andere Werte in die switchFälle aufgenommen werden sollten. Ab dieser Bearbeitung umfasst dies DisplayMetrics.DENSITY_TVund DisplayMetrics.DENSITY_XXHIGH. Konsultieren Sie die Dokumente für die neuesten Informationen; Ich werde mich nicht darum kümmern, diese Antwort beizubehalten.

Ted Hopp
quelle
Es soll in SDK Level 4 (Plattform 1.6) und höher existieren. Welche SDK-Ebene verwenden Sie? (In SDK 3 können Sie verwenden, densitywie von SteD vorgeschlagen.)
Ted Hopp
Ich muss auf Plattform1.5 zielen. Die folgende Antwort passt möglicherweise zu meiner Anfrage.
Virsir
4
Die folgende Antwort ist jetzt die obige Antwort, muss allgemeiner sein;)
Neil
Zu Ihrer Information, mit einigen neuen Geräten (wie dem Nexus 7) sollten Sie auch DENSITY_TV einschließen.
Annie
1
@annie - Guter Punkt. Vielen Dank. Ab API-Level 16 sollte es auch enthalten DENSITY_XXHIGH. Ich habe der Antwort einen Haftungsausschluss hinzugefügt, um alle zukünftigen Fälle abzudecken. :)
Ted Hopp
10

Ab 2018 können Sie die folgende Methode verwenden:

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

Aber wie @Ted zeigte, konsultieren Sie immer die offiziellen Dokumente, bevor Sie verwenden

Ankit Aggarwal
quelle
4

Aus den obigen Antworten habe ich sie kombiniert und die folgende Funktion erstellt:

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

Fügen Sie nun auf welchem ​​Gerät, auf dem Sie die Dichteinformationen abrufen möchten und in welchem ​​Ordner sie verwendet werden sollen, die obige Methode in diese Aktivität ein und fügen Sie die folgende Zeile in onCreate hinzu

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

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

}
Naveed Ahmad
quelle
2

Damit React Native überprüfen kann, welche Größe derzeit vom Gerät stammt

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

Muhammad Umair Moosani
quelle
Dies wird nicht funktionieren. PixelRatio.get()Gibt abhängig von der in den Android-Einstellungen festgelegten Anzeigegröße und der Auflösung eine Reihe von Werten zurück. Diese Werte stimmen nicht mit den genauen Werten überein, die Sie festgelegt haben.
EnKrypt
0

Auf einigen Geräten (meins ist Galaxy Tab3) geben sowohl Dichte als auch DichteDpi seltsame Werte wie 1,33 (Dichte), 213 (DichteDpi) zurück. Meine Lösung besteht also darin, dieses Flag hinzuzufügen:

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

Fügen Sie diese in 4 values.xml-Dateien unter den entsprechenden Ordnern res / values- [xxx] / ein.

nlt
quelle
6
213dpi ist eine bekannte Dichte, "tvdpi": developer.android.com/guide/practices/…
Christopher Orr