ユーザーがタブレットを使用しているか、電話を使用しているかを確認する方法はありますか?チルト機能と新しいタブレット(トランスフォーマー)に問題があります
前述したように、デバイスがタブレットであるか携帯電話であるかを確認する必要はありませんが、デバイスの機能について知りたい場合は、
ほとんどの場合、タブレットと携帯電話の違いは画面サイズであるため、異なるレイアウトファイルを使用する必要があります。これらのファイルは、res/layout-<qualifiers>
ディレクトリに保存されます。レイアウトごとにres/values-<same qualifiers>
にXMLファイルを作成し、int/bool/stringリソースをそのレイアウトに配置して、使用するレイアウトを区別できます。
ファイルres/values/screen.xml
(res/layout/
にハンドセットのレイアウトファイルが含まれていると仮定)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="screen_type">phone</string>
</resources>
ファイルres/values-sw600dp/screen.xml
(res/layout-sw600dp/
にはNexus 7などの小型タブレット用のレイアウトファイルが含まれていると仮定)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="screen_type">7-inch-tablet</string>
</resources>
ファイルres/values-sw720dp/screen.xml
(res/layout-sw720dp/
にはNexus 10などの大型タブレット用のレイアウトファイルが含まれていると仮定):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="screen_type">10-inch-tablet</string>
</resources>
これで、R.string.screen_type
定数を介して画面タイプにアクセスできます。
デバイスがタブレットかどうかを検出するには、次のコードを使用します。
public boolean isTablet(Context context) {
boolean xlarge = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE);
boolean large = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE);
return (xlarge || large);
}
大画面サイズと大画面サイズは、使用する目からの距離に基づいて製造元によって決定されます(したがって、タブレットのアイデア)。
詳細: http://groups.google.com/group/Android-developers/browse_thread/thread/d6323d81f226f93f
この投稿は私を大いに助けてくれました。
残念ながら、私を助けてくれたすべての答えを評価するのに必要な評判はありません。
デバイスがタブレットであるか電話であるかを特定する必要がありました。これにより、画面のロジックを実装できます。そして私の分析では、タブレットはMDPIから7インチ(Xlarge)以上でなければなりません。
この投稿に基づいて作成されたコードは次のとおりです。
/**
* Checks if the device is a tablet or a phone
*
* @param activityContext
* The Activity Context.
* @return Returns true if the device is a Tablet
*/
public static boolean isTabletDevice(Context activityContext) {
// Verifies if the Generalized Size of the device is XLARGE to be
// considered a Tablet
boolean xlarge = ((activityContext.getResources().getConfiguration().screenLayout &
Configuration.SCREENLAYOUT_SIZE_MASK) ==
Configuration.SCREENLAYOUT_SIZE_XLARGE);
// If XLarge, checks if the Generalized Density is at least MDPI
// (160dpi)
if (xlarge) {
DisplayMetrics metrics = new DisplayMetrics();
Activity activity = (Activity) activityContext;
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
// MDPI=160, DEFAULT=160, DENSITY_HIGH=240, DENSITY_MEDIUM=160,
// DENSITY_TV=213, DENSITY_XHIGH=320
if (metrics.densityDpi == DisplayMetrics.DENSITY_DEFAULT
|| metrics.densityDpi == DisplayMetrics.DENSITY_HIGH
|| metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM
|| metrics.densityDpi == DisplayMetrics.DENSITY_TV
|| metrics.densityDpi == DisplayMetrics.DENSITY_XHIGH) {
// Yes, this is a tablet!
return true;
}
}
// No, this is not a tablet!
return false;
}
画面の対角線のサイズを計算し、それを使用して、デバイスが電話かタブレットかを判断してみませんか?
private boolean isTablet()
{
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
display.getMetrics(displayMetrics);
int width = displayMetrics.widthPixels / displayMetrics.densityDpi;
int height = displayMetrics.heightPixels / displayMetrics.densityDpi;
double screenDiagonal = Math.sqrt( width * width + height * height );
return (screenDiagonal >= 9.0 );
}
もちろん、しきい値を9インチ以下にする必要があるかどうかを議論できます。
違いはありません。違いだと思うことを定義し、それを確認する必要があります。ギャラクシータブは電話ですか?またはタブレット?なぜ?
探している特定の機能を定義し、そのためのコードを作成する必要があります。
「傾斜」を探しているようです。これは加速度計と同じだと思います(それは言葉ですか?)。デバイスがそれをサポートしているかどうかを確認するには、次を使用します。
public class Accel extends Activity implements SensorListener {
...
SensorManager sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
boolean accelSupported = sensorMgr.registerListener(this,
SENSOR_ACCELEROMETER,
SENSOR_DELAY_UI);
...
}
( http://stuffthathappens.com/blog/2009/03/15/Android-accelerometer/ から。テストしていません)
私の想定では、「モバイル/電話」を定義するとき、「タブレット」として定義されるものではできないデバイスで電話をかけることができるかどうかを知りたいと思っています。これを確認する方法は次のとおりです。センサー、画面サイズなどに基づいて何かを知りたい場合、これは本当に別の質問です。
また、画面解像度、または大規模対xlargeのリソース管理を使用している間、過去の新しい「モバイル」デバイスでは、本当に必要なときにこの行がぼやけるほど大きな画面と高解像度が使用されるようになりました電話機能と電話機能なしを知るには、以下が「最良」です。
TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if(manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE){
return "Tablet";
}else{
return "Mobile";
}
Robert Dale Johnson IIIとHelton Isacに基づいて、このコードを思いついた
public static boolean isTablet(Context context) {
TelephonyManager manager =
(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if (manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE) {
//Tablet
return true;
} else {
//Mobile
return false;
}
}
public static boolean isTabletDevice(Context activityContext) {
// Verifies if the Generalized Size of the device is XLARGE to be
// considered a Tablet
boolean xlarge =
((activityContext.getResources().getConfiguration().screenLayout &
Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE);
// If XLarge, checks if the Generalized Density is at least MDPI (160dpi)
if (xlarge) {
DisplayMetrics metrics = new DisplayMetrics();
Activity activity = (Activity) activityContext;
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
// MDPI=160, DEFAULT=160, DENSITY_HIGH=240, DENSITY_MEDIUM=160,
// DENSITY_TV=213, DENSITY_XHIGH=320
if (metrics.densityDpi == DisplayMetrics.DENSITY_DEFAULT
|| metrics.densityDpi == DisplayMetrics.DENSITY_HIGH
|| metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM
|| metrics.densityDpi == DisplayMetrics.DENSITY_XHIGH) {
// Yes, this is a tablet!
return true;
}
}
// No, this is not a tablet!
return false;
}
そのため、コード内で次のようなフィルターを作成します
if(isTabletDevice(Utilities.this) && isTablet(Utilities.this)){
//Tablet
} else {
//Phone
}
どのデバイスがタブレットUIを使用するかを決定するGoogleのコードを参照する場合は、以下を参照してください。
// SystemUI (status bar) layout policy
int shortSizeDp = shortSize
* DisplayMetrics.DENSITY_DEFAULT
/ DisplayMetrics.DENSITY_DEVICE;
if (shortSizeDp < 600) {
// 0-599dp: "phone" UI with a separate status & navigation bar
mHasSystemNavBar = false;
mNavigationBarCanMove = true;
} else if (shortSizeDp < 720) {
// 600-719dp: "phone" UI with modifications for larger screens
mHasSystemNavBar = false;
mNavigationBarCanMove = false;
} else {
// 720dp: "tablet" UI with a single combined status & navigation bar
mHasSystemNavBar = true;
mNavigationBarCanMove = false;
}
}
この方法は、Googleが推奨する方法です。 Google Official Androidアプリiosched
にこのコードが表示されます
public static boolean isTablet(Context context) {
return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
Google IOSched 2017アプリ ソースコード では、次の方法が使用されます。
public static boolean isTablet(Context context) {
return context.getResources().getConfiguration().smallestScreenWidthDp >= 600;
}
APIレベル> = 13のみをターゲットにしている場合は、試してください
public static boolean isTablet(Context context) {
return context.getResources().getConfiguration().smallestScreenWidthDp >= 600;
}
乾杯:-)
他の回答には、デバイスが電話かタブレットかをプログラムで判断する多くの方法が記載されています。ただし、 documentation を読んだ場合、これはさまざまな画面サイズをサポートするための推奨される方法ではありません。
代わりに、タブレットまたは電話に異なるリソースを宣言します。これを行うには、layout
、values
などのリソースフォルダーを追加します。
Android 3.2(APIレベル13)の場合、sw600dp
フォルダーを追加します。つまり、smallestwidthは少なくとも600dpであり、およそ電話/タブレットの分割。ただし、他のサイズを追加することもできます。追加のレイアウトリソースファイルを追加する方法の例については、 this answer をご覧ください。
Android 3.2以前のデバイスもサポートしている場合は、タブレットをサポートするためにlarge
またはxlarge
フォルダーを追加する必要があります。 (電話は通常small
およびnormal
です。)
以下は、さまざまな画面サイズ用に追加のxmlファイルを追加した後のリソースのイメージです。
この方法を使用する場合、システムがすべてを決定します。実行時にどのデバイスが使用されているかを心配する必要はありません。適切なリソースを提供するだけで、Androidがすべての作業を実行できます。
注
「新しく」受け入れられたディレクトリ(values-sw600dpなど)を考えて、画面の幅DPに基づいてこのメソッドを作成しました。
public static final int TABLET_MIN_DP_WEIGHT = 450;
protected static boolean isSmartphoneOrTablet(Activity act){
DisplayMetrics metrics = new DisplayMetrics();
act.getWindowManager().getDefaultDisplay().getMetrics(metrics);
int dpi = 0;
if (metrics.widthPixels < metrics.heightPixels){
dpi = (int) (metrics.widthPixels / metrics.density);
}
else{
dpi = (int) (metrics.heightPixels / metrics.density);
}
if (dpi < TABLET_MIN_DP_WEIGHT) return true;
else return false;
}
このリストには、人気のあるデバイスとタブレットサイズのDPがいくつかあります。
Wdp/Hdp
GALAXY Nexus:360/567
XOOM:1280/752
GALAXY NOTE:400/615
NEXUS 7:961/528
GALAXY TAB(> 7 && <10):1280/752
GALAXY S3:360/615
Wdp =幅dp
Hdp =高さdp
まあ、私のために働いた最高の解決策は非常に簡単です:
private boolean isTabletDevice(Resources resources) {
int screenLayout = resources.getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
boolean isScreenLarge = (screenLayout == Configuration.SCREENLAYOUT_SIZE_LARGE);
boolean isScreenXlarge = (screenLayout == Configuration.SCREENLAYOUT_SIZE_XLARGE);
return (isScreenLarge || isScreenXlarge);
}
このように使用します:
public void onCreate(Bundle savedInstanceState) {
[...]
if (this.isTabletDevice(this.getResources()) == true) {
[...]
}
}
私は本当にピクセルサイズを見たくありませんが、画面サイズのみに依存しています。
Nexus 7(LARGE)はタブレットとして検出されますが、Galaxy S3(NORMAL)は検出されません。
デバイスがタブレットのときにtrueを返すこのメソッドを使用します
public boolean isTablet(Context context) {
return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
画面サイズの検出が新しいデバイスで正しい値を返さない場合は、試してください:
/*
Returns '1' if device is a tablet
or '0' if device is not a tablet.
Returns '-1' if an error occured.
May require READ_EXTERNAL_STORAGE
permission.
*/
public static int isTablet()
{
try
{
InputStream ism = Runtime.getRuntime().exec("getprop ro.build.characteristics").getInputStream();
byte[] bts = new byte[1024];
ism.read(bts);
ism.close();
boolean isTablet = new String(bts).toLowerCase().contains("tablet");
return isTablet ? 1 : 0;
}
catch (Throwable t)
{t.printStackTrace(); return -1;}
}
Android 4.2.2でテスト済み(私の英語は申し訳ありません。)
public boolean isTablet() {
int screenLayout = getResources().getConfiguration().screenLayout;
return (Build.VERSION.SDK_INT >= 11 &&
(((screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) ||
((screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE)));
}
携帯電話とタブレットの間に線を引くことはますます難しくなっています。たとえば(2015年8月現在) Samsung Mega 6. デバイスはsw600dpフォルダーからリソースを取得します-Androidに関する限り、タブレットです。
@ Vyshnavi からの回答は、Mega 6.3ではなく、テストしたすべてのデバイスで機能します。
@ Helton Isac 上記の答えはMega 6.3を電話として返します-しかし、デバイスはまだsw600dpからリソースを取得するため、他の問題を引き起こす可能性があります-たとえば、タブレットではなく電話でビューページャーを使用する場合NPEエラーが発生します。
最終的には、チェックする条件が多すぎるように思われ、一部の電話は実際にはタブレットであることを受け入れる必要があります:-P
ナビゲーションコードを使用しているため、レイアウトファイルでのみスマートフォン/タブレットを検出する必要がありました。
最初に行ったのは、layout-sw600dpディレクトリを作成することでしたが、Nokia 8で横長モードでアクティブになるため、うまく機能しませんでしたが、画面の高さが小さすぎます。
そのため、ディレクトリの名前をlayout-sw600dp-h400dpに変更すると、目的の効果が得られました。 h-xxxdpパラメータは、レイアウトにドロップするコンテンツの量に依存する必要があります。そのため、アプリケーションに依存する必要があります。
なぜこれを使用するのですか?
Use this method which returns true when the device is a tablet
public boolean isTablet(Context context) {
return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
上記の多くの方法がありますが、構成クラスはすぐ下に正しい答えを取得しています:
/**
* Check if the Configuration's current {@link #screenLayout} is at
* least the given size.
*
* @param size The desired size, either {@link #SCREENLAYOUT_SIZE_SMALL},
* {@link #SCREENLAYOUT_SIZE_NORMAL}, {@link #SCREENLAYOUT_SIZE_LARGE}, or
* {@link #SCREENLAYOUT_SIZE_XLARGE}.
* @return Returns true if the current screen layout size is at least
* the given size.
*/
public boolean isLayoutSizeAtLeast(int size) {
int cur = screenLayout&SCREENLAYOUT_SIZE_MASK;
if (cur == SCREENLAYOUT_SIZE_UNDEFINED) return false;
return cur >= size;
}
ただ電話:
getResources().getConfiguration().
isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE);
大丈夫です?
以下の方法は、デバイス画面の対角線の長さを計算して、デバイスが携帯電話またはタブレットであると判断することです。この方法の唯一の懸念は、デバイスがタブレットかどうかを判断するためのしきい値です。以下の例では、7インチ以上に設定します。
public static boolean isTablet(Activity act)
{
Display display = act.getWindow().getWindowManager().getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
display.getMetrics(displayMetrics);
float width = displayMetrics.widthPixels / displayMetrics.xdpi;
float height = displayMetrics.heightPixels / displayMetrics.ydpi;
double screenDiagonal = Math.sqrt( width * width + height * height );
int inch = (int) (screenDiagonal + 0.5);
Toast.makeText(act, "inch : "+ inch, Toast.LENGTH_LONG).show();
return (inch >= 7 );
}
パッケージマネージャーのcom.sec.feature.multiwindow.tabletはタブレットのみに固有であり、com.sec.feature.multiwindow.phoneは電話に固有です。
これはあなたの質問に対する直接的な答えではないことを知っていますが、ここでの他の答えは画面サイズを識別する方法の良いアイデアを与えます。あなたはあなたの質問で、傾きに問題があり、これが私にも起こったと書いた。
スマートフォンでジャイロスコープ(または回転センサー)を実行する場合、x軸とy軸は、デバイスのデフォルトの向き(たとえば、Samsung GS2がデフォルトのポートレート、Samsung GT-7310デフォルトの風景、新しいGoogle Nexus 7はタブレットですが、デフォルトの肖像です!)。
ジャイロスコープを使用したい場合は、スマートフォン用の実用的なソリューションになる可能性がありますが、一部のタブレットまたは他の方法で軸が混乱します。
上記のソリューションのいずれかを使用して、画面サイズのみに適用してから適用する場合
SensorManager.remapCoordinateSystem(inputRotationMatrix, SensorManager.AXIS_X,
SensorManager.AXIS_Y, outputRotationMatrix);
画面サイズが大きいまたは大きい場合に軸を反転させると、90%のケースで機能する可能性がありますが、たとえば、Nexus 7では問題が発生します(デフォルトの縦向きと画面サイズが大きいため)。
これを修正する最も簡単な方法は、マニフェストでsceenOrientationをnosensor
に設定することにより、APIデモに付属のRotationVectorSampleで提供されます。
<activity
...
Android:screenOrientation="nosensor">
...
</activity>
これは私が使用する方法です:
public static boolean isTablet(Context ctx){
return = (ctx.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
を使用して:
これが推奨される方法です!