Bagaimana cara memeriksa perangkat Android apakah layar HDPI atau layar MDPI?


121

Saya ingin memeriksa ini untuk mengambil gambar yang berbeda melalui internet. Bagaimana cara melakukannya?

Jawaban:


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 apakah mungkin untuk mengetahui perangkat apa yang akan digunakan? Misalnya, pertimbangkan kasus di mana dpi adalah 140 di tengah kisaran bucket? apakah itu membulatkan ke bawah atau ke atas?
— wal

tvdpi sekitar 1,3
— Ethan_AI

3
untuk nexus 6p saya mendapatkan 3.5, kategori apa itu akan termasuk?
— Manohar Reddy

2
oneplus3T memiliki 2.625, apa yang harus kita pertimbangkan?
— Parth Anjaria

188

Anda dapat memeriksa kepadatan layar dengan:

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 Ketahuilah bahwa saat Android berkembang, nilai lain harus disertakan dalam switchkasus tersebut. Pada hasil edit ini, ini termasuk DisplayMetrics.DENSITY_TVdan DisplayMetrics.DENSITY_XXHIGH. Konsultasikan dokumen untuk info terbaru; Saya tidak akan repot-repot mempertahankan jawaban ini.


Ini seharusnya ada di SDK level 4 (platform 1.6) dan lebih tinggi. Tingkat SDK apa yang Anda gunakan? (Di SDK 3, Anda dapat menggunakan densityseperti yang disarankan oleh SteD.)
— Ted Hopp

Saya perlu menargetkan platform1.5. Jawaban di bawah ini mungkin cocok untuk permintaan saya.
— virsir

4
Jawaban di bawah sekarang adalah jawaban di atas, perlu lebih umum;)
— Neil

FYI, dengan beberapa perangkat baru (seperti Nexus 7), Anda juga harus menyertakan DENSITY_TV.
— annie

1
@annie - Poin yang bagus. Terima kasih. Pada API level 16, itu juga harus disertakan DENSITY_XXHIGH. Saya menambahkan penafian pada jawaban untuk mencakup semua kasus di masa mendatang. :)
— Ted Hopp

10

Mulai 2018, Anda dapat menggunakan metode di bawah ini -

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

Tetapi seperti yang ditunjukkan @Ted, selalu berkonsultasi dengan dokumen resmi sebelum menggunakan


4

Dari jawaban di atas, saya menggabungkannya dan membuat fungsi di bawah ini:

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

Sekarang, di perangkat mana Anda ingin mendapatkan informasi kepadatan dan folder mana yang akan digunakan, cukup tambahkan metode di atas dalam aktivitas itu dan tambahkan baris di bawah ini di onCreate

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

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

}

2

Untuk React Native untuk memeriksa ukuran perangkat mana yang saat ini digunakan

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


Ini tidak akan berhasil. PixelRatio.get()akan mengembalikan berbagai nilai tergantung pada ukuran tampilan yang disetel dalam pengaturan Android, dan dpi. Nilai-nilai itu tidak akan sesuai dengan nilai-nilai pasti yang telah Anda tuliskan.
— EnKrypt

0

Pada beberapa perangkat (milik saya adalah Galaxy Tab3), baik densitas dan densitasDpi mengembalikan nilai aneh seperti 1,33 (densitas), 213 (densitasDpi). Jadi solusi saya adalah menambahkan tanda ini:

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

ke 4 file values.xml, letakkan ini di bawah folder res / values- [xxx] / yang sesuai.


6
213dpi adalah kepadatan yang terkenal, "tvdpi": developer.android.com/guide/practices/…
— Christopher Orr
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.