アプリがインストールされているデバイスが7インチタブレットであるか10インチタブレットであるかをプログラムで確認する方法はありますか?
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
を使用します。これは、mdpi
、hdpi
などの Android Design Resources に基づいています。
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
}
そして、それがどのような種類のデバイスを使っているかを計算する方法です。
7"
または10"
AFAIKと言うものは何もありません。システムがビットマップなどをデコードするときに使用する画面サイズを取得するには、おおよそ2つの方法があります。これらは両方とも、Resources
にあるアプリケーションの Context
オブジェクトにあります。
最初は、getContext().getResources().getConfiguration()
で取得できる Configuration
オブジェクトです。それには次のものがあります:
Configuration#densityDpi
-レンダリングされるターゲット画面の密度。密度リソース修飾子に対応します。
Configuration#screenHeightDp
-画面の高さリソース修飾子に対応する、dp単位の使用可能な画面スペースの現在の高さ。
Configuration#screenWidthDp
-画面幅リソース修飾子に対応する、dp単位の使用可能な画面スペースの現在の幅。
Configuration#smallestScreenWidthDp
-アプリケーションが通常の操作で見る最小画面サイズ。最小画面幅リソース修飾子に対応します。
これにより、画面のガイドラインを使用して、デバイスがそれぞれの特殊なリソースフォルダー(hdpi
、xhdpi
、large
、xlarge
など)からプルしているかどうかを判断できます。
覚えておいてください、これらはいくつかのバケットです:
小さな画面は少なくとも426dp x 320dpです
320dp:典型的な電話画面(240x320 ldpi、320x480 mdpi、480x800 hdpiなど)。
2番目は、getContext().getResources().getDisplayMetrics()
によって取得された DisplayMetrics
オブジェクトです。その中で:
DisplayMetrics#density
-ディスプレイの論理密度。
DisplayMetrics#densityDpi
-1インチあたりのドット数で表される画面密度。
DisplayMetrics#heightPixels
-ディスプレイの絶対的な高さ(ピクセル単位)。
DisplayMetrics#widthPixels
-ピクセル単位のディスプレイの絶対幅。
DisplayMetrics#xdpi
-X次元での画面の1インチあたりの正確な物理ピクセル。
DisplayMetrics#ydpi
-Y次元での画面の1インチあたりの正確な物理ピクセル。
これは、密度ではなく画面の正確なピクセル数が必要な場合に便利です。ただし、これはall画面のピクセルであることに注意することが重要です。利用可能なものだけではありません。
このメソッドを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の解像度を誤って報告します。私はこの投稿を偶然見つけました ここ これはこれを確認します。基本的に、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();
}
同じ解像度の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);
詳細はこちら ..を参照してください。
以下の方法を使用して、画面サイズをインチ単位で取得できます。これに基づいて、デバイスがどのタブレットまたは電話であるかを簡単に確認できます。
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;
}
Androidが 画面サイズ を指定する方法は、4つの一般化サイズ(small、normal、largeおよびxlarge。
Android ドキュメント は、サイズグループが廃止されることを示しています
...これらのサイズグループは、使用可能な画面幅に基づいて画面サイズを管理するための新しい手法を支持して廃止されました。 Android 3.2以降向けに開発している場合、詳細については、[Android 3.2のタブレットレイアウトの宣言](hdpi(high)〜240dpi)を参照してください。
通常、サイズ修飾子largeは7インチのタブレットを指定します。サイズ修飾子はxlarge10インチタブレットを指定します。
サイズ修飾子でトリガーすることの良い点は、使用するアセットまたはアクティブ化するコードパスについて、アセットとコードが一致していることを保証できることです。
コードでサイズ修飾子を取得するには、次の呼び出しを行います。
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);
values folderに値を保存していたので、画面は7インチまたは10 incになりますが、valuesフォルダーを使用しているどのデバイスでも実行できます。
たとえば、異なる2つのデバイス用に異なる2つの値のフォルダーを作成します。しかし、これは要件に依存します。
別の方法:
さらに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インチ
}
DisplayMetrics クラスで指定されたデータを使用して、少し計算する必要があります。
HeightPixelとwidthPixelsがあります(ピクセル単位の画面解像度)
「インチ画面サイズ」は常に対角線の長さを表すため、対角線が必要です。画面の対角線をピクセルで取得できます(ピタゴアを使用)
gonalPixel =√(heightPixel²+widthPixels²)
densityDPI値のおかげでピクセル値をインチに変換できます:
inchDiag = gonalPixel/densityDPI。
ここで間違いを犯さなかったことを願っています。DisplayMetricsクラスから取得する値はコンストラクターによって提供されることに注意してください。
これにより、物理的な画面サイズが得られますが、おそらく複数のレイアウトを管理するより良い方法ではありません。 このトピックの詳細
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;
}