web-dev-qa-db-ja.com

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

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

90
Rookie

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を使用します。これは、mdpihdpiなどの Android Design Resources に基づいています。 DPI scales

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など)。

上記の情報を使用すると、デバイスの最小幅が600dpより大きい場合、デバイスは7インチタブレットであり、720dpより大きい場合、デバイスは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として誤って表現されているか、800 x 480ピクセルだけで7インチの画面に表示される可能性がある不明瞭なタブレットで作業する場合。

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

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
}

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

230
Sean O'Toole

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

最初は、getContext().getResources().getConfiguration()で取得できる Configuration オブジェクトです。それには次のものがあります:

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番目は、getContext().getResources().getDisplayMetrics()によって取得された DisplayMetrics オブジェクトです。その中で:

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

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

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

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

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

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

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

32
DeeV

このメソッドを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インチサイズの後に始まります。

13
PiyushMishra

縦向きと横向きを切り替える場合、上記は必ずしも機能しません。

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

resources.getConfiguration().smallestScreenWidthDp

それ以外の場合、これに余裕がある場合は、システムに通知させることにより、600dp(6 "など)と720dp(10"など)を検出する非常に正確なアプローチである次の方法を使用します。

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

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();
}
8
CEO

素晴らしい情報、私が探していたものだけ!ただし、これを試してみたところ、ここで言及したメトリックを使用すると、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();
}
7
Jason

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

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

詳細はこちら ..を参照してください。

3
Xar E Ahmer

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

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

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

Android ドキュメント は、サイズグループが廃止されることを示しています

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

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

enter image description here

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

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

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
Benjamin

values folderに値を保存していたので、画面は7インチまたは10 incになりますが、valuesフォルダーを使用しているどのデバイスでも実行できます。

たとえば、異なる2つのデバイス用に異なる2つの値のフォルダーを作成します。しかし、これは要件に依存します。

2
sharma_kunal

別の方法:

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

  • 配置:<string name="screentype">LARGE</string>をvalues-largeフォルダー(strings.xml)に入れます

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

  • コード内:

    String mType = getString(R.string.screentype);

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

    // 4〜7インチ

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

    // 7〜10インチ

    }

1
Frank Nguyen

DisplayMetrics クラスで指定されたデータを使用して、少し計算する必要があります。

HeightPixelとwidthPixelsがあります(ピクセル単位の画面解像度)

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

gonalPixel =√(heightPixel²+widthPixels²)

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

inchDiag = gonalPixel/densityDPI。

ここで間違いを犯さなかったことを願っています。DisplayMetricsクラスから取得する値はコンストラクターによって提供されることに注意してください。

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

1
Guian

出来上がり! ????タブレットと携帯電話を区別するために必要なのはこれだけです

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
Sagar