301

スマートフォンなのかタブレットなのか、デバイスの情報を知りたいのですが。どうすればいいですか?

デバイスのタイプに基づいて、リソースからさまざまな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)
}
4

9 に答える 9

828

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

最小幅修飾子を使用する

トピック全体を読むと、特定の値ファイル (res/values-sw600dp/attrs.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/attrs.xml として) で、ブール値を false に設定します。

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

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

boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
if (tabletSize) {
    // do something
} else {
    // do something else
}
于 2012-02-16T09:05:47.090 に答える
97

私は、タブレットは少なくとも 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
}
于 2014-07-11T15:15:32.290 に答える
40

私の推測では、'Mobile/Phone' を定義するとき、'Tablet' として定義されるものではできないデバイスで電話をかけることができるかどうかを知りたいと思います。これを確認する方法は次のとおりです。センサー、画面サイズなどに基づいて何かを知りたい場合、これは実際には別の質問です.

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

TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
        if(manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE){
            return "Tablet";
        }else{
            return "Mobile";
        }
于 2012-06-14T21:35:30.583 に答える
32

私は Ol_v_er のソリューションが好きで、シンプルですが、新しいデバイスやディスプレイが絶えず登場しているため、必ずしもそれほど単純ではないことがわかりました。実際の画面サイズを把握するには、もう少し「粒度」を高めたいと考えています。 . ここでジョンが見つけたもう 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
}

プログラムで7インチと10インチのタブレットを検出するためのSean O'Tooleの回答も、私が探していたものでした。ここでの回答で希望するほど具体的な回答が得られない場合は、確認してください。彼は、実際に何を扱っているかを把握するために、さまざまなメトリックを計算する方法を説明しています。

アップデート

Google I/O 2013 アプリのソース コードを見て、デバイスがタブレットであるかどうかを識別するために使用する次のコードに出くわしたので、追加することにしました。上記により、もう少し「制御」できますが、タブレットかどうかだけを知りたい場合は、次のようにすると非常に簡単です。

public static boolean isTablet(Context context) {
    return (context.getResources().getConfiguration().screenLayout
            & Configuration.SCREENLAYOUT_SIZE_MASK)
            >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
于 2013-08-22T18:17:26.257 に答える
11

私はすべてのアプリでこの方法を使用していますが、正常に機能します。

public static boolean isTablet(Context ctx){    
    return (ctx.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; 
}
于 2014-09-24T23:11:25.077 に答える
5

私が見つけた最良のオプションであり、邪魔にならないのは、次のようにxmlにタグパラメーターを設定することです

電話 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()));

それがうまくいくことを願っています。

于 2014-05-06T00:33:21.320 に答える
1

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

詳細については、この投稿を参照してください

于 2013-02-08T07:41:02.053 に答える
1

Re: 電話と非電話を見分ける方法に関する上記の接線: 私の知る限り、電話だけが 15 桁の IMEI (International Mobile Station Equipment Identity) を持っているため、次のコードは電話と非電話を明確に区別します。非電話:

    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 は持続します。

于 2014-03-22T23:45:28.287 に答える