วิธีตรวจสอบอุปกรณ์ Android คือหน้าจอ HDPI หรือหน้าจอ MDPI


121

ฉันต้องการตรวจสอบสิ่งนี้เพื่อดึงภาพต่างๆทางอินเทอร์เน็ต ต้องทำอย่างไร?

คำตอบ:


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
ค่าความหนาแน่นอธิบายไว้ที่: developer.android.com/guide/practices/screens_support.html
esilver

1
@SteD เป็นไปได้ไหมที่จะบอกว่าอุปกรณ์จะเป็นอย่างไร? เช่นพิจารณากรณีที่ dpi อยู่ที่ 140 ตรงกลางช่วงที่เก็บข้อมูล? ปัดลงหรือขึ้น?
วอล

tvdpi ประมาณ 1.3
Ethan_AI

3
สำหรับ nexus 6p ผมได้ 3.5 มันจะเข้าหมวดไหน?
Manohar Reddy

2
oneplus3T มี 2.625 สิ่งที่เราควรพิจารณาใน?
Parth Anjaria

188

คุณสามารถตรวจสอบความหนาแน่นของหน้าจอได้ด้วย:

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

แก้ไขโปรดทราบว่าเมื่อ Android พัฒนาขึ้นควรรวมค่าอื่น ๆ ไว้ในswitchเคสด้วย ในฐานะของการแก้ไขนี้ซึ่งรวมถึงและDisplayMetrics.DENSITY_TV DisplayMetrics.DENSITY_XXHIGHปรึกษาเอกสารสำหรับข้อมูลล่าสุด; ฉันจะไม่กังวลกับการรักษาคำตอบนี้


ควรมีอยู่ใน SDK ระดับ 4 (แพลตฟอร์ม 1.6) ขึ้นไป คุณใช้ SDK ระดับใด (ใน SDK 3 คุณสามารถใช้ได้densityตามที่ SteD แนะนำ)
Ted Hopp

ฉันต้องการกำหนดเป้าหมายไปที่ platform1.5 คำตอบด้านล่างอาจจะเหมาะกับคำขอของฉัน
virsir

4
คำตอบด้านล่างนี้เป็นคำตอบข้างต้นต้องเป็นแบบทั่วไปมากกว่านี้)
นีล

FYI กับอุปกรณ์ใหม่ ๆ (เช่น Nexus 7) คุณควรรวม DENSITY_TV ไว้ด้วย
แอนนี่

1
@annie - จุดดี ขอบคุณ สำหรับ API ระดับ 16 ควรรวมDENSITY_XXHIGHไว้ด้วย ฉันได้เพิ่มข้อจำกัดความรับผิดชอบในคำตอบเพื่อให้ครอบคลุมทุกกรณีในอนาคต :)
Ted Hopp

10

ในปี 2018 คุณสามารถใช้วิธีการด้านล่าง -

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

แต่ตามที่ @Ted ชี้ให้ศึกษาเอกสารอย่างเป็นทางการก่อนใช้เสมอ


4

จากคำตอบข้างต้นฉันได้รวมเข้าด้วยกันและสร้างฟังก์ชันด้านล่าง:

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

ตอนนี้อุปกรณ์ใดที่คุณต้องการรับข้อมูลความหนาแน่นและจะใช้โฟลเดอร์ใดเพียงเพิ่มวิธีการด้านบนในกิจกรรมนั้นและเพิ่มบรรทัดด้านล่างใน onCreate

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

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

}

2

สำหรับ React Native เพื่อตรวจสอบขนาดของอุปกรณ์ในปัจจุบัน

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


สิ่งนี้จะไม่ทำงาน PixelRatio.get()จะส่งคืนค่าช่วงขึ้นอยู่กับขนาดการแสดงผลที่ตั้งไว้ในการตั้งค่า Android และ dpi ค่าเหล่านี้จะไม่รวมกับค่าที่คุณได้ขีดไว้
EnKrypt

0

ในอุปกรณ์บางอย่าง (ของฉันคือ Galaxy Tab3) ทั้งความหนาแน่นและความหนาแน่น DPI จะส่งคืนค่าแปลก ๆ เช่น 1.33 (ความหนาแน่น), 213 (ความหนาแน่น DPI) ดังนั้นวิธีแก้ปัญหาของฉันคือเพิ่มค่าสถานะเหล่านี้:

<item type = "bool" name = "is_mdpi"> [บูล] </item>
<item type = "bool" name = "is_hdpi"> [bool] </item>
<item type = "bool" name = " is_xhdpi "> [บูล] </item>
<item type =" bool "name =" is_xxhdpi "> [บูล] </item>

เป็น 4 ไฟล์ values.xml วางไว้ภายใต้ res / values- [xxx] / โฟลเดอร์ที่สอดคล้องกัน


6
213dpi เป็นความหนาแน่นที่รู้จักกันดี "tvdpi": developer.android.com/guide/practices/…
Christopher Orr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.