タブレットまたは電話-Android


140

ユーザーがタブレットまたは電話を使用しているかどうかを確認する方法はありますか?チルト機能と新しいタブレット(Transformer)に問題があります


26
あなたは間違った質問をしています。デバイスが電話、タブレット、テレビ、トースター、ティーカップ、または温度計であるかどうかは関係ありません。重要なのは機能であり、マーケティングで定義されたデバイスのクラスではありません。探している機能と、デバイスにそのような機能があるかどうかを検出する方法、またはそのような機能のないデバイスをマーケットから除外する方法を説明するAndroidの新しい質問をしてください。
CommonsWare

7
@CommonsWare:画面が大きいデバイスに機能を追加したい場合があります。
ボブズ

10
@breceivemail:つまり、デバイスの画面が大きいかどうかを確認する必要があります。「画面が大きい」!=「タブレット」。
CommonsWare、2012年

2
より良い答えはここにあります: stackoverflow.com/a/9308284/1750829 単純です:-)
またはKazaz

3
このページ全体に反対票を投じたい!電話はテレフォニーを行いますが、タブレットは行いません。ほとんどすべての提案は、誰も使用してはならない汚いハックです。誰も二度とこのページを見ないならば、世界はより良い場所でしょう!
MarkGjøl2013年

回答:


122

前述したように、デバイスがタブレットであるか電話であるかを確認する必要はありませんが、デバイスの機能について知りたいです。

ほとんどの場合、タブレットと電話の違いは画面サイズです。そのため、さまざまなレイアウトファイルを使用します。これらのファイルはres/layout-<qualifiers>ディレクトリに保存されます。res/values-<same qualifiers>各レイアウトのディレクトリにXMLファイルを作成し、それにint / bool / stringリソースを挿入して、使用するレイアウトを区別できます。

例:

ファイルres/values/screen.xmlres/layout/ハンドセット用のレイアウトファイルが含まれていると想定)

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="screen_type">phone</string>
</resources>


ファイルres/values-sw600dp/screen.xmlres/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.xmlres/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定数を介してアクセス可能になります。


4
+1。すばらしい答えです。タブレット/携帯電話を実際に確認したい理由をより深く理解できるからです。とにかく、携帯電話が小さなタブレットになる瞬間に近づいています;)
andr

これはGalaxy Noteや新しいNexus 6などの大型電話にどのように適用されますか?この手法を使用すると、これらの大きなデバイスは電話またはタブレットとして検出されますか?
PerracoLabs 14年

1
残念ながら、このアプローチはSamsung Mega 6.3デバイスでは機能せず、タブレット(sw600dp)として返します。これをキャプチャする他のアイデアはありますか?
bkurzius

タブレットは電話をかけますか?
Mike

61

デバイスがタブレットかどうかを検出するには、次のコードを使用します。

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


Kindle FireとMotorola Droid Bionicの両方で-SCREENLAYOUT_SIZE_MASK == 15.では、ソリューションが機能するのはなぜですか?
IgorGanapolsky

これはKindle Fireでも同じだと思います。今日はバイオニックを持っていません...しかし、友達が町に戻ってきたら、数日後にチェックします。しかし、私はHelton Isacの答えをテストしてきましたが、それは美しく機能します。こちらもご確認ください。
petey

4
があるConfiguration.SCREENLAYOUT_SIZE_XLARGEため、定数を使用する必要はなく、を使用できます>= LARGE
Triang3l 2013年

2
Galaxy NoteがSCREENLAYOUT_SIZE_LARGEを報告するようで、タブレットとして誤って分類される
miguelSantirso 2013年

1
デバイスフォントが小さく、設定で表示サイズが小さい場合、このケースはtrueが返されます。
2017

38

この投稿は私を大いに助けました、

残念ながら、私を助けてくれたすべての答えを評価するのに必要な評判はありません。

私は自分のデバイスがタブレットか電話かを識別する必要があり、それによって画面のロジックを実装できるようになります。そして私の分析では、タブレットは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;
}

2
私が見つけた最善の解決策、ヘルトン・アイザックに感謝します!おそらく、より良い解決策として、画面のインチのチェックを追加できますか?とにかく、このソリューションでは10
Aracem

7
私は本当に反対します。これは、特定の画面サイズを見つける方法です。繰り返しますが、私が答えたように、タブレットと電話の間に違いはありません。これは質問に対する答えではありません。1の違いがないため、区別することはできません。特定の機能に対してコード化する必要がある場合(特定の画面サイズに対して行うように見える場合など)は、コード化する必要がありますが、タブレットと電話ではありません。トピックスターターは、特定の傾斜機能で線を引くように見えました。thourouglyに関する@commonwareのコメントを読んでください。
ナンヌ

1
私はNanneに同意しますが、先ほど述べたように、私のアプリケーションでは、画面が十分に大きい場合は2つのパネルを表示する必要があります。この場合、画面ロジックがJava側にあったため、レイアウトを使用できません。
Helton Isac

3
ヘルトン、これはthx。Kindle Fire:false、Moto Xoom(v1):true、Galaxy Note:false、Galaxy Tab 10.1制限:true
petey


12

画面の対角線のサイズを計算し、それを使用してデバイスが携帯電話かタブレットかを判断しないのはなぜですか?

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インチ以下にするかどうかを議論することもできます。


これは動作していない...単に一部の電話機は、間違った濃度値を報告し、インチ単位の計算が失敗した-そこを参照してください。stackoverflow.com/questions/2193457/...を
ステン

さて、私は7インチタブレット(ポケットサイズ)が好きで、この答えは私が思う最高のものです。しかし、戻ります(screenDiagonal> = 9.0); 返す必要があります(screenDiagonal> = 6.5)。ただし、質問へのコメントでコメントされているように、使用に依存します。
JanBergström18年

11

違いはありません。あなたは自分が何が違いだと思うかを定義し、それをチェックするべきです。銀河のタブは電話ですか?またはタブレット?なぜ?

探している特定の機能とそのためのコードを定義する必要があります。

「傾き」を探しているようです。これは加速度計と同じだと思います(一言?)。次のコマンドを使用して、デバイスがサポートしているかどうかを確認できます。

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/から。私はテストしていません)


チルト機能と新しいタブレット(Transformer)に問題があります
Benny

馬鹿げた答えのようなものです-もちろん違いがあります。Galaxy = phone。どうして?製造元によると「スマートフォン」なので。あなたが彼がサイズや電話をかける能力などをチェックする必要があることをほのめかしているなら...何か言ってください。
デイブ、

3
一部のタブレットにはこれらのセンサーが搭載されていますが、携帯電話によっては機能しない場合があります。それが違いがないという私の最初の答えである理由です。とにかく、私はあなたが試す必要があるいくつかのコードを追加しました。
ナンヌ

2
問題は、タブレットが横向きモードで「ビルド」されるため、アプリが縦向きモードで実行されると予想されるときに、加速度計のx軸とy軸が反転することです。これはかなり混乱する可能性があります:)したがって、タブレットで実行しているかどうかを確認することが重要です。
pumpkee

1
しかし、それが逆の方法です=>それがデバイスをタブレットにする唯一のものである場合は、x / y軸がどのように機能するかを調べる必要があります。逆の方法ではありません。ちなみに、これがすべてのタブレットや携帯電話に当てはまるのか疑問に思いますか?
Nanne

10

私の仮定は、「モバイル/電話」を定義するときに、「タブレット」として定義されるものでは実行できないデバイスで電話をかけることができるかどうかを知りたいということです。これを確認する方法は次のとおりです。センサー、画面サイズなどに基づいて何かを知りたい場合、これは本当に別の質問です。

また、画面の解像度、またはリソース管理のラージとxlargeを使用している間、これまでの有効なアプローチであった可能性があります。通話機能と通話機能がないことを知るには、以下が「最適」です。

TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if(manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE){
    return "Tablet";
}else{
    return "Mobile";
}

9
一部のタブレットは電話が可能で、GSMまたはCDMAタイプを備えています。そのため、ソリューションも完璧ではありません。
arnouf

6

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
}

5

Google IOSched 2017アプリのソースコードでは、次の方法が使用されます。

public static boolean isTablet(Context context) {
    return context.getResources().getConfiguration().smallestScreenWidthDp >= 600;
}

3

タブレット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;
        }
        }

2
の価値はshortSize何ですか?
kc ochibili 2013

3

この方法は、Googleによる推奨です。このコードはGoogle Offical Androidアプリに表示されますiosched

public static boolean isTablet(Context context) {
        return (context.getResources().getConfiguration().screenLayout
                & Configuration.SCREENLAYOUT_SIZE_MASK)
                >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}

このソリューションは、たとえば、API 18およびNexus 7 1200 x 1920 xhdpiを使用するエミュレータでは機能しません。
2014年

1
実際のデバイスでテストする必要があります:)
hqt 2014年

私はエミュレータでテストしていると「isTablet(コンテキストコンテキスト)の結果は偽だったエミュレータ上の自己で試してみてください。。
インゴ・

1
この@hqtをありがとう、これをXamarin Studioに必要なC#にトランスコードしました:public static bool isTablet (Context context) { return (context.Resources.Configuration.ScreenLayout & Android.Content.Res.ScreenLayout.SizeMask) >= Android.Content.Res.ScreenLayout.SizeLarge; }
Phil Ryan

2

コードは不要

他の回答には、デバイスが電話かタブレットかをプログラムで判断する多くの方法がリストされています。ただし、ドキュメントを読んだ場合、それはさまざまな画面サイズをサポートするための推奨される方法ではありません。

代わりに、タブレットまたは電話用に異なるリソースを宣言します。これを行うには、追加のリソースフォルダーを追加しますlayoutvaluesなど

  • Android 3.2(APIレベル13)の場合は、sw600dpフォルダーを追加します。この手段 mallest W IDTHは約携帯電話/タブレットの分割である、少なくとも600dpです。ただし、他のサイズを追加することもできます。追加のレイアウトリソースファイルを追加する方法の例については、この回答を確認してください。

  • Android 3.2より前のデバイスもサポートしている場合は、タブレットをサポートするためにlargeまたはxlargeフォルダーを追加する必要があります。(フォンは一般的にsmallnormalです。)

これは、さまざまな画面サイズ用に追加のxmlファイルを追加した後のリソースのイメージです。

ここに画像の説明を入力してください

この方法を使用すると、システムがすべてを決定します。実行時にどのデバイスが使用されているかを気にする必要はありません。適切なリソースを提供し、Androidにすべての作業を任せます。

ノート

  • エイリアスを使用できますをして、同じリソースファイルの重複を回避できます。

読む価値のあるAndroidドキュメント



1

「新しい」受け入れられたディレクトリ(たとえば、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


1

まあ、私のために働いた最良の解決策は非常に簡単です:

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)は検出されません。


1

デバイスがタブレットの場合にtrueを返すこのメソッドを使用します

public boolean isTablet(Context context) {  
    return (context.getResources().getConfiguration().screenLayout   
        & Configuration.SCREENLAYOUT_SIZE_MASK)    
        >= Configuration.SCREENLAYOUT_SIZE_LARGE; 
}

このソリューションは、たとえば、API 18およびNexus 7 1200 x 1920 xhdpiを使用するエミュレータでは機能しません。
2014年

これは一部のデバイスでは機能しなくなりました。たとえば、Samsung Megaデバイスの場合はfalseを返します
bkurzius

ええ..これはもう機能しません...私は実際には、各フォルダーの値、values_largeなどのすべての文字列ファイルにブール値を追加しました<bool name = "isTablet"> false </ bool> <bool name = "isLargeTablet"> false </ bool>次に、R.bool.isTabletがtrueかどうかをチェックして、デバイスがタブレットかどうかを確認します
Vyshnavi

1

新しいデバイスで画面サイズの検出が正しい値を返さない場合は、試してください:

/*
 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でテスト済み(英語で申し訳ありません。)


0

これはあなたの質問に対する直接の回答ではありませんが、ここでの他の回答は画面サイズを識別する方法の良いアイデアを提供します。あなたはあなたの質問にあなたが傾けの問題を抱えていると書いています、そしてこれはちょうど私にも起こりました。

スマートフォンでジャイロスコープ(または回転センサー)を実行する場合、デバイスのデフォルトの向きに応じて、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>

0

パッケージマネージャーのcom.sec.feature.multiwindow.tabletはタブレットにのみ固有で、com.sec.feature.multiwindow.phoneは電話に固有です。


0

以下の方法は、デバイスが電話かタブレットかを決定するためにデバイス画面の対角線の長さを計算しています。この方法の唯一の問題は、デバイスがタブレットかどうかを判断するためのしきい値です。以下の例では、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 );
}

0
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)));
    }

0

携帯電話とタブレットの間に線を引くことがますます難しくなっています。たとえば(2015年8月現在)Samsung Mega 6.3デバイスはsw600dpフォルダーからリソースを取得します-Androidに関する限り、それはタブレットです。

@Vyshnaviからの回答は、テスト済みのすべてのデバイスで機能しますが、Mega 6.3では機能しません。

上記の@Helton Isacの回答では、Mega 6.3が電話として返されます。ただし、デバイスはsw600dpからリソースを取得するため、他の問題を引き起こす可能性があります。たとえば、タブレットではなく電話でビューページャーを使用すると、NPEエラーが発生します。 。

結局のところ、チェックする条件が多すぎるようで、一部の電話が実際にはタブレットであることを受け入れる必要があるかもしれません:-P


0

これは私が使用する方法です:

public static boolean isTablet(Context ctx){    
    return = (ctx.getResources().getConfiguration().screenLayout 
    & Configuration.SCREENLAYOUT_SIZE_MASK) 
    >= Configuration.SCREENLAYOUT_SIZE_LARGE; 
}

使用:

構成。SCREENLAYOUT_SIZE_MASK

構成。SCREENLAYOUT_SIZE_LARGE

これは推奨される方法です!


-1の説明?、これはグーグルが推奨する方法です。
Jorgesys 2016年

0

なぜこれを使うのですか?

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);

大丈夫です?


0

ナビゲーションコードを使用しているため、レイアウトファイルでのみスマートフォン/タブレットを検出する必要がありました。

私が最初に行ったのは、layout-sw600dpディレクトリを作成することでしたが、Nokia 8で横向きモードでアクティブになるため、うまく機能しませんでしたが、画面の高さが小さすぎます。

そこで、ディレクトリの名前をlayout-sw600dp-h400dpに変更したところ、目的の効果が得られました。h-xxxdpパラメータは、レイアウトにドロップするコンテンツの量に依存する必要があり、アプリケーションに依存する必要があります。


-1

以下のコードをチェックしてください。

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;
}

1
ICSでは無効になりました。実際、Androidバージョンが11以下のタブレットがあります
mdelolmo '14

1
これは信頼できません。新しいICSの携帯電話は持っているAPIレベル> 11
ジェイソン・ロビンソン

-1

私はタブレットが最小と最大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;


なぜならサムスンがギャラクシーS3 resultion X 1280 720これは適切ではない
ニキル

-1

たとえば、携帯電話とタブレットの間には(少なくとも私のプログラムでは)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との議論の後、メソッドの名前が変更されました。


1
すべてのタブレットにデフォルトの横向きがあるわけではありません。そして、「デフォルト」の向きがプログラムにとって重要である場合、それはおそらく他の点で間違っています。例については、このAndroid開発者のブログ投稿参照してください
Dan Hulme、2012年

タブレットの具体的な例を教えてください。デフォルトの向きでは、幅は高さよりも小さいですか?そしてもちろん、あなたは私のアプリが何であるべきかをよく知っています:D。
シルバー

Nexus 7はその一例です。しかし、あなたは私の言葉を信じる必要はありません。それをすべて説明している私がリンクした記事を読んでください。
Dan Hulme、2012年

メソッドの名前を変更する必要があると思います。実際、より重要なことは(少なくとも私のアプリでは;))デフォルトのデバイスの向きであり、私の方法はこのタスクに適しています。また、問題を非常に正確に特定しました。@ Nanne回答。上記を参照してください。
シルバー

-1

私はアンドロイドライブラリ 'カフェイン'をお勧めします。これには、get Phoneまたはタブレット、および10インチが含まれています。

とても簡単に使えます。

ライブラリはこちらです。

https://github.com/ShakeJ/Android-Caffeine-library

そして使う

DisplayUtil.isTablet(this);
DisplayUtil.isTenInch(this);

-1

私にとって、携帯電話とタブレットの違いは、デバイスのサイズやピクセル密度ではなく、テクノロジーや好みによって変わるのではなく、画面の比率です。テキストの画面を表示している場合、たとえば、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;
    }

-3

これは正直に言うと最も簡単な方法だと思います。これは、使用されている画面サイズを確認します。

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();
int height = display.getHeight();

がんばって!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.