Lấy mật độ màn hình theo chương trình trong Android?


516

Làm thế nào để có được mật độ màn hình lập trình trong Android?

Ý tôi là: Làm thế nào để tìm dpi màn hình của thiết bị hiện tại?


9
Nhiều câu trả lời đề cập đến getDisplayMetrics().xdpi, được cho là trả về dpi thực của thiết bị. Xin lưu ý rằng giá trị này không được các nhà sản xuất đặt chính xác trên các thiết bị , do đó bạn không thể sử dụng chúng . Đáng buồn nhưng có thật: thông tin về dpi thực không có sẵn . Nguồn: Groups.google.com/d/msg/android-developers/g56jV0Hora0/ith
sulai

2
getResources().getDisplayMetrics().xdpigetResources().getDisplayMetrics().ydpisẽ cung cấp cho bạn mật độ ngang và dọc thực tế , trong hầu hết các trường hợp khác nhau.
Ωmega

Câu trả lời:


526

Bạn có thể nhận thông tin trên màn hình từ cấu trúc DisplayMetrics :

DisplayMetrics metrics = getResources().getDisplayMetrics();

Mặc dù Android không sử dụng ánh xạ pixel trực tiếp, nhưng nó sử dụng một số giá trị Pixel Mật độ được lượng tử hóa sau đó chia tỷ lệ thành kích thước màn hình thực tế. Vì vậy, metrics.densityDpibất động sản sẽ là một trong những DENSITY_xxxhằng số ( 120, 160, 213, 240, 320, 480hoặc 640dpi).

Nếu bạn cần mật độ pixel LCD thực tế (có lẽ đối với ứng dụng OpenGL), bạn có thể lấy nó từ metrics.xdpimetrics.ydpicác thuộc tính cho mật độ ngang và dọc tương ứng.

Nếu bạn đang nhắm mục tiêu Cấp API sớm hơn 4. metrics.densityThuộc tính là hệ số tỷ lệ dấu phẩy động từ mật độ tham chiếu (160dpi). Giá trị tương tự được cung cấp bởi metrics.densityDpicó thể được tính toán

int densityDpi = (int)(metrics.density * 160f);

42
Cấp bài đăng này là từ hơn hai năm trước, nhưng đây là điều đầu tiên xuất hiện trên Google cho tìm kiếm này, vì vậy, đối với bất kỳ ai tìm thấy điều này, bạn không còn phải nhân lên 160.
roboguy12

5
Không còn kể từ phiên bản nào?
TacB0sS

Tôi đã cập nhật câu trả lời để phù hợp với các phiên bản API mới nhất mà mọi người có thể đang sử dụng.
joshperry

6
Lưu ý: Thay vào đó, bạn có thể muốn API mới hơn này: getWindowManager().getDefaultDisplay().getRealMetrics(metrics); Điều này đã được thêm chính thức vào API 17, nhưng tôi đã ngạc nhiên khi thấy nó hoạt động chính xác ngay cả trên thiết bị 4.0 mà tôi đã thử.
benkc

2
cũng có getResource (). getDisplayMetrics (). Mật độDpi
amorenew

367

Điều này cũng hoạt động:

 getResources().getDisplayMetrics().density;

Điều này sẽ cung cấp cho bạn:

0,75 - ldpi

1,0 - mdpi

1,5 - hdpi

2.0 - xhdpi

3.0 - xxhdpi

4.0 - xxxhdpi

nhập mô tả hình ảnh ở đây

ref: mật độ

nhập mô tả hình ảnh ở đây

tham chiếu 2


10
+1 Điều này hoạt động khi bạn không có quyền truy cập trực tiếp vào WindowManager(ví dụ: bên trong Trình tải). Chỉ cần nhân nó với 160
Michał K

2
API cấp 16 đã thêm xxdpi, dịch ở đây thành 3.0.
QED

3
cái này sẽ cho 1.3312501 cho tvdpi. Để biết thêm thông tin về tvdpixem tại đây
Dori

2
Nexus 7 báo cáo 1.3, tại sao khung nên đi vào?
Neil

1
@selbie, điện thoại của bạn có thể đang kéo và nhân rộng các tài nguyên chất lượng cao hơn vì điện thoại của bạn đang báo cáo một nửa giữa hai mật độ được xác định.
Sakiboy

145
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

switch(metrics.densityDpi) {
     case DisplayMetrics.DENSITY_LOW:
         break;

     case DisplayMetrics.DENSITY_MEDIUM:
         break;

     case DisplayMetrics.DENSITY_HIGH:
         break;
}

Điều này sẽ hoạt động trên API cấp 4 trở lên.


Làm thế nào bạn có thể trao các thiết bị như Nexus 7 báo cáo mật độDpi là 213?
Neil

kiểm tra tay if-
other

1
HOẶC if (metrics.d mậtDpi <DisplayMetrics.DENSITY_LOW) {} khác if (metrics.d mậtDpi <DisplayMetrics. DENSITY_MEDIUM) {} .....
Mitul Nakum

1
Neil, 213 được gọi là DPI TV, có mật độ số liệu hiển thị được đặt tên cho DENSITY_TV đó.
Andrew S

63

Câu trả lời của Blundell như một phương thức trợ giúp tĩnh:

private static String getDensityName(Context context) {
    float density = context.getResources().getDisplayMetrics().density;
    if (density >= 4.0) {
        return "xxxhdpi";
    }
    if (density >= 3.0) {
        return "xxhdpi";
    }
    if (density >= 2.0) {
        return "xhdpi";
    }
    if (density >= 1.5) {
        return "hdpi";
    }
    if (density >= 1.0) {
        return "mdpi";
    }
    return "ldpi";
}

những gì về mật độ tvdpi. Tôi đoán đó là 1.33
Anoop

@AnoopssGolden Nó không thực sự chuẩn, vì vậy bạn có thể thêm nó nếu bạn muốn, nhưng tôi không nghĩ câu trả lời nên bao gồm nó. Từ các tài liệu Android: "Đây không được coi là nhóm mật độ" chính ". Nó chủ yếu dành cho TV và hầu hết các ứng dụng không cần đến nó".
qwertzguy

Nhưng thiết bị nexus 7 thuộc nhóm mật độ tvdpi.
Anoop

1
Tôi biết điều này là một chút cũ nhưng chỉ để thêm; MDPI có thể hoạt động với hầu hết mọi thứ trên Nexus 7 nhưng như tôi hiện đang thử, hình ảnh xuất hiện dưới dạng MDPI không đủ lớn. Tôi phải xác định TVDPI và sau đó yêu cầu kích thước hình ảnh lớn hơn từ máy chủ của mình. Nó có thể không được sử dụng nhiều nhưng điều đó không có nghĩa là MDPI sẽ chọn mọi thứ.
RED_

3
Xin chào @Andrew S, sử dụng elses không thay đổi bất cứ điều gì đối với hiệu quả của mã vì mỗi khi trả về ngay lập tức. Xóa niềng răng chỉ là một câu hỏi về kiểu dáng và IMHO làm cho nó dễ bị lỗi hơn khi duy trì mã.
qwertzguy

45

Thử cái này:

DisplayMetrics dm = context.getResources().getDisplayMetrics();
int densityDpi = dm.densityDpi;

5
Tôi thích điều này tốt hơn nhiều vì nó dựa vào bối cảnh hơn là hoạt động.
greg7gkb

Đồng ý, tôi có thể sử dụng nó từ một Viewcách dễ dàng hơn nhiều (đó là nơi tôi cần nó!)
Andrew Wyld

37

Để có được dpi:

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);

// will either be DENSITY_LOW, DENSITY_MEDIUM or DENSITY_HIGH
int dpiClassification = dm.densityDpi;

// these will return the actual dpi horizontally and vertically
float xDpi = dm.xdpi;
float yDpi = dm.ydpi;

4
dm.d mậtDpi trả về DENSITY_LOW hoặc DENSITY_MEDIUM hoặc DENSITY_HIGH. Còn xhdpi thì sao? Có DENSITY_XHIGH nào không?
Eugene Chumak


34

Dưới đây là các hằng số mật độ, nguồn :

nhập mô tả hình ảnh ở đây

Ngoài ra, ngoài mật độ tiêu chuẩn, còn có 5 mật độ trung gian. Có tính đến thực tế này, mã sau đây sẽ là một ví dụ hoạt động hoàn chỉnh:

float density = getResources().getDisplayMetrics().density;

if (density == 0.75f)
{
    // LDPI
}
else if (density >= 1.0f && density < 1.5f)
{
    // MDPI
}
else if (density == 1.5f)
{
    // HDPI
}
else if (density > 1.5f && density <= 2.0f)
{
    // XHDPI
}
else if (density > 2.0f && density <= 3.0f)
{
    // XXHDPI
}
else
{
    // XXXHDPI 
}

Ngoài ra, bạn có thể tìm thấy hằng số mật độ bằng cách sử dụng densityDpi:

int densityDpi = getResources().getDisplayMetrics().densityDpi;

switch (densityDpi)
{
    case DisplayMetrics.DENSITY_LOW:
        // LDPI
        break;

    case DisplayMetrics.DENSITY_MEDIUM:
        // MDPI
        break;

    case DisplayMetrics.DENSITY_TV:
    case DisplayMetrics.DENSITY_HIGH:
        // HDPI
        break;

    case DisplayMetrics.DENSITY_XHIGH:
    case DisplayMetrics.DENSITY_280:
        // XHDPI
        break;

    case DisplayMetrics.DENSITY_XXHIGH:
    case DisplayMetrics.DENSITY_360:
    case DisplayMetrics.DENSITY_400:
    case DisplayMetrics.DENSITY_420:
        // XXHDPI
        break;

    case DisplayMetrics.DENSITY_XXXHIGH:
    case DisplayMetrics.DENSITY_560:
        // XXXHDPI
        break;
}

29

Câu trả lời sau đây là một cải tiến nhỏ dựa trên câu trả lời của qwertzguy.

double density = getResources().getDisplayMetrics().density;
if (density >= 4.0) {
   //"xxxhdpi";
}
else if (density >= 3.0 && density < 4.0) {
   //xxhdpi
}
else if (density >= 2.0) {
   //xhdpi
}
else if (density >= 1.5 && density < 2.0) {
   //hdpi
}
else if (density >= 1.0 && density < 1.5) {
   //mdpi
}

1
Mã này có thể làm với một số elses, và ký hiệu và điều kiện sau khi nó là dự phòng.
Andrew S

1
@Andrew, cảm ơn đã sửa. Tôi đã chỉnh sửa câu trả lời cho phù hợp.
San

2
@San Bạn không cần && trong bất kỳ điều kiện nào, miễn là bạn luôn kiểm tra> = cái khác nếu sẽ chấm dứt điều kiện đầu tiên là đúng.
dbenson

3
Điều này không trả lại kết quả chính xác cho tôi với Nexus 5X của tôi (một thiết bị google mặc định btw). Mật độ thiết bị là xxhdpi và mật độ gấp đôi được trả về là khoảng 2,6.
Tobliug

20

Thực tế nếu bạn muốn có màn hình thực sự thì câu trả lời nằm ở giữa nếu bạn truy vấn các số liệu hiển thị:

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int dpiClassification = dm.densityDpi;
float xDpi = dm.xdpi;
float yDpi = dm.ydpi;

Mật độDpi * 160 sẽ cung cấp cho bạn các giá trị / đề xuất mật độ bạn nên sử dụng

0.75 - ldpi - 120 dpi
1.0 - mdpi - 160 dpi
1.5 - hdpi - 240 dpi
2.0 - xhdpi - 320 dpi
3.0 - xxhdpi - 480 dpi
4.0 - xxxhdpi - 640 dpi

như được chỉ định trong bài viết trước

nhưng dm.xdpisẽ không cung cấp cho bạn luôn dpi THỰC của màn hình đã cho: Ví dụ:

Device: Sony ericsson xperia mini pro (SK17i)
Density: 1.0 (e.g. suggests you use 160dpi resources)
xdpi: 193.5238
Real device ppi is arround 193ppi


Device: samsung GT-I8160 (Samsung ace 2)
Density 1.5 (e.g. suggests you use 240dpi resources)
xdpi 160.42105
Real device ppi is arround 246ppi

vì vậy có lẽ dpi thực của màn hình phải là Mật độ * xdpi .. nhưng tôi không chắc đây có phải là cách làm đúng hay không!


1
Sử dụng Mật độ * xdpi đang hoạt động hoàn hảo cho đến nay trên tất cả các ứng dụng của tôi trên google play cho đến nay trong 6 tháng qua
Marek Halmo

Nhân mật độ * xdpi là không hợp lý, điều này rõ ràng hơn khi có nhiều thiết bị mật độ cao hơn - cả Mật độ và xdpi đều tăng, do đó, nhân chúng sẽ tăng gấp đôi số lần tăng. Tôi sẽ nói Samsung ace 2 là một lỗi của nhà cung cấp. Thông số kỹ thuật của Android là xdpi và ydpi là mật độ pixel thực sự - không nhân với bất cứ thứ gì.
ToolmakerSteve

17

Điều này sẽ giúp ích cho hoạt động của bạn ...

void printSecreenInfo(){

    Display display = getWindowManager().getDefaultDisplay();
    DisplayMetrics metrics = new DisplayMetrics();
    display.getMetrics(metrics);

    Log.i(TAG, "density :" +  metrics.density);

    // density interms of dpi
    Log.i(TAG, "D density :" +  metrics.densityDpi);

    // horizontal pixel resolution
    Log.i(TAG, "width pix :" +  metrics.widthPixels);

     // actual horizontal dpi
    Log.i(TAG, "xdpi :" +  metrics.xdpi);

    // actual vertical dpi
    Log.i(TAG, "ydpi :" +  metrics.ydpi);

}

ĐẦU RA:

I/test( 1044): density :1.0

I/test( 1044): D density :160

I/test( 1044): width pix :800

I/test( 1044): xdpi :160.0

I/test( 1044): ydpi :160.42105

13
public static String getDensity(Context context) {
    String r;
    DisplayMetrics metrics = new DisplayMetrics();

    if (!(context instanceof Activity)) {
        r = "hdpi";
    } else {
        Activity activity = (Activity) context;
        activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);

        if (metrics.densityDpi <= DisplayMetrics.DENSITY_LOW) {
            r = "ldpi";
        } else if (metrics.densityDpi <= DisplayMetrics.DENSITY_MEDIUM) {
            r = "mdpi";
        } else {
            r = "hdpi";
        }
    }

    return r;
}

11

Nếu bạn muốn lấy lại mật độ từ một Dịch vụ, nó hoạt động như thế này:

WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(metrics);

Điều này đã giúp tôi khi tôi không có windowmanager
silentsudo

8

Bạn nên thử cái này. Chỉ cần thêm một phương thức sẽ tìm và hiển thị bánh mì nướng. Đó là trong các loại rơi thiết bị.

public static int differentDensityAndScreenSize(Context context) {
  int value = 20;
  String str = "";
  if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {
   switch (context.getResources().getDisplayMetrics().densityDpi) {
   case DisplayMetrics.DENSITY_LOW:
    str = "small-ldpi";
    value = 20;
    break;
   case DisplayMetrics.DENSITY_MEDIUM:
    str = "small-mdpi";
    value = 20;
    break;
   case DisplayMetrics.DENSITY_HIGH:
    str = "small-hdpi";
    value = 20;
    break;
   case DisplayMetrics.DENSITY_XHIGH:
    str = "small-xhdpi";
    value = 20;
    break;
   case DisplayMetrics.DENSITY_XXHIGH:
    str = "small-xxhdpi";
    value = 20;
    break;
   case DisplayMetrics.DENSITY_XXXHIGH:
    str = "small-xxxhdpi";
    value = 20;
    break;
   case DisplayMetrics.DENSITY_TV:
    str = "small-tvdpi";
    value = 20;
    break;
   default:
    str = "small-unknown";
    value = 20;
    break;
   }

  } else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {
   switch (context.getResources().getDisplayMetrics().densityDpi) {
   case DisplayMetrics.DENSITY_LOW:
    str = "normal-ldpi";
    value = 82;
    break;
   case DisplayMetrics.DENSITY_MEDIUM:
    str = "normal-mdpi";
    value = 82;
    break;
   case DisplayMetrics.DENSITY_HIGH:
    str = "normal-hdpi";
    value = 82;
    break;
   case DisplayMetrics.DENSITY_XHIGH:
    str = "normal-xhdpi";
    value = 90;
    break;
   case DisplayMetrics.DENSITY_XXHIGH:
    str = "normal-xxhdpi";
    value = 96;
    break;
   case DisplayMetrics.DENSITY_XXXHIGH:
    str = "normal-xxxhdpi";
    value = 96;
    break;
   case DisplayMetrics.DENSITY_TV:
    str = "normal-tvdpi";
    value = 96;
    break;
   default:
    str = "normal-unknown";
    value = 82;
    break;
   }
  } else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {
   switch (context.getResources().getDisplayMetrics().densityDpi) {
   case DisplayMetrics.DENSITY_LOW:
    str = "large-ldpi";
    value = 78;
    break;
   case DisplayMetrics.DENSITY_MEDIUM:
    str = "large-mdpi";
    value = 78;
    break;
   case DisplayMetrics.DENSITY_HIGH:
    str = "large-hdpi";
    value = 78;
    break;
   case DisplayMetrics.DENSITY_XHIGH:
    str = "large-xhdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_XXHIGH:
    str = "large-xxhdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_XXXHIGH:
    str = "large-xxxhdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_TV:
    str = "large-tvdpi";
    value = 125;
    break;
   default:
    str = "large-unknown";
    value = 78;
    break;
   }

  } else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) {
   switch (context.getResources().getDisplayMetrics().densityDpi) {
   case DisplayMetrics.DENSITY_LOW:
    str = "xlarge-ldpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_MEDIUM:
    str = "xlarge-mdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_HIGH:
    str = "xlarge-hdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_XHIGH:
    str = "xlarge-xhdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_XXHIGH:
    str = "xlarge-xxhdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_XXXHIGH:
    str = "xlarge-xxxhdpi";
    value = 125;
    break;
   case DisplayMetrics.DENSITY_TV:
    str = "xlarge-tvdpi";
    value = 125;
    break;
   default:
    str = "xlarge-unknown";
    value = 125;
    break;
   }
  }
// The Toast will show the Device falls in Which Categories.
Toast.makeText(MainActivity.this, ""+str, Toast.LENGTH_SHORT).show();

  return value;
 }

http://www.androidwarriors.com/2016/01/how-to-find-different-devices-screen.html


7

Điều này nên làm việc.

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels; //320
int height = dm.heightPixels; //480

4
Kích thước tính bằng pixel của màn hình không phải là mật độ.
joshperry

1
Đây là mật độ pixel độc lập không phải pixel. Và 320 mà bạn thấy là 320dip chứ không phải 320px. Cách tính px là khác nhau, hãy xem stackoverflow.com/questions/6840904/
Lukap

7

Một câu trả lời khác:

/**
* @return "ldpi", "mdpi", "hdpi", "xhdpi", "xhdpi", "xxhdpi", "xxxhdpi", "tvdpi", or "unknown".
*/
public static String getDensityBucket(Resources resources) {
    switch (resources.getDisplayMetrics().densityDpi) {
        case DisplayMetrics.DENSITY_LOW:
            return "ldpi";
        case DisplayMetrics.DENSITY_MEDIUM:
            return "mdpi";
        case DisplayMetrics.DENSITY_HIGH:
            return "hdpi";
        case DisplayMetrics.DENSITY_XHIGH:
            return "xhdpi";
        case DisplayMetrics.DENSITY_XXHIGH:
            return "xxhdpi";
        case DisplayMetrics.DENSITY_XXXHIGH:
            return "xxxhdpi";
        case DisplayMetrics.DENSITY_TV:
            return "tvdpi";
        default:
            return "unknown";
    }
}

3

Một cách khác để lấy mật độ được tải bởi thiết bị:

Tạo valuesthư mục cho mỗi mật độ

  • các giá trị (mdpi mặc định)
  • giá trị-hdpi
  • giá trị-xhdpi
  • giá trị-xxhdpi
  • giá trị-xxxhdpi

Thêm một tài nguyên chuỗi tương ứng strings.xml:

<string name="screen_density">MDPI</string>    <!-- ..\res\values\strings.xml -->
<string name="screen_density">HDPI</string>    <!-- ..\res\values-hdpi\strings.xml -->
<string name="screen_density">XHDPI</string>   <!-- ..\res\values-xhdpi\strings.xml -->
<string name="screen_density">XXHDPI</string>  <!-- ..\res\values-xxhdpi\strings.xml -->
<string name="screen_density">XXXHDPI</string> <!-- ..\res\values-xxxhdpi\strings.xml -->

Sau đó, chỉ cần lấy tài nguyên chuỗi và bạn có mật độ của mình:

String screenDensity = getResources().getString(R.string.screen_density);

Nếu mật độ lớn hơn XXXHDPI, nó sẽ mặc định XXXHDPIhoặc nếu nó thấp hơn HDPInó sẽ mặc địnhMDPI

Giá trị R.strings.screen_d mật độ

Tôi đã bỏ đi LDPI, vì trường hợp sử dụng của tôi không cần thiết.


Tôi nghĩ rằng đây là cách đúng đắn để có được mật độ. Vì tôi sử dụng mật độ getResource (). GetDisplayMetrics ()., Mật độ sẽ thay đổi nếu tôi thay đổi kích thước hiển thị trong cài đặt.
Fantasy Fang

1

Thử cái này...

Ở kotlin

fun determineScreenDensityCode(): String {
      return when (resources.displayMetrics.densityDpi) {
         DisplayMetrics.DENSITY_LOW -> "ldpi"
         DisplayMetrics.DENSITY_MEDIUM -> "mdpi"
         DisplayMetrics.DENSITY_HIGH -> "hdpi"
         DisplayMetrics.DENSITY_XHIGH, DisplayMetrics.DENSITY_280 -> "xhdpi"
         DisplayMetrics.DENSITY_XXHIGH, DisplayMetrics.DENSITY_360, DisplayMetrics.DENSITY_400, DisplayMetrics.DENSITY_420 -> "xxhdpi"
         DisplayMetrics.DENSITY_XXXHIGH, DisplayMetrics.DENSITY_560 -> "xxxhdpi"
         else -> "Unknown code ${resources.displayMetrics.densityDpi}"
     }
}

Bạn có thể gọi bằng println("density: ${determineScreenDensityCode()}") và đầu ra sẽ làSystem.out: density: xxxhdpi


0

Tôi đang sử dụng mã sau để truy cập DPI từ các mô-đun (không cần phải có quyền truy cập vào một đối tượng ngữ cảnh):

(Resources.getSystem().getDisplayMetrics().xdpi
Resources.getSystem().getDisplayMetrics().ydpi)/2

0

Trong Android, bạn có thể nhận được mật độ màn hình như thế này:

public static String getScreenDensity(Context context)
{
    String density;
    switch (context.getResources().getDisplayMetrics().densityDpi)
    {
        case DisplayMetrics.DENSITY_LOW:
            density = "LDPI";
            break;
        case DisplayMetrics.DENSITY_140:
            density = "LDPI - MDPI";
            break;
        case DisplayMetrics.DENSITY_MEDIUM:
            density = "MDPI";
            break;
        case DisplayMetrics.DENSITY_180:
        case DisplayMetrics.DENSITY_200:
        case DisplayMetrics.DENSITY_220:
            density = "MDPI - HDPI";
            break;
        case DisplayMetrics.DENSITY_HIGH:
            density = "HDPI";
            break;
        case DisplayMetrics.DENSITY_260:
        case DisplayMetrics.DENSITY_280:
        case DisplayMetrics.DENSITY_300:
            density = "HDPI - XHDPI";
            break;
        case DisplayMetrics.DENSITY_XHIGH:
            density = "XHDPI";
            break;
        case DisplayMetrics.DENSITY_340:
        case DisplayMetrics.DENSITY_360:
        case DisplayMetrics.DENSITY_400:
        case DisplayMetrics.DENSITY_420:
        case DisplayMetrics.DENSITY_440:
            density = "XHDPI - XXHDPI";
            break;
        case DisplayMetrics.DENSITY_XXHIGH:
            density = "XXHDPI";
            break;
        case DisplayMetrics.DENSITY_560:
        case DisplayMetrics.DENSITY_600:
            density = "XXHDPI - XXXHDPI";
            break;
        case DisplayMetrics.DENSITY_XXXHIGH:
            density = "XXXHDPI";
            break;
        case DisplayMetrics.DENSITY_TV:
            density = "TVDPI";
            break;
        default:
            density = "UNKNOWN";
            break;
    }

    return density;
}

Và trong Kotlin như thế này:

fun getScreenDensity(context: Context): String {
    val density: String
    when (context.resources.displayMetrics.densityDpi) {
        DisplayMetrics.DENSITY_LOW -> density = "LDPI"
        DisplayMetrics.DENSITY_140 -> density = "LDPI - MDPI"
        DisplayMetrics.DENSITY_MEDIUM -> density = "MDPI"
        DisplayMetrics.DENSITY_180, DisplayMetrics.DENSITY_200, DisplayMetrics.DENSITY_220 -> density = "MDPI - HDPI"
        DisplayMetrics.DENSITY_HIGH -> density = "HDPI"
        DisplayMetrics.DENSITY_260, DisplayMetrics.DENSITY_280, DisplayMetrics.DENSITY_300 -> density = "HDPI - XHDPI"
        DisplayMetrics.DENSITY_XHIGH -> density = "XHDPI"
        DisplayMetrics.DENSITY_340, DisplayMetrics.DENSITY_360, DisplayMetrics.DENSITY_400, DisplayMetrics.DENSITY_420, DisplayMetrics.DENSITY_440 -> density =
            "XHDPI - XXHDPI"
        DisplayMetrics.DENSITY_XXHIGH -> density = "XXHDPI"
        DisplayMetrics.DENSITY_560, DisplayMetrics.DENSITY_600 -> density = "XXHDPI - XXXHDPI"
        DisplayMetrics.DENSITY_XXXHIGH -> density = "XXXHDPI"
        DisplayMetrics.DENSITY_TV -> density = "TVDPI"
        else -> density = "UNKNOWN"
    }

    return density
}

Hãy chắc chắn để thường xuyên kiểm tra nếu mật độ mới được thêm vào .

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.