Come controllare che un dispositivo Android sia uno schermo HDPI o uno schermo MDPI?


121

Voglio controllare questo per recuperare immagini diverse da Internet. Come farlo?

Risposte:


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 è possibile dire quale sarà il dispositivo? ad esempio, considerare il caso in cui il dpi è 140 al centro dell'intervallo del secchio? arrotonda per difetto o per eccesso?
wal

tvdpi è di circa 1.3
Ethan_AI

3
per nexus 6p ottengo 3.5, in quale categoria rientrerà?
Manohar Reddy

2
oneplus3T ha 2.625, cosa dovremmo considerarlo?
Parth Anjaria

188

Puoi controllare la densità dello schermo 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;
}

EDIT Tieni presente che con l'evoluzione di Android, nei switchcasi dovrebbero essere inclusi altri valori . A partire da questa modifica, questo include DisplayMetrics.DENSITY_TVe DisplayMetrics.DENSITY_XXHIGH. Consulta i documenti per le ultime informazioni; Non mi prenderò la briga di mantenere questa risposta.


Dovrebbe esistere nell'SDK livello 4 (piattaforma 1.6) e versioni successive. Quale livello di SDK stai utilizzando? (In SDK 3, puoi usare densitycome suggerito da SteD.)
Ted Hopp

Devo scegliere come target platform1.5. La risposta di seguito potrebbe essere adatta alla mia richiesta.
virsir

4
La risposta qui sotto è ora la risposta sopra, deve essere più generica;)
Neil

Cordiali saluti, con alcuni nuovi dispositivi (come il Nexus 7), dovresti includere anche DENSITY_TV.
annie

1
@annie - Buon punto. Grazie. A partire dal livello API 16, dovrebbe includere anche DENSITY_XXHIGH. Ho aggiunto un disclaimer alla risposta per coprire tutti i casi futuri. :)
Ted Hopp

10

A partire dal 2018, puoi utilizzare il metodo seguente:

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

Ma come ha sottolineato @Ted, consultare sempre i documenti ufficiali prima dell'uso


4

Dalle risposte precedenti, le ho combinate e ho creato la funzione seguente:

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

Ora, su quale dispositivo desideri ottenere le informazioni sulla densità e quale cartella verrà utilizzata, aggiungi il metodo sopra in quell'attività e aggiungi la riga sottostante in onCreate

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

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

}

2

Per React Native per verificare quale dimensione è attualmente del 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";
    }


Questo non funzionerà. PixelRatio.get()restituirà un intervallo di valori a seconda delle dimensioni del display impostate nelle impostazioni di Android e del dpi. Questi valori non coincideranno con i valori esatti che hai individuato.
EnKrypt

0

Su alcuni dispositivi (il mio è Galaxy Tab3), sia la densità che la densitàDpi restituiscono valori strani come 1.33 (densità), 213 (densitàDpi). Quindi la mia soluzione è aggiungere questi flag:

<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 file values.xml, inserirli nelle cartelle res / values- [xxx] / corrispondenti.


6
213 dpi è una densità ben nota, "tvdpi": developer.android.com/guide/practices/…
Christopher Orr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.