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?

virsir
la source

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
SteD
la source
9
Valeurs de densité décrites sur: developer.android.com/guide/practices/screens_support.html
esilver
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.

Ted Hopp
la source
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

Ankit Aggarwal
la source
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));

}
Naveed Ahmad
la source
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";
    }

Muhammad Umair Moosani
la source
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.

nlt
la source
6
213dpi est une densité bien connue, "tvdpi": developer.android.com/guide/practices/...
Christopher Orr