Планшет или телефон - Android - PullRequest
136 голосов
/ 29 апреля 2011

Есть ли способ проверить, использует ли пользователь планшет или телефон? У меня проблемы с функцией наклона и моим новым планшетом (Transformer)

Ответы [ 29 ]

116 голосов
/ 17 января 2013

Как уже упоминалось ранее, вы не хотите проверять, является ли устройство планшетом или телефоном, но вы хотите узнать об особенностях устройства,

В большинстве случаев разницамежду планшетом и телефоном размер экрана, поэтому вы хотите использовать различные файлы макета.Эти файлы хранятся в каталогах res/layout-<qualifiers>.Вы можете создать файл XML в директории res/values-<same qualifiers> для каждого из ваших макетов и поместить в него ресурс 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.

59 голосов
/ 06 марта 2012

Чтобы определить, является ли устройство планшетом, используйте следующий код:

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

38 голосов
/ 09 марта 2012

Этот пост мне очень помог,

К сожалению, у меня нет репутации, необходимой для оценки всех ответов, которые мне помогли.

Мне нужно было определить, было ли мое устройство планшетом или телефоном, и тогда я смог бы реализовать логику экрана. И в моем анализе планшет должен быть больше 7 дюймов (Xlarge), начиная с MDPI.

Вот код ниже, который был создан на основе этого поста.

/**
 * 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;
}
12 голосов
/ 17 февраля 2012

Почему бы не рассчитать размер диагонали экрана и не использовать ее для принятия решения, является ли устройство телефоном или планшетом?

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 дюймов или меньше.

11 голосов
/ 29 апреля 2011

разницы нет.Вы должны определить, что, по вашему мнению, является разницей, и проверить это.Является ли Galaxy Tab вкладкой телефона?или планшет?и почему?

Вы должны определить, какие именно функции вы ищете, и код для этого.

Кажется, вы ищете «наклон».Я думаю, что это то же самое, что акселерометр (это слово?).Вы можете просто проверить, поддерживает ли устройство это, используя:

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/. Я не проверял это)

10 голосов
/ 15 июня 2012

Я предполагаю, что когда вы определяете «Мобильный телефон», вы хотите знать, можете ли вы сделать телефонный звонок на устройстве, что нельзя сделать на чем-то, что будет определено как «планшет».Способ проверить это ниже.Если вы хотите узнать что-то по сенсорам, размеру экрана и т. Д., То это действительно другой вопрос.

Кроме того, при использовании разрешения экрана или больших возможностей управления ресурсами по сравнению с xlarge, возможно, было правильным подходом в прошлом. Новые мобильные устройства теперь выпускаются с такими большими экранами и высоким разрешением, что они размывают это.В то время как если вы действительно хотите знать телефонный звонок, а не возможность телефонного звонка, ниже «лучше».

TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if(manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE){
    return "Tablet";
}else{
    return "Mobile";
}
6 голосов
/ 14 сентября 2012

Основываясь на Роберте Дейле Джонсоне III и Хелтоне Исаке, я придумал этот код. Надеюсь, что это полезно

3 голосов
/ 24 ноября 2013

Этот метод является рекомендацией Google.Я вижу этот код в Google Offical Android App iosched

public static boolean isTablet(Context context) {
        return (context.getResources().getConfiguration().screenLayout
                & Configuration.SCREENLAYOUT_SIZE_MASK)
                >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
3 голосов
/ 11 января 2013

Для тех, кто хочет обратиться к коду 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 голосов
/ 19 февраля 2018

В приложении Google IOSched 2017 исходный код используется следующий метод:

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