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である場合を考えてみます。切り捨てますか?
2016年

tvdpiは約1.3です
Ethan_AI 2016年

3
ネクサス6pの場合、3.5になります。どのカテゴリに分類されますか?
Manohar Reddy 2016年

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では、densitySteDの提案に従って使用できます。)
Ted Hopp

私はplatform1.5をターゲットにする必要があります。以下の答えはおそらく私の要求に合うでしょう。
virsir

4
以下の回答は現在、上記の回答です。より一般的なものにする必要があります;)
Neil

参考までに、いくつかの新しいデバイス(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です)では、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/...
クリストファー・オア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.