web-dev-qa-db-ja.com

デバイスがスマートフォンかタブレットかを判断しますか?

スマートフォンかタブレットかを確認するために、デバイスに関する情報を取得したいと思います。どうすればいいの?

デバイスの種類に基づいて、リソースとは異なるWebページを表示します。

String s="Debug-infos:";
s += "\n OS Version: " + System.getProperty("os.version") + "(" +    Android.os.Build.VERSION.INCREMENTAL + ")";
s += "\n OS API Level: " + Android.os.Build.VERSION.SDK;
s += "\n Device: " + Android.os.Build.DEVICE;
s += "\n Model (and Product): " + Android.os.Build.MODEL + " ("+ Android.os.Build.PRODUCT + ")";

しかし、それは私の場合には役に立たないようです。


この解決策は今私にはうまくいきます。

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;

if (SharedCode.width > 1023 || SharedCode.height > 1023){
   //code for big screen (like tablet)
}else{
   //code for small screen (like smartphone)
}
240
user1001635

このテーマはAndroidのトレーニングで議論されています。

最小幅修飾子を使用

トピック全体を読むと、特定の値ファイルにブール値を設定する方法が説明されています(res/values-sw600dp/attr.xml)。

<resources>
    <bool name="isTablet">true</bool>
</resources>

Sw600dp修飾子は、Android 3.2以上のプラットフォームでのみ有効です。このテクニックをすべてのプラットフォーム(3.2より前)で確実に機能させるには、res/values-xlargeフォルダーに同じファイルを作成します。

<resources>
    <bool name="isTablet">true</bool>
</resources>

次に、(標準の)値ファイル(res/values /として)で、ブール値をfalseに設定します。

<resources>
    <bool name="isTablet">false</bool>
</resources>

その後、あなたのアクティビティでは、この値を取得して、タブレットサイズのデバイスで実行しているかどうかを確認できます。

boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
if (tabletSize) {
    // do something
} else {
    // do something else
}
715
ol_v_er

私はタブレットに少なくとも6.5インチのスクリーンがあると考えています。これは上記のNolfの答えに基づいてそれを計算する方法です。

DisplayMetrics metrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);

float yInches= metrics.heightPixels/metrics.ydpi;
float xInches= metrics.widthPixels/metrics.xdpi;
double diagonalInches = Math.sqrt(xInches*xInches + yInches*yInches);
if (diagonalInches>=6.5){
    // 6.5inch device or bigger
}else{
    // smaller device
}
71
gtsouk

私の仮定は、あなたが 'Mobile/Phone'を定義するとき、あなたがあなたが 'Tablet'として定義されるであろう何かに対して行うことができないデバイスで電話をかけることができるかどうか知りたいのです。これを確認する方法は次のとおりです。あなたがセンサー、スクリーンサイズなどに基づいて何かを知りたいのなら、これは本当に別の質問です。

また、画面の解像度を使用している間、またはxlargeに対するリソース管理が有効なアプローチであった可能性があります。新しい 'Mobile'デバイスは、大画面と高解像度を備えています。電話対電話なしの通話機能を知るには、以下が「最良」です。

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

私はOl_v_erのソリューションが好きで、それは単純です、しかしそれはいつもそれほど単純ではないことがわかりました。 。 Johnが here を見つけたもう1つの解決策は、タブレットのサイズを指定するために、ブール値ではなく文字列リソースを使用することです。そのため、/res/values-sw600dp/screen.xmlファイルに単にtrueを入れる代わりに(これがあなたのレイアウトが小さなタブレット用の場所であると仮定して)あなたは置くでしょう:

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

次のように参照してから、結果に基づいて必要なことを行います。

String screenType = getResources().getString(R.string.screen_type);
if (screenType.equals("7-inch-tablet")) {
    // do something
} else {
    // do something else
}

Sean O'Tooleの プログラムで7インチと10インチのタブレットを検出する は私が探していたものでもありました。ここの答えでは、あなたが望むほど具体的になることができない場合は、それをチェックアウトすることをお勧めします。彼は、実際に何を扱っているのかを理解するために、さまざまなメトリックを計算する方法を説明するという優れた仕事をしています。

UPDATE

Google I/O 2013アプリのソースコードを見ると、デバイスがタブレットかどうかを識別するために使用されている以下の項目に遭遇したので、私はそれを追加したいと考えました。上記は、それをもう少し「制御」することができますが、それがタブレットかどうかを知りたいだけであれば、以下は非常に簡単です。

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

タブレットは一般的にスマートフォンよりも大きいので、また低解像度のタブレットは高解像度のスマートフォンと同じピクセル数を持っているかもしれないので、これを解決する一つの方法はデバイスの物理的なサイズ(解像度ではない)を計算することです。

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);

    float yInches= metrics.heightPixels/metrics.ydpi;
    float xInches= metrics.widthPixels/metrics.xdpi;

   if (yInches> smallestTabletSize|| xInches > smallestTabletSize)
    {
                  //We are on a 
    }
6
Nolf

私が見つけた最も邪魔にならない選択肢は、xmlにtag paramを設定することです。

電話XMLレイアウト

<Android.support.v4.view.ViewPager xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/pager"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:tag="phone"/>

タブレットXMLレイアウト

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/pager"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:tag="tablet">

    ...

</RelativeLayout>

そして、あなたの活動クラスでこれを呼び出します:

View viewPager = findViewById(R.id.pager);
Log.d(getClass().getSimpleName(), String.valueOf(viewPager.getTag()));

それがuのために働くことを願っています。

6

私はすべての私のアプリでこの方法を使っていますが、うまくいきます。

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

再:非電話から電話を伝える方法についての上記の接線:私の知る限りでは、唯一の電話は15桁のIMEI(国際移動局機器識別)を持っているので、次のコードは明確に電話を区別します電話以外の場合

    TelephonyManager manager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
    String deviceInfo = "";
    deviceInfo += manager.getDeviceId(); // the IMEI
    Log.d(TAG, "IMEI or unique ID is " + deviceInfo);

    if (manager.getDeviceId() == null) {
        Log.d(TAG, "This device is NOT a phone");
    } else {
        Log.d(TAG, "This device is a phone.");
    }

私は、Nookエミュレータで何らかの理由でgetPhoneType()が "GSM"のphoneTypeを返すことを発見しました。そのため、電話の種類のチェックが信頼できないようです。同様に、getNetworkType()は、機内モードの電話機に対して0を返します。実際、機内モードではgetLine1Number()メソッドとgetSim *メソッドもnullを返します。しかし機内モードでも、電話のIMEIは持続します。

1
John Ulmer

私が使用する解決策は2つのレイアウトを定義することです。例えばlayout-sw600dpに設定されたレイアウトフォルダを持つもの私はこれを私のタブレットユーザーにメニューボタンを提供し、電話ユーザーにはこれを隠すために使用します。そのようにして私は(まだ)私の既存のアプリのためにActionBarを実装する必要はありません...

詳細はこの記事 を参照してください。

1
Stephan