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?

virsir
sumber

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
SteD
sumber
9
Nilai kepadatan dijelaskan di: developer.android.com/guide/practices/screens_support.html
esilver
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.

Ted Hopp
sumber
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

Ankit Aggarwal
sumber
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));

}
Naveed Ahmad
sumber
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";
    }

Muhammad Umair Moosani
sumber
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.

nlt
sumber
6
213dpi adalah kepadatan yang terkenal, "tvdpi": developer.android.com/guide/practices/…
Christopher Orr