ユーザーがタブレットまたは電話を使用しているかどうかを確認する方法はありますか? チルト機能と新しいタブレット (Transformer) に問題があります
30 に答える
前に述べたように、デバイスがタブレットか電話かを確認したくないが、デバイスの機能について知りたい場合は、
ほとんどの場合、タブレットと電話の違いは画面サイズです。そのため、さまざまなレイアウトファイルを使用する必要があります。これらのファイルはres/layout-<qualifiers>
ディレクトリに保存されます。レイアウトごとにdirectoyにXMLファイルを作成しres/values-<same qualifiers>
、int / bool / stringリソースをその中に入れて、使用するレイアウトを区別することができます。
例:
ファイル(受話器のレイアウトファイルが含まれているとres/values/screen.xml
仮定)res/layout/
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="screen_type">phone</string>
</resources>
ファイル( Nexus 7などの小さなタブレットのレイアウトファイルが含まれているとres/values-sw600dp/screen.xml
仮定)res/layout-sw600dp/
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="screen_type">7-inch-tablet</string>
</resources>
ファイル( Nexus 10などの大型タブレットのレイアウトファイルが含まれているとres/values-sw720dp/screen.xml
仮定):res/layout-sw720dp/
<?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);
}
LARGE および XLARGE 画面サイズは、使用する目からの距離に基づいて製造元によって決定されます (したがって、タブレットの概念)。
詳細: 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/から。私はそれをテストしていません)
私の推測では、'Mobile/Phone' を定義するときに、'タブレット' として定義されるものではできないデバイスで電話をかけることができるかどうかを知りたいと考えています。これを確認する方法は次のとおりです。センサー、画面サイズなどに基づいて何かを知りたい場合、これは実際には別の質問です.
また、画面解像度を使用している間、またはリソース管理を大きいものと大きいものとの間で行うことは、過去には有効なアプローチであった可能性があります通話機能と通話機能がないことを知るには、以下が「最適」です。
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
}
この方法はGoogleが推奨しています。このコードは Google 公式 Android アプリに表示されますiosched
public static boolean isTablet(Context context) {
return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
タブレット 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;
}
}
APIレベル>= 13のみをターゲットにしている場合は、試してください
public static boolean isTablet(Context context) {
return context.getResources().getConfiguration().smallestScreenWidthDp >= 600;
}
乾杯 :-)
デバイスがタブレットの場合にtrueを返すこのメソッドを使用します
public boolean isTablet(Context context) {
return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
「新しい」受け入れられたディレクトリ(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
これは私が使用する方法です:
public static boolean isTablet(Context ctx){
return = (ctx.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
使用:
おすすめの方法はこれ!
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)));
}
これがあなたの質問に対する直接の回答ではないことは承知していますが、ここでの他の回答は、画面サイズを特定する方法の良いアイデアを提供します. あなたは質問に、傾斜に問題があると書いていましたが、これは私にも起こりました。
スマートフォンでジャイロスコープ (または回転センサー) を実行する場合、x 軸と y 軸は、そのデバイスのデフォルトの向きに従って、タブレットとは異なる方法で定義できます (たとえば、Samsung GS2 はデフォルトの縦向きで、Samsung GT-7310 は縦向きです)。デフォルトの横向き、新しい Google Nexus 7 はデフォルトの縦向きですが、タブレットです!)。
ジャイロスコープを使用したい場合、スマートフォン用の実用的なソリューションになる可能性がありますが、一部のタブレットでは軸が混乱するか、その逆です。
上記のソリューションのいずれかを使用して画面サイズのみを選択してから適用する場合
SensorManager.remapCoordinateSystem(inputRotationMatrix, SensorManager.AXIS_X,
SensorManager.AXIS_Y, outputRotationMatrix);
大画面または特大画面サイズの場合に軸を反転するには、これは 90% のケースで機能する可能性がありますが、たとえば Nexus 7 では問題が発生します (デフォルトの縦向きで画面サイズが大きいため)。
これを修正する最も簡単な方法は、API デモに同梱されている RotationVectorSample で提供されておりnosensor
、マニフェストで sceenOrientation を に設定します。
<activity
...
android:screenOrientation="nosensor">
...
</activity>
なぜこれを使うのですか?
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;
}
上記の多くの方法が表示されます.Configurationクラスはすぐ下に正しい答えを持っています:
/**
* 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);
大丈夫です?
携帯電話とタブレットの境界線を引くことはますます難しくなっています。たとえば (2015 年 8 月現在)、Samsung Mega 6.3デバイスは sw600dp フォルダーからリソースをプルします。つまり、Android に関する限り、それはタブレットです。
@Vyshnaviからの回答は、テストしたすべてのデバイスで機能しますが、Mega 6.3 では機能しません。
上記の@Helton Isacの回答はMega 6.3を電話として返します-しかし、デバイスはまだsw600dpからリソースを取得しているため、他の問題を引き起こす可能性があります-たとえば、タブレットではなく電話にviewpagerを使用すると、NPEエラーが発生します.
最終的には、チェックする条件が多すぎるように思われ、一部の電話が実際にはタブレットであることを受け入れる必要があるかもしれません :-P
以下のメソッドは、デバイスの画面の対角線の長さを計算して、デバイスが電話またはタブレットであることを判断します。この方法の唯一の関心事は、デバイスがタブレットかどうかを判断するためのしきい値です。以下の例では、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 );
}
タブレットの幅と高さは最小および最大600ピクセルだと思います。その
ため、値を取得するには
、画面密度と高さ/幅をdpで知る必要があります。
DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
Display display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
float density = metrics.density;
if((width/density>=600 && height/density>=600))
isTablette = true;
else
isTablette = false;
Android ライブラリ 'caffeine' をお勧めします。これには、10 インチの携帯電話やタブレットが含まれています。
非常に使いやすい。
ライブラリはここにあります。
https://github.com/ShakeJ/Android-Caffeine-library
と使用
DisplayUtil.isTablet(this);
DisplayUtil.isTenInch(this);
たとえば、電話とタブレットの間に (少なくとも私のプログラムでは) 重要な違いが 1 つあります。デバイスのデフォルトの向きです。電話は縦向き、タブレットは横向きです。そして、デバイスを決定するためのそれぞれの方法:
private static boolean isLandscapeDefault(Display display) {
Log.d(TAG, "isTablet()");
final int width = display.getWidth();
final int height = display.getHeight();
switch (display.getOrientation()) {
case 0: case 2:
if(width > height) return true;
break;
case 1: case 3:
if(width < height) return true;
break;
}
return false;
}
EDITED: Dan Hulme との議論に続いて、メソッドの名前が変更されました。
以下のコードをチェックしてください。
private boolean isTabletDevice() {
if (android.os.Build.VERSION.SDK_INT >= 11) { // honeycomb
// test screen size, use reflection because isLayoutSizeAtLeast is
// only available since 11
Configuration con = getResources().getConfiguration();
try {
Method mIsLayoutSizeAtLeast = con.getClass().getMethod(
"isLayoutSizeAtLeast", int.class);
boolean r = (Boolean) mIsLayoutSizeAtLeast.invoke(con,
0x00000004); // Configuration.SCREENLAYOUT_SIZE_XLARGE
return r;
} catch (Exception x) {
x.printStackTrace();
return false;
}
}
return false;
}
これが正直に言う最も簡単な方法だと思います。これにより、使用されている画面サイズがチェックされます。
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
頑張ってください!