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.