アプリがインストールされているデバイスが7インチタブレットか10インチタブレットかをプログラムで見つける方法はありますか?
アプリがインストールされているデバイスが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
に基づいており、デバイスのためのスケールファクタの形で、再びAndroidのデザインリソースのためmdpi
、hdpi
など
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
}
そして、それがあなたがあなたがどのような種類のデバイスで働いているかを計算する方法です。
if (smallestWidth > 600) { /* 7" */ } else if (smallestWidth > 720) { /* 10" */ }
に欠陥があります。10インチのタブレットが7インチとして認識されます。私はそれを修正するために自由を取りました。
言うは何もありません7"
か10"
私の知る限りでは。ビットマップをデコードするときにシステムが使用する画面サイズを取得する方法は、おおよそ2つあります。どちらもにあるアプリケーションのResources
オブジェクトにありContext
ます。
1つ目は、Configuration
で取得できるオブジェクトgetContext().getResources().getConfiguration()
です。その中にあなたは持っています:
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番目は、DisplayMetrics
によって取得されたオブジェクトgetContext().getResources().getDisplayMetrics()
です。あなたが持っていることで:
DisplayMetrics#density
-ディスプレイの論理密度。
DisplayMetrics#densityDpi
-1インチあたりのドット数で表される画面密度。
DisplayMetrics#heightPixels
-ディスプレイの絶対高さ(ピクセル単位)。
DisplayMetrics#widthPixels
-ディスプレイの絶対幅(ピクセル単位)。
DisplayMetrics#xdpi
-X次元での画面の1インチあたりの正確な物理ピクセル。
DisplayMetrics#ydpi
-Y次元での画面の1インチあたりの正確な物理ピクセル。
これは、密度ではなく画面の正確なピクセル数が必要な場合に便利です。ただし、これは画面のすべてのピクセルであることに注意してください。利用可能なものだけではありません。
smallestScreenWidthDp
ます。他のソリューションとは異なり、向きに関係なく、Nexus 7(600dp)で同じ値が得られます。おまけとして、それは最も単純なコードでもあります!
このメソッドを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)適切な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();
}
素晴らしい情報、まさに私が探していたもの!ただし、これを試してみたところ、ここで説明した指標を使用すると、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();
}
同じ解像度の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);
詳細はこちら ..
Androidが画面サイズを指定する方法は、4つの一般化されたサイズ(small、normal、largeおよび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);
以下のメソッドを使用して画面サイズをインチ単位で取得できます。これに基づいて、デバイスがどのタブレットまたは携帯電話かを確認できます。
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;
}
画面が7インチまたは10インチである値フォルダーに値を格納していましたが、値フォルダーを使用して任意のデバイスで実行できます。
別の2のデバイス用の別の2の値フォルダーを作成するような。しかし、これは要件によって異なります。
DisplayMetricsクラスによって提供されるデータを使用して、少し計算を行う必要があります。
あなたはheightPixelとwidthPixels(ピクセル単位の画面解像度)を持っています
「インチの画面サイズ」は常に対角線の長さを表すため、対角線が必要です。ピクセル単位で画面の対角線を取得できます(ピタゴアを使用)
agonalPixel =√(heightPixel²+widthPixels²)
次に、densityDPI値のおかげで、ピクセル値をインチに変換できます。
inchDiag = agonalPixel / densityDPI。
ここで間違いがなかったといいのですが、DisplayMetricsクラスから取得した値はコンストラクターによって与えられることに注意してください。非常にまれなケースですが、物理的なマテリアルに応じて適切に設定されていないようです...
これにより、物理的な画面サイズが得られますが、複数のレイアウトを管理するためのより良い方法とは言えません。このトピックの詳細
別の方法:
さらに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.画面幅を取得するヘルパー関数:
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;
}
ここにいくつかの便利な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
}
Resources
ではContext
: resources.displayMetrics.isTablet()
またはからWindowManager
に保存されているActivity
: val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)
displayMetrics.isTablet()