ユーザーがタブレットまたは電話を使用しているかどうかを確認する方法はありますか?チルト機能と新しいタブレット(Transformer)に問題があります
ユーザーがタブレットまたは電話を使用しているかどうかを確認する方法はありますか?チルト機能と新しいタブレット(Transformer)に問題があります
回答:
前述したように、デバイスがタブレットであるか電話であるかを確認する必要はありませんが、デバイスの機能について知りたいです。
ほとんどの場合、タブレットと電話の違いは画面サイズです。そのため、さまざまなレイアウトファイルを使用します。これらのファイルは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);
}
LARGEおよびXLARGEの画面サイズは、それらが使用される目からの距離に基づいて製造元によって決定されます(したがって、タブレットのアイデアです)。
詳細:http : //groups.google.com/group/android-developers/browse_thread/thread/d6323d81f226f93f
Configuration.SCREENLAYOUT_SIZE_XLARGE
ため、定数を使用する必要はなく、を使用できます>= LARGE
。
この投稿は私を大いに助けました、
残念ながら、私を助けてくれたすべての答えを評価するのに必要な評判はありません。
私は自分のデバイスがタブレットか電話かを識別する必要があり、それによって画面のロジックを実装できるようになります。そして私の分析では、タブレットは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;
}
}
shortSize
何ですか?
この方法は、Googleによる推奨です。このコードはGoogle Offical Androidアプリに表示されますiosched
public static boolean isTablet(Context context) {
return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
public static bool isTablet (Context context) { return (context.Resources.Configuration.ScreenLayout & Android.Content.Res.ScreenLayout.SizeMask) >= Android.Content.Res.ScreenLayout.SizeLarge; }
他の回答には、デバイスが電話かタブレットかをプログラムで判断する多くの方法がリストされています。ただし、ドキュメントを読んだ場合、それはさまざまな画面サイズをサポートするための推奨される方法ではありません。
代わりに、タブレットまたは電話用に異なるリソースを宣言します。これを行うには、追加のリソースフォルダーを追加しますlayout
、values
など
Android 3.2(APIレベル13)の場合は、sw600dp
フォルダーを追加します。この手段だ mallest W IDTHは約携帯電話/タブレットの分割である、少なくとも600dpです。ただし、他のサイズを追加することもできます。追加のレイアウトリソースファイルを追加する方法の例については、この回答を確認してください。
Android 3.2より前のデバイスもサポートしている場合は、タブレットをサポートするためにlarge
またはxlarge
フォルダーを追加する必要があります。(フォンは一般的にsmall
とnormal
です。)
これは、さまざまな画面サイズ用に追加のxmlファイルを追加した後のリソースのイメージです。
この方法を使用すると、システムがすべてを決定します。実行時にどのデバイスが使用されているかを気にする必要はありません。適切なリソースを提供し、Androidにすべての作業を任せます。
ノート
APIレベル> = 13のみをターゲットにしている場合は、
public static boolean isTablet(Context context) {
return context.getResources().getConfiguration().smallestScreenWidthDp >= 600;
}
乾杯:-)
「新しい」受け入れられたディレクトリ(たとえば、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注: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でテスト済み(英語で申し訳ありません。)
これはあなたの質問に対する直接の回答ではありませんが、ここでの他の回答は画面サイズを識別する方法の良いアイデアを提供します。あなたはあなたの質問にあなたが傾けの問題を抱えていると書いています、そしてこれはちょうど私にも起こりました。
スマートフォンでジャイロスコープ(または回転センサー)を実行する場合、デバイスのデフォルトの向きに応じて、x軸とy軸をタブレット上とは異なる方法で定義できます(たとえば、Samsung GS2はデフォルトの縦向きで、Samsung GT-7310はデフォルトの横向き、新しいGoogle Nexus 7はデフォルトの縦向きですが、タブレットです!)。
ジャイロスコープを使用したい場合は、スマートフォン向けの実用的なソリューションになるかもしれませんが、一部のタブレットまたはその逆では軸が混乱します。
上記の解決策のいずれかを使用して画面サイズのみにしてから適用する場合
SensorManager.remapCoordinateSystem(inputRotationMatrix, SensorManager.AXIS_X,
SensorManager.AXIS_Y, outputRotationMatrix);
画面サイズが大きい場合やxlargeの場合に軸を反転させると、ケースの90%で機能する可能性がありますが、たとえば、Nexus 7ではデフォルトの縦向きと大きい画面サイズがあるため、問題が発生します。
これを修正する最も簡単な方法nosensor
は、マニフェストでsceenOrientationをに設定することにより、APIデモに付属するRotationVectorSampleで提供されています。
<activity
...
android:screenOrientation="nosensor">
...
</activity>
以下の方法は、デバイスが電話かタブレットかを決定するためにデバイス画面の対角線の長さを計算しています。この方法の唯一の問題は、デバイスがタブレットかどうかを判断するためのしきい値です。以下の例では、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 );
}
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.3デバイスはsw600dpフォルダーからリソースを取得します-Androidに関する限り、それはタブレットです。
@Vyshnaviからの回答は、テスト済みのすべてのデバイスで機能しますが、Mega 6.3では機能しません。
上記の@Helton Isacの回答では、Mega 6.3が電話として返されます。ただし、デバイスはsw600dpからリソースを取得するため、他の問題を引き起こす可能性があります。たとえば、タブレットではなく電話でビューページャーを使用すると、NPEエラーが発生します。 。
結局のところ、チェックする条件が多すぎるようで、一部の電話が実際にはタブレットであることを受け入れる必要があるかもしれません:-P
これは私が使用する方法です:
public static boolean isTablet(Context ctx){
return = (ctx.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK)
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
使用:
これは推奨される方法です!
なぜこれを使うのですか?
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);
大丈夫です?
以下のコードをチェックしてください。
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;
}
私はタブレットが最小と最大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;
たとえば、携帯電話とタブレットの間には(少なくとも私のプログラムでは)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;
}
編集:Dan Hulmeとの議論の後、メソッドの名前が変更されました。
私はアンドロイドライブラリ 'カフェイン'をお勧めします。これには、get Phoneまたはタブレット、および10インチが含まれています。
とても簡単に使えます。
ライブラリはこちらです。
https://github.com/ShakeJ/Android-Caffeine-library
そして使う
DisplayUtil.isTablet(this);
DisplayUtil.isTenInch(this);
私にとって、携帯電話とタブレットの違いは、デバイスのサイズやピクセル密度ではなく、テクノロジーや好みによって変わるのではなく、画面の比率です。テキストの画面を表示している場合、たとえば、15行の長い行(電話)と20行の短い行(タブレット)が必要かどうかを知る必要があります。私のゲームでは、ソフトウェアが処理する四角形の大まかな見積もりに以下を使用します。
Rect surfaceRect = getHolder().getSurfaceFrame();
screenWidth = surfaceRect.width();
screenHeight = surfaceRect.height();
screenWidthF = (float) screenWidth;
screenHeightF = (float) screenHeight;
widthheightratio = screenWidthF/screenHeightF;
if(widthheightratio>=1.5) {
isTablet=false;
}else {
isTablet=true;
}