Cách kiểm tra thiết bị Android là màn hình HDPI hay màn hình MDPI?


121

Tôi muốn kiểm tra điều này để tìm nạp các hình ảnh khác nhau qua internet. Làm thế nào để làm điều đó?

Câu trả lời:


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

9
Giá trị mật độ được mô tả tại: developer.android.com/guide/practices/screens_support.html
esilver

1
@SteD có thể cho biết thiết bị sẽ như thế nào không? Ví dụ: hãy xem xét trường hợp dpi là 140 ở giữa phạm vi xô? nó làm tròn xuống hay lên?
wal

tvdpi là khoảng 1,3
Ethan_AI

3
đối với nexus 6p tôi đang nhận được 3.5, nó sẽ thuộc loại nào?
Manohar Reddy

2
oneplus3T có 2.625, chúng ta nên xem xét điều đó trong cái gì?
Parth Anjaria,

188

Bạn có thể kiểm tra mật độ màn hình bằng:

switch (getResources().getDisplayMetrics().densityDpi) {
case DisplayMetrics.DENSITY_LOW:
    // ...
    break;
case DisplayMetrics.DENSITY_MEDIUM:
    // ...
    break;
case DisplayMetrics.DENSITY_HIGH:
    // ...
    break;
case DisplayMetrics.DENSITY_XHIGH:
    // ...
    break;
}

CHỈNH SỬA Hãy lưu ý rằng khi Android phát triển, các giá trị khác phải được bao gồm trong các switchtrường hợp. Khi chỉnh sửa này, điều này bao gồm DisplayMetrics.DENSITY_TVDisplayMetrics.DENSITY_XXHIGH. Tham khảo các tài liệu để biết thông tin mới nhất; Tôi sẽ không bận tâm đến việc duy trì câu trả lời này.


Nó phải tồn tại trong SDK cấp 4 (nền tảng 1.6) trở lên. Bạn đang sử dụng cấp SDK nào? (Trong SDK 3, bạn có thể sử dụng densitytheo đề xuất của SteD.)
Ted Hopp

Tôi cần nhắm mục tiêu nền tảng 1.5. Câu trả lời dưới đây có thể phù hợp với yêu cầu của tôi.
virsir

4
Câu trả lời dưới đây bây giờ là câu trả lời ở trên, cần phải chung chung hơn;)
Neil

FYI, với một số thiết bị mới (như Nexus 7), bạn cũng nên bao gồm DENSITY_TV.
annie

1
@annie - Điểm tốt. Cảm ơn. Kể từ API cấp 16, nó cũng phải bao gồm DENSITY_XXHIGH. Tôi đã thêm từ chối trách nhiệm vào câu trả lời để bao gồm tất cả các trường hợp trong tương lai. :)
Ted Hopp

10

Kể từ năm 2018, bạn có thể sử dụng phương pháp dưới đây:

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

Nhưng như @Ted đã chỉ ra, luôn luôn tham khảo tài liệu chính thức trước khi sử dụng


4

Từ các câu trả lời trên, tôi kết hợp chúng và tạo ra hàm dưới đây:

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

Bây giờ, trên thiết bị nào bạn muốn nhận thông tin mật độ và thư mục nào sẽ được sử dụng, chỉ cần thêm phương thức trên vào hoạt động đó và thêm dòng bên dưới trong onCreate

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

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

}

2

Đối với React Native để kiểm tra kích thước hiện tại của thiết bị

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


Điều này sẽ không hoạt động. PixelRatio.get()sẽ trả về một loạt các giá trị tùy thuộc vào kích thước hiển thị được đặt trong cài đặt Android và dpi. Các giá trị đó sẽ không trùng khớp với các giá trị chính xác mà bạn đã đánh phấn.
EnKrypt

0

Trên một số thiết bị (của tôi là Galaxy Tab3), cả mật độ và mật độDpi đều trả về các giá trị lạ như 1,33 (mật độ), 213 (mật độDpi). Vì vậy, giải pháp của tôi là thêm cờ sau:

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

đến 4 tệp giá trị.xml, hãy đặt các tệp này dưới thư mục res / giá trị- [xxx] / tương ứng.


6
213dpi là mật độ nổi tiếng, "tvdpi": developer.android.com/guide/practices/…
Christopher Orr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.