プログラムで7インチと10インチのタブレットを検出する


93

アプリがインストールされているデバイスが7インチタブレットか10インチタブレットかをプログラムで見つける方法はありますか?


例:layout-sw600dpは、600 dpの最小の幅サイズを探します。
新人

私はそれを理解していますが、プログラムで何を探していますか?
Geobits 2013

これらのデバイスをプログラムでフェッチする必要があります。xmlで定義できないプロパティがいくつかあります。これらのプロパティはコード自体で定義されているので、単にコードを配置すると、すべてのデバイスに適用されます。私はそれを望んでいない..
2013

@Raghavは、画面のサイズを取得するために表示マトリックスを試してみました。きれいな方法ではありませんが、使用できます。
PiyushMishra 2013

あなたの画面サイズを取得し、そこから...出て仕事ができるstackoverflow.com/questions/1016896/...
ラジ

回答:


234

を使用しDisplayMetricsて、アプリが実行されている画面に関するさまざまな情報を取得できます。

まず、DisplayMetricsメトリックオブジェクトを作成します。

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

これから、ディスプレイのサイズを変更するために必要な情報を取得できます。

int widthPixels = metrics.widthPixels;
int heightPixels = metrics.heightPixels;

これはピクセル単位で幅と高さの絶対値を返すので、Galaxy SIII、Galaxy Nexusなどの場合は1280x720です。

Androidデバイスで作業しているときは、通常、密度に依存しないピクセルで作業することを好むため、これはそれ自体では役に立ちません。

あなたは、取得density画面の使用metricsに基づいており、デバイスのためのスケールファクタの形で、再びAndroidのデザインリソースのためmdpihdpiなど DPIスケール

float scaleFactor = metrics.density;

この結果から、特定の高さまたは幅に対して存在する密度非依存ピクセルの量を計算できます。

float widthDp = widthPixels / scaleFactor
float heightDp = heightPixels / scaleFactor

これから得られる結果は、Androidの設定例と連携してどのタイプの画面を操作しているかを判断するのに役立ちます。これにより、各画面サイズの相対的なdpがわかります。

  • 320dp:一般的な電話画面(240x320 ldpi、320x480 mdpi、480x800 hdpiなど)。
  • 480dp:Streak(480x800 mdpi)などのトゥイナータブレット。
  • 600dp:7インチタブレット(600x1024 mdpi)。
  • 720dp:10インチタブレット(720x1280 mdpi、800x1280 mdpiなど)。

上記の情報を使用すると、デバイスの最小幅が600 dpより大きい場合、デバイスは7インチタブレットであり、720 dpより大きい場合、デバイスは10インチタブレットであることがわかります。

クラスのmin関数を使用して最小の幅を計算Mathし、heightDpとを渡してwidthDpを返すことができsmallestWidthます。

float smallestWidth = Math.min(widthDp, heightDp);

if (smallestWidth > 720) {
    //Device is a 10" tablet
} 
else if (smallestWidth > 600) {
    //Device is a 7" tablet
}

ただし、これは必ずしも完全に一致するわけではありません。特に、密度がhdpiでない場合にhdpiと誤って表示している場合や、800 x 480ピクセルしかない場合でも7インチの画面に表示されている場合があります。 。

これらの方法に加えて、デバイスの正確な寸法をインチで知る必要がある場合metricsは、画面の1インチあたりのピクセル数の方法を使用して、問題を解決することもできます。

float widthDpi = metrics.xdpi;
float heightDpi = metrics.ydpi;

デバイスの1インチあたりのピクセル数と合計ピクセル数に関する知識を使用して、デバイスのインチ数を計算できます。

float widthInches = widthPixels / widthDpi;
float heightInches = heightPixels / heightDpi;

これは、デバイスの高さと幅をインチで返します。この場合も、デバイスの種類を判断するのに必ずしも役立つとは限りません。デバイスのアドバタイズされたサイズは対角線であり、高さと幅しかありません。

ただし、三角形の高さと幅を指定すると、ピタゴラスの定理を使用して斜辺の長さ(この場合は画面の対角線のサイズ)を計算できることもわかっています。

//a² + b² = c²

//The size of the diagonal in inches is equal to the square root of the height in inches squared plus the width in inches squared.
double diagonalInches = Math.sqrt(
    (widthInches * widthInches) 
    + (heightInches * heightInches));

これから、デバイスがタブレットであるかどうかを確認できます。

if (diagonalInches >= 10) {
    //Device is a 10" tablet
} 
else if (diagonalInches >= 7) {
    //Device is a 7" tablet
}

そして、それがあなたがあなたがどのような種類のデバイスで働いているかを計算する方法です。


3
すばらしいヒントショーン。以前はタブレットのpxで確認していましたが、場合によっては問題があります(Galaxy 3、4、注、Nexus 7と同じかそれ以上のpxがあります)。インチもチェックできるようになりました。ここでは、多くの一般的なデバイスの画面仕様のリストは、次のとおりです。en.wikipedia.org/wiki/List_of_displays_by_pixel_density
Pelanes

8
xdpiまたはydpiは使用しないでください。これらはオプションであり、計算ではなくメーカーによって設定されます。多くの場合、未使用または不正確です。
sturrockad 2013

2
メソッドを使用してdpiで幅を取得すると、方向によって異なる結果が得られます。たとえば、Nexus 7の場合:PORTRAIT:leastWidth = 600.9; 風景:最小幅= 552.8; その理由は何ですか?
Christopher Masser

3
ロジックif (smallestWidth > 600) { /* 7" */ } else if (smallestWidth > 720) { /* 10" */ }に欠陥があります。10インチのタブレットが7インチとして認識されます。私はそれを修正するために自由を取りました。
Jonik 2013

21
最終的に私が一緒に行ったresources.getConfiguration().smallestScreenWidthDpからDeeVの答え与え唯一の方法であり、縦向きと横向きの両方で同じ値を 私のネクサス7(600dp)に。これは、APIレベル13で追加されました
Jonik

32

言うは何もありません7"10"私の知る限りでは。ビットマップをデコードするときにシステムが使用する画面サイズを取得する方法は、おおよそ2つあります。どちらもにあるアプリケーションのResourcesオブジェクトにありContextます。

1つ目は、Configurationで取得できるオブジェクトgetContext().getResources().getConfiguration()です。その中にあなたは持っています:

Configuration#densityDpi -レンダリングされるターゲット画面の密度。密度リソース修飾子に対応します。

Configuration#screenHeightDp -画面の高さのリソース修飾子に対応する、dp単位の利用可能な画面スペースの現在の高さ。

Configuration#screenWidthDp -画面幅のリソース修飾子に対応する、dp単位の利用可能な画面スペースの現在の幅。

Configuration#smallestScreenWidthDp -通常の操作でアプリケーションに表示される最小画面サイズ。最小画面幅リソース修飾子に対応します。

それを使用すると、ほとんど(お使いのデバイスは、それぞれの専門的なリソースフォルダから引っ張っているかどうかを把握するために、画面のガイドラインを使用することができhdpixhdpilargexlarge、など)。

これらはいくつかのバケットです:

  • xlarge画面は少なくとも960dp x 720dp
  • 大画面は少なくとも640dp x 480dp
  • 通常の画面は少なくとも470dp x 320dp
  • 小さな画面は少なくとも426dp x 320dp

  • 320dp:一般的な電話画面(240x320 ldpi、320x480 mdpi、480x800 hdpiなど)。

  • 480dp:Streak(480x800 mdpi)などのトゥイナータブレット。
  • 600dp:7インチタブレット(600x1024 mdpi)。
  • 720dp:10インチタブレット(720x1280 mdpi、800x1280 mdpiなど)。

より詳しい情報

2番目は、DisplayMetricsによって取得されたオブジェクトgetContext().getResources().getDisplayMetrics()です。あなたが持っていることで:

DisplayMetrics#density -ディスプレイの論理密度。

DisplayMetrics#densityDpi -1インチあたりのドット数で表される画面密度。

DisplayMetrics#heightPixels -ディスプレイの絶対高さ(ピクセル単位)。

DisplayMetrics#widthPixels -ディスプレイの絶対幅(ピクセル単位)。

DisplayMetrics#xdpi -X次元での画面の1インチあたりの正確な物理ピクセル。

DisplayMetrics#ydpi -Y次元での画面の1インチあたりの正確な物理ピクセル。

これは、密度ではなく画面の正確なピクセル数が必要な場合に便利です。ただし、これは画面のすべてのピクセルであることに注意してください。利用可能なものだけではありません。


4
+1、私はで最高の結果を得ていsmallestScreenWidthDpます。他のソリューションとは異なり、向きに関係なく、Nexus 7(600dp)で同じ値が得られます。おまけとして、それは最も単純なコードでもあります!
Jonik 2013

1
これは、リソースパスのsw ??? dp表記と一致する必要があるため、これが最善の方法であり続けると思います。一貫性は重要です。
lilbyrdie

13

このメソッドをonResume()に配置して確認できます。

public double tabletSize() {

     double size = 0;
        try {

            // Compute screen size

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

            float screenWidth  = dm.widthPixels / dm.xdpi;

            float screenHeight = dm.heightPixels / dm.ydpi;

            size = Math.sqrt(Math.pow(screenWidth, 2) +

                                 Math.pow(screenHeight, 2));

        } catch(Throwable t) {

        }

        return size;

    }

通常、タブレットは6インチのサイズから始まります。


8

上記は、縦向きと横向きを切り替えるときに常に機能するとは限りません。

APIレベル13以上をターゲットにしている場合は、上記のように簡単です。Configuration.smallestScreenWidthDpを使用し、それに応じてテストします。

resources.getConfiguration().smallestScreenWidthDp

それ以外の場合は、これが可能であれば、次の方法を使用します。これは、システムに通知して、600dp(6インチなど)と720dp(10インチなど)を検出する非常に正確な方法です。

1)適切なIDを持つ非表示ビューをlayout-sw600dpおよびlayout-sw720dp(および該当する場合はそのランドスケープ)に追加します。次に例を示します。

720の場合、layout-sw720dpの場合:

<View android:id="@+id/sw720" android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone"/>

600の場合、layout-sw600dpで:

<View android:id="@+id/sw600" android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone"/>

2)次に、アクティビティーなどのコードで、それに応じてテストします。

private void showFragment() {
    View v600 = (View) findViewById(R.id.sw600);
    View v720 = (View) findViewById(R.id.sw720);
    if (v600 != null || v720 !=null)
        albumFrag = AlbumGridViewFragment.newInstance(albumRefresh);
    else
        albumFrag = AlbumListViewFragment.newInstance(albumRefresh);
    getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.view_container, albumFrag)
        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
        .commit();
}

4
別のレイアウトを作成する必要はありません。values-sw600dpなどのさまざまな値のフォルダーを用意することで、サイズに基づいて別のstrings.xmlを作成できます。文字列を定義します<string name = 'screensize' > 600dp </ string>(sw600dpフォルダーなど)。文字列である必要はなく、ints.xmlまたはdimens.xmlに含めることもできます。
ajacian81 2014年

7

素晴らしい情報、まさに私が探していたもの!ただし、これを試してみたところ、ここで説明した指標を使用すると、Nexus 7(2012モデル)のレポートに1280x736のサイズがあることがわかりました。Jelly Beanを実行しているMotorola Xoomもあり、解像度が1280x752と誤って報告されています。これを確認するこの投稿をここで偶然見つけました。基本的に、ICS / JBでは、上記のメトリックを使用した計算では、ナビゲーションバーのディメンションが除外されているように見えます。さらにいくつかの調査を行った結果、 フランク・グエンの答えがここにあります。これは、画面の生の(または実際の)ピクセル寸法を提供するさまざまな方法を使用しています。私の最初のテストでは、Frank correcltyの次のコードが、Nexus 7(2012モデルrunnin JB)とJBを実行しているMotorola Xoomの寸法を報告していることを示しています。

int width = 0, height = 0;
final DisplayMetrics metrics = new DisplayMetrics();
Display display = getWindowManager().getDefaultDisplay();
Method mGetRawH = null, mGetRawW = null;

try {
    // For JellyBeans and onward
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
        display.getRealMetrics(metrics);

        width = metrics.widthPixels;
        height = metrics.heightPixels;
    } else {
        mGetRawH = Display.class.getMethod("getRawHeight");
        mGetRawW = Display.class.getMethod("getRawWidth");

        try {
            width = (Integer) mGetRawW.invoke(display);
            height = (Integer) mGetRawH.invoke(display);
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
} catch (NoSuchMethodException e3) {
    e3.printStackTrace();
}

3

同じ解像度の2つのAndroidデバイスがあります

Device1->解像度480x800対角画面サイズ-> 4.7インチ

Device2->解像度480x800対角画面サイズ-> 4.0インチ

両方のデバイスの対角画面サイズが表示されます-> 5.8

あなたの問題の解決策は...

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width=dm.widthPixels;
int height=dm.heightPixels;
int dens=dm.densityDpi;
double wi=(double)width/(double)dens;
double hi=(double)height/(double)dens;
double x = Math.pow(wi,2);
double y = Math.pow(hi,2);
double screenInches = Math.sqrt(x+y);

詳細はこちら ..


2

Androidが画面サイズを指定する方法は、4つの一般化されたサイズ(smallnormallargeおよびxlarge)です。

Androidのドキュメントには、サイズグループは非推奨であると記載されていますが

...これらのサイズグループは廃止され、利用可能な画面幅に基づいて画面サイズを管理するための新しい手法が採用されました。Android 3.2以降用に開発している場合は、[Android 3.2のタブレットレイアウトの宣言](hdpi(高)〜240dpi)を参照してください。

通常、サイズ修飾子largeは7 インチのタブレットを指定します。また、サイズ修飾子xlargeは10 インチタブレットを指定します。

ここに画像の説明を入力してください

サイズ修飾子でトリガーすることの良い点は、アセットとコードが、使用するアセットまたはアクティブにするコードパスについて合意していることを保証できることです。

コードでサイズ修飾子を取得するには、次の呼び出しを行います。

int sizeLarge = SCREENLAYOUT_SIZE_LARGE // For 7" tablet
boolean is7InchTablet = context.getResources().getConfiguration()
    .isLayoutSizeAtLeast(sizeLarge);

int sizeXLarge = SCREENLAYOUT_SIZE_XLARGE // For 10" tablet
boolean is10InchTablet = context.getResources().getConfiguration()
    .isLayoutSizeAtLeast(sizeXLarge);

2

以下のメソッドを使用して画面サイズをインチ単位で取得できます。これに基づいて、デバイスがどのタブレットまたは携帯電話かを確認できます。

private static double checkDimension(Context context) {

    WindowManager windowManager = ((Activity)context).getWindowManager();
    Display display = windowManager.getDefaultDisplay();
    DisplayMetrics displayMetrics = new DisplayMetrics();
    display.getMetrics(displayMetrics);

    // since SDK_INT = 1;
    int mWidthPixels = displayMetrics.widthPixels;
    int mHeightPixels = displayMetrics.heightPixels;

    // includes window decorations (statusbar bar/menu bar)
    try
    {
        Point realSize = new Point();
        Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize);
        mWidthPixels = realSize.x;
        mHeightPixels = realSize.y;
    }
    catch (Exception ignored) {}

    DisplayMetrics dm = new DisplayMetrics();
    windowManager.getDefaultDisplay().getMetrics(dm);
    double x = Math.pow(mWidthPixels/dm.xdpi,2);
    double y = Math.pow(mHeightPixels/dm.ydpi,2);
    double screenInches = Math.sqrt(x+y);
    Log.d("debug","Screen inches : " + screenInches);
    return screenInches;
}

2

画面が7インチまたは10インチである値フォルダー値を格納していましたが、値フォルダーを使用して任意のデバイスで実行できます。

別の2のデバイス用の別の2の値フォルダーを作成するような。しかし、これは要件によって異なります。


1

DisplayMetricsクラスによって提供されるデータを使用して、少し計算を行う必要があります。

あなたはheightPixelとwidthPixels(ピクセル単位の画面解像度)を持っています

「インチの画面サイズ」は常に対角線の長さを表すため、対角線が必要です。ピクセル単位で画面の対角線を取得できます(ピタゴアを使用)

agonalPixel =√(heightPixel²+widthPixels²)

次に、densityDPI値のおかげで、ピクセル値をインチに変換できます。

inchDiag = agonalPixel / densityDPI。

ここで間違いがなかったといいのですが、DisplayMetricsクラスから取得した値はコンストラクターによって与えられることに注意してください。非常にまれなケースですが、物理的なマテリアルに応じて適切に設定されていないようです...

これにより、物理的な画面サイズが得られますが、複数のレイアウトを管理するためのより良い方法とは言えません。このトピックの詳細


1

別の方法:

  • さらに2つのフォルダーを作成します:values-large + values-xlarge

  • puts:<string name="screentype">LARGE</string>values-largeフォルダ(strings.xml)

  • <string name="screentype">XLARGE</string>puts :values-xlargeフォルダー(strings.xml)

  • コードで:

    文字列mType = getString(R.string.screentype);

    if(mType!= null && mType.equals( "LARGE"){

    // 4〜7インチ

    } else if(mType!= null && mType.equals( "XLARGE"){

    // 7〜10インチ

    }


1

出来上がり!😀これは、タブレットと携帯電話を区別するために必要なすべてです

1.画面幅を取得するヘルパー関数:

private float getScreenWidth() {
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    return Math.min(metrics.widthPixels, metrics.heightPixels) / metrics.density;
}

2.デバイスがタブレットかどうかを判別する機能

boolean isTablet() {
    return getScreenWidth() >= 600;
}

3.最後に、さまざまなデバイスサイズでさまざまな操作を実行する場合:

boolean is7InchTablet() {
    return getScreenWidth() >= 600 && getScreenWidth() < 720;
}

boolean is10InchTablet() {
    return getScreenWidth() >= 720;
}

0

ここにいくつかの便利なkotlin拡張:


    fun DisplayMetrics.isTablet(): Boolean {
        return screenWith() >= 600
    }

    fun DisplayMetrics.is7InchTablet(): Boolean {
        return screenWith() >= 600 && screenWith() < 720
    }

    fun DisplayMetrics.is10InchTablet(): Boolean {
        return screenWith() >= 720
    }

    fun DisplayMetrics.screenWith(): Float {
        return widthPixels.coerceAtMost(heightPixels) / density
    }

うまくいきました!しかし、あなたはから例えば適切DisplayMetrics、使うべきResourcesではContextresources.displayMetrics.isTablet() またはからWindowManagerに保存されているActivityval displayMetrics = DisplayMetrics() windowManager.defaultDisplay.getMetrics(displayMetrics) displayMetrics.isTablet()
Akbolat SSS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.