Comment vérifier qu'un appareil Android est un écran HDPI ou un écran MDPI?


121

Je veux vérifier ceci pour récupérer différentes images par Internet. Comment faire ça?

Réponses:


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 est-il possible de dire ce que sera un appareil? Par exemple, considérez le cas où le dpi est de 140 au milieu de la plage de seau? Arrondit-il vers le bas ou vers le haut?
wal

tvdpi est d'environ 1,3
Ethan_AI

3
pour le Nexus 6p j'obtiens 3,5, dans quelle catégorie appartiendra-t-il?
Manohar Reddy

2
oneplus3T a 2.625, dans quoi devrions-nous considérer cela?
Parth Anjaria

188

Vous pouvez vérifier la densité de l'écran avec:

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 Sachez qu'au fur et à mesure qu'Android évolue, d'autres valeurs doivent être incluses dans les switchcas. À partir de cette modification, cela inclut DisplayMetrics.DENSITY_TVet DisplayMetrics.DENSITY_XXHIGH. Consultez la documentation pour les dernières informations; Je ne vais pas prendre la peine de maintenir cette réponse.


Il est censé exister au niveau du SDK 4 (plate-forme 1.6) et plus. Quel niveau de SDK utilisez-vous? (Dans le SDK 3, vous pouvez utiliser densitycomme suggéré par SteD.)
Ted Hopp

J'ai besoin de cibler platform1.5. La réponse ci-dessous convient peut-être à ma demande.
virsir

4
La réponse ci-dessous est maintenant la réponse ci-dessus, il faut être plus générique;)
Neil

Pour info, avec certains nouveaux appareils (comme le Nexus 7), vous devriez également inclure DENSITY_TV.
annie

1
@annie - Bon point. Merci. À partir du niveau d'API 16, il devrait également inclure DENSITY_XXHIGH. J'ai ajouté un avertissement à la réponse pour couvrir tous les cas futurs. :)
Ted Hopp

10

À partir de 2018, vous pouvez utiliser la méthode ci-dessous -

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

Mais comme @Ted l'a souligné, consultez toujours la documentation officielle avant d'utiliser


4

À partir des réponses ci-dessus, je les ai combinées et créé la fonction ci-dessous:

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

Maintenant, sur quel appareil vous souhaitez obtenir les informations de densité et dans quel dossier elles seront utilisées, ajoutez simplement la méthode ci-dessus dans cette activité et ajoutez la ligne ci-dessous dans onCreate

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

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

}

2

Pour que React Native vérifie la taille actuelle de l'appareil

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


Cela ne fonctionnera pas. PixelRatio.get()renverra une plage de valeurs en fonction de la taille d'affichage définie dans les paramètres Android et du dpi. Ces valeurs ne coïncideront pas avec les valeurs exactes que vous avez indiquées.
EnKrypt

0

Sur certains appareils (le mien est le Galaxy Tab3), la densité et la densitéDpi renvoient des valeurs étranges comme 1,33 (densité), 213 (densitéDpi). Ma solution est donc d'ajouter ces indicateurs:

<item type = "bool" name = "is_mdpi"> [booléen] </item>
<item type = "bool" name = "is_hdpi"> [bool] </item>
<item type = "bool" name = " is_xhdpi "> [booléen] </item>
<item type =" bool "name =" is_xxhdpi "> [booléen] </item>

à 4 fichiers values.xml, placez-les dans les dossiers res / values- [xxx] / correspondants.


6
213dpi est une densité bien connue, "tvdpi": developer.android.com/guide/practices/...
Christopher Orr
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.