web-dev-qa-db-ja.com

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

ユーザーがタブレットを使用しているか、電話を使用しているかを確認する方法はありますか?チルト機能と新しいタブレット(トランスフォーマー)に問題があります

137
Benny

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

ほとんどの場合、タブレットと携帯電話の違いは画面サイズであるため、異なるレイアウトファイルを使用する必要があります。これらのファイルは、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定数を介して画面タイプにアクセスできます。

117
John

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

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

60
petey

この投稿は私を大いに助けてくれました。

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

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

画面の対角線のサイズを計算し、それを使用して、デバイスが電話かタブレットかを判断してみませんか?

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インチ以下にする必要があるかどうかを議論できます。

12
Volker Voecking

違いはありません。違いだと思うことを定義し、それを確認する必要があります。ギャラクシータブは電話ですか?またはタブレット?なぜ?

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

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

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

11
Nanne

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

また、画面解像度、または大規模対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
}
6
Cjames

どのデバイスがタブレット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;
        }
        }
3
Pier Betos

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

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

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

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

APIレベル> = 13のみをターゲットにしている場合は、試してください

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

乾杯:-)

2
dheeran

コードは必要ありません

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

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

  • Android 3.2(APIレベル13)の場合、sw600dpフォルダーを追加します。つまり、smallestwidthは少なくとも600dpであり、およそ電話/タブレットの分割。ただし、他のサイズを追加することもできます。追加のレイアウトリソースファイルを追加する方法の例については、 this answer をご覧ください。

  • Android 3.2以前のデバイスもサポートしている場合は、タブレットをサポートするためにlargeまたはxlargeフォルダーを追加する必要があります。 (電話は通常smallおよびnormalです。)

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

enter image description here

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

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

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

2
Suragch

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

1
Aracem

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

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
Max

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

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

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

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

1
BSTech
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
Xar E Ahmer

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

@ Vyshnavi からの回答は、Mega 6.3ではなく、テストしたすべてのデバイスで機能します。

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

最終的には、チェックする条件が多すぎるように思われ、一部の電話は実際にはタブレットであることを受け入れる必要があります:-P

0
bkurzius

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

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

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

0
Dominique Lorre

なぜこれを使用するのですか?

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

大丈夫です?

0
Longalei

以下の方法は、デバイス画面の対角線の長さを計算して、デバイスが携帯電話またはタブレットであると判断することです。この方法の唯一の懸念は、デバイスがタブレットかどうかを判断するためのしきい値です。以下の例では、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
MinFu

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

0
RBz

これはあなたの質問に対する直接的な答えではないことを知っていますが、ここでの他の答えは画面サイズを識別する方法の良いアイデアを与えます。あなたはあなたの質問で、傾きに問題があり、これが私にも起こったと書いた。

スマートフォンでジャイロスコープ(または回転センサー)を実行する場合、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>
0
Alexander Pacha

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

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

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

0
Jorgesys