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


1
@SteD 장치가 무엇인지 말할 수 있습니까? 예를 들어 dpi가 버킷 범위의 중간에 140 인 경우를 고려하십시오. 반올림 또는 반올림합니까?

tvdpi는 약 1.3
Ethan_AI

3
넥서스 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_TVDisplayMetrics.DENSITY_XXHIGH. 최신 정보 는 문서 를 참조하십시오 . 나는이 대답을 유지하는 것을 귀찮게하지 않을 것입니다.


SDK 레벨 4 (플랫폼 1.6) 이상에 있어야합니다. 어떤 SDK 레벨을 사용하고 있습니까? (SDK 3에서는 densitySteD가 제안한대로 사용할 수 있습니다 .)
Ted Hopp

platform1.5를 타겟팅해야합니다. 아래 답변은 내 요청에 적합 할 수 있습니다.
virsir

4
아래 답변은 이제 위의 답변이며 더 일반적이어야합니다.)
Neil

참고로 Nexus 7과 같은 일부 새 기기의 경우 DENSITY_TV도 포함해야합니다.
annie

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)에서 density와 densityDpi 모두 1.33 (density), 213 (densityDpi)와 같은 이상한 값을 반환합니다. 그래서 내 해결책은 다음 플래그를 추가하는 것입니다.

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

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.