¿Cómo verificar que un dispositivo Android tenga pantalla HDPI o pantalla MDPI?

121

Quiero verificar esto para obtener diferentes imágenes por internet. ¿Como hacer eso?

virsir
fuente

Respuestas:

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
fuente
9
Valores de densidad descritos en: developer.android.com/guide/practices/screens_support.html
esilver
1
@SteD ¿es posible saber qué va a ser un dispositivo? por ejemplo, considere el caso donde el dpi es 140 en el medio del rango del cubo? ¿se redondea hacia abajo o hacia arriba?
wal
tvdpi es aproximadamente 1.3
Ethan_AI
3
para nexus 6p obtengo 3.5, ¿en qué categoría caerá?
Manohar Reddy
2
oneplus3T tiene 2.625, ¿en qué deberíamos considerar eso?
Parth Anjaria
188

Puede verificar la densidad de la pantalla con:

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

EDITAR Tenga en cuenta que a medida que Android evoluciona, se deben incluir otros valores en los switchcasos. A partir de esta edición, esto incluye DisplayMetrics.DENSITY_TVy DisplayMetrics.DENSITY_XXHIGH. Consulte los documentos para obtener la información más reciente; No me voy a molestar en mantener esta respuesta.

Ted Hopp
fuente
Se supone que existe en SDK nivel 4 (plataforma 1.6) y superior. ¿Qué nivel de SDK estás usando? (En SDK 3, puede usar densitycomo lo sugiere SteD.)
Ted Hopp
Necesito apuntar a la plataforma 1.5. La respuesta a continuación puede ser adecuada para mi solicitud.
virsir
44
La respuesta a continuación es ahora la respuesta anterior, debe ser más genérica;)
Neil
Para su información, con algunos dispositivos nuevos (como el Nexus 7), también debe incluir DENSITY_TV.
Annie
1
@annie - Buen punto. Gracias. A partir del nivel 16 de API, también debe incluir DENSITY_XXHIGH. Agregué un descargo de responsabilidad a la respuesta para cubrir todos los casos futuros. :)
Ted Hopp
10

A partir de 2018, puede usar el siguiente método:

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

Pero como señaló @Ted, siempre consulte los documentos oficiales antes de usar

Ankit Aggarwal
fuente
4

De las respuestas anteriores, las combiné y creé la siguiente función:

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

Ahora, en qué dispositivo desea obtener la información de densidad y en qué carpeta se utilizará, simplemente agregue el método anterior en esa actividad y agregue la línea siguiente en onCreate

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

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

}
Naveed Ahmad
fuente
2

Para que React Native verifique qué tamaño es actualmente el dispositivo

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
fuente
Esto no funcionará. PixelRatio.get()devolverá un rango de valores dependiendo del tamaño de pantalla establecido en la configuración de Android y el dpi. Esos valores no coincidirán con los valores exactos que ha marcado.
EnKrypt
0

En algunos dispositivos (el mío es Galaxy Tab3), tanto densidad como densidadDpi devuelven valores extraños como 1.33 (densidad), 213 (densidadDpi). Entonces mi solución es agregar estas banderas:

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

a 4 archivos values.xml, colóquelos en res / values- [xxx] / carpetas correspondientes.

nlt
fuente
66
213 ppp es una densidad conocida, "tvdpi": developer.android.com/guide/practices/…
Christopher Orr