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.