アプリがインストールされているデバイスが7インチタブレットか10インチタブレットかをプログラムで確認する方法はありますか?
13 に答える
を使用しDisplayMetrics
て、アプリが実行されている画面に関するさまざまな情報を取得できます。
まず、DisplayMetrics
メトリック オブジェクトを作成します。
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
これから、ディスプレイのサイズを変更するために必要な情報を取得できます。
int widthPixels = metrics.widthPixels;
int heightPixels = metrics.heightPixels;
これは、幅と高さの絶対値をピクセル単位で返すため、Galaxy SIII、Galaxy Nexus などでは 1280x720 になります。
通常、これだけでは役に立ちません。Android デバイスで作業しているときは、通常、密度に依存しないピクセルで作業することを好みます。
Android Design Resources forなどに基づく、デバイスの倍率の形式で、再度density
使用して画面の を取得します。
metrics
mdpi
hdpi
float scaleFactor = metrics.density;
この結果から、特定の高さまたは幅に対して存在する密度に依存しないピクセルの量を計算できます。
float widthDp = widthPixels / scaleFactor
float heightDp = heightPixels / scaleFactor
これから得られる結果は、各画面サイズの相対 dp を提供するAndroid 構成の例と組み合わせて、作業している画面のタイプを決定するのに役立ちます。
- 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 ではないのに密度が誤って伝えられているか、7 インチの画面に 800 x 480 ピクセルしかないタブレットを使用している場合は特にそうです。 .
これらの方法に加えて、デバイスの正確な寸法をインチで知る必要がある場合metrics
は、画面の 1 インチあたりのピクセル数の方法を使用して、それを計算することもできます。
float widthDpi = metrics.xdpi;
float heightDpi = metrics.ydpi;
デバイスの各インチに含まれるピクセル数と合計ピクセル数の知識を使用して、デバイスが何インチであるかを計算できます。
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
}
これが、使用しているデバイスの種類を計算する方法です。
7"
言うことも10"
AFAIKも何もありません。システムがビットマップなどをデコードするときに使用する画面サイズを取得するには、おおよそ 2 つの方法があります。これらは両方とも、 にあるアプリケーションのResources
オブジェクトにありContext
ます。
1 つ目は、Configuration
で取得できるオブジェクトgetContext().getResources().getConfiguration()
です。その中には次のものがあります。
Configuration#densityDpi
- 密度リソース修飾子に対応する、レンダリングされるターゲット画面密度。
Configuration#screenHeightDp
- 画面の高さリソース修飾子に対応する、使用可能な画面スペースの現在の高さ (dp 単位)。
Configuration#screenWidthDp
- 画面幅リソース修飾子に対応する、使用可能な画面スペースの現在の幅 (dp 単位)。
Configuration#smallestScreenWidthDp
- アプリケーションが通常の操作で表示する最小画面サイズ。最小画面幅リソース修飾子に対応します。
hdpi
これにより、画面のガイドラインを使用して、デバイスがそれぞれの専用リソース フォルダー ( 、xhdpi
、large
、xlarge
など)からプルしているかどうかを把握できます。
これらはバケットの一部です。
- 特大画面は 960 dp x 720 dp 以上
- 大画面は 640 dp x 480 dp 以上
- 通常の画面は 470dp x 320dp 以上
小さな画面は少なくとも 426 dp x 320 dp
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 インチあたりの正確な物理ピクセル。
これは、密度ではなく画面の正確なピクセル数が必要な場合に便利です。ただし、これは画面のすべてのピクセルであることに注意してください。あなたが利用できるものだけではありません。
このメソッドを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インチのサイズから始まります。
上記は、縦向きと横向きを切り替えるときに常に機能するとは限りません。
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();
}
素晴らしい情報、まさに私が探していたものです! ただし、これを試してみたところ、ここで説明したメトリックを使用すると、Nexus 7 (2012 モデル) のサイズが 1280x736 であることがわかりました。また、Jelly Bean を実行している Motorola Xoom を使用していますが、解像度が 1280x752 と誤って報告されます。これを確認するこの投稿hereに出くわしました。基本的に、ICS/JB では、上記のメトリックを使用した計算では、ナビゲーション バーの寸法が除外されているように見えます。さらにいくつかの調査により、 Frank Nguyen の回答 hereにたどり着きました。この回答では、さまざまな方法を使用して、画面の生の (または実際の) ピクセル寸法を取得します。私の最初のテストでは、Frank correclty からの次のコードが、Nexus 7 (JB を実行する 2012 年モデル) と 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();
}
同じ解像度の 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);
詳細はこちら..
以下の方法を使用して、画面サイズをインチ単位で取得できます。これに基づいて、デバイスがどのタブレットまたは電話であるかを簡単に確認できます。
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;
}
DisplayMetricsクラスによって提供されるデータを使用して、少し計算を行う必要があります。
heightPixel と widthPixels があります (ピクセル単位の画面解像度)
「インチ画面サイズ」は常に対角線の長さを表すため、対角線が必要です。画面の対角線をピクセルで取得できます(pythagoreを使用)
対角ピクセル = √(heightPixel² + widthPixels² )
次に、densityDPI 値のおかげで、ピクセル値をインチに変換できます。
インチディアグ = 対角ピクセル / 密度 DPI.
ここで間違いを犯していないことを願っています。DisplayMetrics クラスから取得した値はコンストラクターによって与えられることに注意してください。(非常にまれなケースですが) 物理的な素材に応じて適切に設定されていないように見えます...
これにより、物理的な画面サイズが得られますが、おそらく複数のレイアウトを管理するためのより良い方法ではありません. このトピックの詳細
別の方法:
さらに 2 つのフォルダーを作成します: values-large + values-xlarge
置く:
<string name="screentype">LARGE</string>
値の大きなフォルダー (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インチから
} そうでなければ (mType != null && mType.equals("XLARGE") {
// 7~10インチから
}
ここにいくつかの便利な kotlin 拡張機能があります:
fun DisplayMetrics.isTablet(): Boolean {
return getScreenWidth() >= 600
}
fun DisplayMetrics.is7InchTablet(): Boolean {
return getScreenWidth() >= 600 && getScreenWidth() < 720
}
fun DisplayMetrics.is10InchTablet(): Boolean {
return getScreenWidth() >= 720
}
fun DisplayMetrics.getScreenWidth(): Float {
return widthPixels.coerceAtMost(heightPixels) / density
}