Como verificar se um dispositivo Android é tela HDPI ou tela MDPI?

121

Quero verificar isso para buscar imagens diferentes pela Internet. Como fazer isso?

virsir
fonte

Respostas:

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
fonte
9
Valores de densidade descritos em: developer.android.com/guide/practices/screens_support.html
esilver
1
@SteD é possível dizer o que será um dispositivo? por exemplo, considere o caso em que o dpi está 140 no meio da faixa do balde? é arredondado para baixo ou para cima?
29516 wal
tvdpi é sobre 1,3
Ethan_AI 5/16
3
para o nexus 6p, estou obtendo 3,5. Em qual categoria ele se enquadra?
Manohar Reddy
2
O oneplus3T possui 2.625, em que devemos considerar isso?
precisa saber é o seguinte
188

Você pode verificar a densidade da tela com:

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 Saiba que, à medida que o Android evolui, outros valores devem ser incluídos nos switchcasos. A partir desta edição, isso inclui DisplayMetrics.DENSITY_TVe DisplayMetrics.DENSITY_XXHIGH. Consulte os documentos para obter as informações mais recentes; Não vou me incomodar em manter esta resposta.

Ted Hopp
fonte
Ele deveria existir no SDK nível 4 (plataforma 1.6) e superior. Qual nível do SDK você está usando? (Em SDK 3, você pode usar densitycomo sugerido por sted.)
Ted Hopp
Preciso direcionar a plataforma1.5. A resposta abaixo pode ser adequada ao meu pedido.
24411 virsir
4
A resposta abaixo é agora a resposta acima, necessidade de ser mais genérico;)
Neil
Para sua informação, com alguns dispositivos novos (como o Nexus 7), você também deve incluir DENSITY_TV.
22912 Annie
1
@annie - Bom ponto. Obrigado. No nível 16 da API, ele também deve incluir DENSITY_XXHIGH. Eu adicionei um aviso à resposta para cobrir todos os casos futuros. :)
Ted Hopp
10

A partir de 2018, você pode usar o método abaixo -

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

Mas como o @Ted apontou, consulte sempre os documentos oficiais antes de usar

Ankit Aggarwal
fonte
4

A partir das respostas acima, eu as combinei e criei a função abaixo:

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

Agora, em qual dispositivo você deseja obter as informações de densidade e qual pasta será usada, basta adicionar o método acima nessa atividade e adicionar a linha abaixo em onCreate

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

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

}
Namaded Ahmad
fonte
2

Para o React Native verificar qual o tamanho atualmente do 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
fonte
Isso não vai funcionar. PixelRatio.get()retornará um intervalo de valores, dependendo do tamanho da exibição definido nas configurações do Android e do dpi. Esses valores não coincidirão com os valores exatos que você definiu.
EnKrypt 17/08/19
0

Em alguns dispositivos (o meu é o Galaxy Tab3), a densidade e a densidadeDpi retornam valores estranhos como 1,33 (densidade), 213 (densidadeDpi). Então, minha solução é adicionar estes sinalizadores:

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

para 4 arquivos values.xml, coloque-os em res / values- [xxx] / folders correspondentes.

nlt
fonte
6
213dpi é uma densidade bem conhecido, "tvdpi": developer.android.com/guide/practices/...
Christopher Orr