Планшет или телефон - Android

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


person Benny    schedule 29.04.2011    source источник
comment
вы разрабатываете собственное приложение или веб-приложение? вы можете проверить ширину, то есть размеры телефона, таким образом, у вас будет приблизительное представление о том, планшет это или телефон ??   -  person abhijit    schedule 29.04.2011
comment
Я думал о размерах, но я решил, что это функция. Я подумал, что вы можете прочитать это в разделе "О телефоне".   -  person Benny    schedule 29.04.2011
comment
Вы задаете неправильный вопрос. Не имеет значения, является ли устройство телефоном, планшетом, телевизором, тостером, чашкой или термометром. Важны возможности, а не маркетинговый класс устройства. Задайте новый вопрос Android, описывающий, какие возможности вы ищете и как определить, есть ли у устройства такие возможности, или как отфильтровать себя из Маркета для устройств, у которых такие возможности отсутствуют.   -  person CommonsWare    schedule 29.04.2011
comment
@CommonsWare: иногда вы хотите добавить дополнительные функции для устройств с большим экраном.   -  person Bobs    schedule 28.05.2012
comment
@breceivemail: Это означает, что вам нужно проверить, есть ли у устройства экран большего размера. Экран побольше! = Планшет.   -  person CommonsWare    schedule 28.05.2012
comment
Лучший ответ можно найти здесь: stackoverflow.com/a/9308284/1750829 Вот так просто :-)   -  person Or Kazaz    schedule 19.04.2013
comment
Я думаю, что у нас есть довольно обновленное решение с этим сообщением в документации Android. developer.android.com/guide/practices/ Это правильно ставит разница между планшетом 7 и телефоном где у нас вся путаница.   -  person agaase    schedule 15.07.2013
comment
Я хотел бы проголосовать против всей этой страницы! Телефон делает телефонию, а планшет - нет. Практически все предложения - грязные уловки, которые никому не следует использовать. Мир стал бы лучше, если бы эту страницу больше никто не видел!   -  person Mark Gjøl    schedule 10.10.2013
comment
В наши дни планшеты занимаются телефонной связью, по крайней мере, некоторые из них. Но факт в том, что они быстро вымирают, см. businessinsider.com/. Kindle - единственный планшет, который до сих пор пользуется успехом. Между тем, телевизоры, часы, Chromebook, гарнитуры VR и т. Д. Также работают под управлением Android, так что это не вопрос планшета или телефона.   -  person Gabor    schedule 10.01.2018


Ответы (29)


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

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

person John    schedule 17.01.2013
comment
+1, отличный ответ, потому что он дает больше информации о том, почему вы действительно хотите проверить планшет / телефон. Мы приближаемся к тому моменту, когда телефоны все равно превратятся в маленькие планшеты;) - person andr; 17.01.2013
comment
Как это применимо к большим телефонам, таким как Galaxy Note и новый Nexus 6? Будут ли при использовании этого метода обнаруживаться эти большие устройства как телефоны или планшеты? - person PerracoLabs; 06.11.2014
comment
К сожалению, это приложение не работает для устройства Samsung Mega 6.3 и возвращает его как планшет (sw600dp) - есть ли другие идеи, чтобы зафиксировать это? - person bkurzius; 01.09.2015
comment
телефонные звонки с планшетов? - person Mike; 11.12.2019

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

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

person petey    schedule 06.03.2012
comment
На обоих - Kindle Fire и Motorola Droid Bionic - SCREENLAYOUT_SIZE_MASK == 15. Так почему ваше решение будет работать? - person IgorGanapolsky; 07.04.2012
comment
Я считаю, что это верно для Kindle Fire. Сегодня у меня нет бионика ... но я проверю через несколько дней, когда мой друг вернется в город. Однако ... Я тестировал ответ Хелтона Исака, и он прекрасно работает. Пожалуйста, проверьте и это. - person petey; 11.04.2012
comment
Там Configuration.SCREENLAYOUT_SIZE_XLARGE, поэтому вам не нужно использовать константу, и вы можете использовать >= LARGE. - person Triang3l; 12.01.2013
comment
Galaxy Note, похоже, сообщает SCREENLAYOUT_SIZE_LARGE, поэтому он был бы ошибочно классифицирован как планшет - person miguelSantirso; 25.05.2013
comment
@miguelSantirso так было не всегда. Изначально компания Samsung неправильно сообщала размер своей корзины до более позднего обновления / выпуска ICS. - person petey; 25.05.2013
comment
@forgivegod В этом есть смысл. Galaxy Note, в котором я обнаружил проблему, работал под управлением Android 2.x - person miguelSantirso; 30.05.2013
comment
Ваше решение isTablet, например, не работает на эмуляторе с API 18 и Nexus 7 1200 x 1920 xhdpi! - person Ingo; 13.10.2014
comment
@Ingo ты установил большой размер экрана? - person petey; 13.10.2014
comment
Я думаю, что размер не слишком велик. Я протестировал ваш код на эмуляторе, и результат isTablet (контекст контекста) был ложным. Попробуйте самостоятельно на эмуляторе. - person Ingo; 13.10.2014
comment
установите большой размер, вот спецификации для nexus 7 версии 2013 г .: emirweb.com /ScreenDeviceStatistics.php#Header446 - person petey; 13.10.2014
comment
Если шрифт устройства маленький, а размер экрана в настройках маленький, то в этом случае возвращается true. - person arul; 11.07.2017

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

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

Мне нужно было определить, было ли мое устройство планшетом или телефоном, с этим я мог бы реализовать логику экрана. И в моем анализе планшет должен быть больше 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;
}
person Helton Isac    schedule 08.03.2012
comment
Лучшее решение, которое я нашел, спасибо Helton Isac! Может быть, можно добавить (для лучшего решения) проверку на дюймы экрана? в любом случае, 10 за это решение - person Aracem; 12.03.2012
comment
Я действительно не согласен. Это метод определения размера экрана. Опять же, как я уже ответил, НЕТ разницы между планшетом и телефоном. Это не ответ на вопрос. Невозможно отличить, потому что нет 1 разницы. Если вам нужно кодировать определенные функции (например, вы делаете это для определенных размеров экрана), сделайте это, но не называйте это планшетом по сравнению с телефоном. Автор темы, похоже, добавил строку @ определенную функцию наклона. Внимательно прочтите комментарий @commonware к этому вопросу. - person Nanne; 12.03.2012
comment
Я согласен с Нанн, но, как я уже сказал, в моем приложении мне нужно показать две панели, если экран достаточно большой для этого. И я не могу использовать макеты в этом случае, потому что логика экрана была на стороне Java. - person Helton Isac; 13.03.2012
comment
Helton, спасибо за это. Подумал, что это возвращает: Kindle Fire: false, Moto Xoom (v1): true, Galaxy Note: false, Galaxy Tab 10.1 limited: true - person petey; 12.04.2012
comment
Помимо аргумента, Configuration.SCREENLAYOUT_SIZE_XLARGE = 4 согласно разработчику. android.com/reference/android/content/res/, который можно использовать вместо уровня API ниже 9. - person trgraglia; 06.09.2012
comment
К сожалению, эта функция сообщает о моем Galaxy Nexus как о планшете. Проблема в том, что производители, похоже, используют разные правила с параметрами компоновки. :( - person Barry Fruitman; 30.12.2012
comment
Ваше состояние не удается разжечь - person Kavin Varnan; 02.02.2013
comment
Nexus 7 - это планшет, но его классифицируется как SCREENLAYOUT_SIZE_LARGE. - person miguelSantirso; 25.05.2013
comment
Это правильно делает Samsung Mega 6 телефоном, но, поскольку устройство по-прежнему использует ресурсы из папки макета sw600dp, это может вызвать другие проблемы. Похоже, что в отношении Mega 6 мы просто должны признать, что это, по сути, планшет ... - person bkurzius; 01.09.2015

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

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

person Volker Voecking    schedule 17.02.2012
comment
Это не работает ... просто некоторые телефоны сообщают неправильные значения плотности, и вычисление в дюймах не выполняется - см. Там: stackoverflow.com/questions/2193457 / - person STeN; 25.03.2012
comment
Что ж, мне нравятся 7-дюймовые планшеты (карманного размера), и я думаю, что это лучший ответ. Но вернемся (screenDiagonal ›= 9.0); должно быть возвращено (screenDiagonal ›= 6.5). Однако зависит от использования, как указано в комментариях к вопросу. - person Jan Bergström; 27.12.2018

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

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

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

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/. не тестировал)

person Nanne    schedule 29.04.2011
comment
У меня проблемы с функцией наклона и новым планшетом (трансформатором) - person Benny; 29.04.2011
comment
Вид глупого ответа имо - конечно, есть разница. Галактика = телефон. Почему? Потому что это смартфон по заявлению производителя за одного. Если вы намекаете, что ему нужно проверить размер, или способность звонить, или ... что-то еще - просто скажите это. - person Dave; 29.04.2011
comment
Итак, что-то является телефоном, потому что производитель говорит, что это смартфон. Но на самом деле это не та информация, которой вы располагаете, не так ли? Если бы я хотел сказать что-нибудь из этого, я бы сказал. Но я этого не сделал, потому что не умею читать мысли. Если вы читали комментарий @Benny, он о функции наклона. Зачем мне угадывать звонки или скрининг? Проблема вроде бы в наклоне, и это не имеет ничего общего с тем, если производитель называет это смартфоном. Глупый комментарий - person Nanne; 29.04.2011
comment
tilit работает для мобильных телефонов, но не для планшетов, поэтому я бы сделал настраиваемую функцию tilit для планшетов ^^ - person Benny; 29.04.2011
comment
Я не согласен, это может работать не на всех мобильных устройствах, в то время как некоторые планшеты имеют эти датчики. Вот почему мой первоначальный ответ - никакой разницы. В любом случае, я добавил код, который вам стоит попробовать. - person Nanne; 29.04.2011
comment
Проблема в том, что, поскольку планшеты построены в ландшафтном режиме, оси x и y акселерометра переворачиваются, когда вы ожидаете, что ваше приложение будет работать в портретном режиме. Это может немного запутать :) Поэтому очень важно проверять, работаете ли вы на планшете, или нет. - person pumpkee; 01.06.2011
comment
Но тогда все наоборот = ›если это единственное, что делает устройство планшетом, вы должны выяснить, как работает ось x / y, а не наоборот. Кстати сомневаюсь, что это актуально для всех планшетов и / или телефонов? - person Nanne; 01.06.2011
comment
Я знаю, что это старый вопрос, но теперь я в этом разбираюсь, но @Nanne, дело не в том, как работает датчик ориентации, а в планшетах, ось отсчета изменена, по сравнению с телефонами. Итак, допустим, в телефоне (0, 0, 0) это портретный режим, а в планшете (0,0,0) - альбомный, поэтому это важно. (значения не настоящие) - person mdelolmo; 14.02.2012
comment
Я не согласен. Некоторые планшеты могут, но это совсем не определяющая особенность планшетов. Это связано с пейзажем и портретом, а не планшетами и телефонами. Как насчет квадратных экранов? Это не будет ни телефон, ни планшет (хотя я подозреваю, что флип-аут будет по этому поводу огорчен). В любом случае, и я повторяюсь здесь, вам следует проверить функцию, которую вы хотите проверить, потому что вы не можете или не должны хотеть проверять планшет или телефон. - person Nanne; 14.02.2012
comment
@Nanne, я понимаю вашу точку зрения, но все же я думаю, что должна быть функция / свойство / способ определения, соответствует ли ось X акселерометра ширине устройства или высоте. В некоторых случаях вам может потребоваться сопоставить макет с какой-либо осью акселерометра, единственный способ, которым мы могли это сделать, - это предположить следующее: портрет = ›ось y ‹-› высота, ось x ‹-› ширина ; пейзаж, наоборот. Если эта ссылка изменится, управлять макетом будет сложнее. - person mdelolmo; 14.02.2012
comment
То, что вы говорите, правильно, но вопрос в том, планшет это или телефон, и ваша проблема заключается в том, как акселерометр соотносится с экраном, что не является гарантированной разницей между телефоном и планшетом, потому что НЕТ четкой разницы между их. Что такое записка? Что такое вкладка? Как они определяют свой экран / акселераторы? Помните, мы говорим о вышеупомянутом вопросе .... - person Nanne; 14.02.2012
comment
Это не кажется правильным ... Я думал, что под планшетом понимается устройство Android с большим экраном. - person Alex Lockwood; 28.05.2012
comment
Большой как? В дюймах? У меня есть планшет Ярвик, который в дюймах больше моего телефона, но в моем телефоне намного больше пикселей. Проблемы программирования связаны либо с измеримыми вещами, такими как количество пикселей, либо с предпочтениями пользователя / использования, которые должны быть настройкой. Телефон 1024x800 имеет те же проблемы с экраном, что и планшет с таким размером экрана, а планшет 800x600 - нет. Узнай плотность, узнай размер, узнай особенности. Программируйте в соответствии с этим, но не пытайтесь запечатлеть мир на планшете, а не на планшете. Это слишком ограничивает. - person Nanne; 28.05.2012
comment
Нанн, как еще вы могли бы предложить определить разницу в отображении X / Y акселерометра на некоторых устройствах? Планшет против телефона, кажется, ассоциируется с сопоставлением X / Y против Y / X. - person Oleg Vaskevich; 12.06.2012
comment
Вероятно, вы могли бы проверить поворот экрана и текущий форм-фактор высоты / ширины, чтобы определить, является ли ориентация по умолчанию альбомной или портретной, и перейти оттуда? Или, чтобы получить более подробную помощь, задайте здесь вопрос, чтобы узнать, как найти схему акселерометра. Это одна из тех вещей, о которых я говорил: нет телефона против планшета, однако (очевидно) есть отображение x / y против y / x. Если вы хотите это знать, узнайте это. Не выясняйте какой-то произвольный телефон против планшета, а выясняйте, что вы хотите узнать :) - person Nanne; 12.06.2012

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

Кроме того, при использовании разрешения экрана или управления ресурсами большой по сравнению с xlarge, возможно, был допустимый подход в прошлом, новые `` мобильные '' устройства теперь поставляются с такими большими экранами и высокими разрешениями, что они стирают эту границу, хотя, если вы действительно хотите Чтобы узнать о телефонном звонке и отсутствии возможности телефонного звонка, "лучше всего" ниже.

TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if(manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE){
    return "Tablet";
}else{
    return "Mobile";
}
person Robert Dale Johnson III    schedule 14.06.2012
comment
Некоторые планшеты могут звонить и иметь тип GSM или CDMA ... Так что ваше решение тоже не идеально. - person arnouf; 11.09.2012

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

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
}
person Cjames    schedule 14.09.2012

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

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

Для тех, кто хочет обратиться к коду 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;
        }
        }
person Pier Betos    schedule 11.01.2013
comment
каково значение shortSize? - person kc ochibili; 05.09.2013

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

public static boolean isTablet(Context context) {
        return (context.getResources().getConfiguration().screenLayout
                & Configuration.SCREENLAYOUT_SIZE_MASK)
                >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
person hqt    schedule 24.11.2013
comment
Это решение, например, не работает на эмуляторе с API 18 и Nexus 7 1200 x 1920 xhdpi! - person Ingo; 13.10.2014
comment
надо тестировать на реальном устройстве :) - person hqt; 13.10.2014
comment
Я тестировал на эмуляторе, и результат isTablet (контекст контекста) был ложным. Попробуйте самостоятельно на эмуляторе. - person Ingo; 13.10.2014
comment
Спасибо за этот @hqt, я только что перекодировал это на C #, необходимый для Xamarin Studio: public static bool isTablet (Context context) { return (context.Resources.Configuration.ScreenLayout & Android.Content.Res.ScreenLayout.SizeMask) >= Android.Content.Res.ScreenLayout.SizeLarge; } - person Phil Ryan; 23.03.2015

Код не нужен

В других ответах перечислены многие способы программного определения того, является ли устройство телефоном или планшетом. Однако если вы читаете документацию, это не рекомендуется. для поддержки экранов различных размеров.

Вместо этого объявите разные ресурсы для планшетов или телефонов. Вы делаете это, добавляя дополнительные папки ресурсов для layout, values и т. Д.

  • Для Android 3.2 (уровень API 13) добавьте папку sw600dp. Это означает, что наименьшая ширина ширины составляет не менее 600 точек на дюйм, что приблизительно равно разделению между телефоном и планшетом. Однако вы также можете добавить другие размеры. Посмотрите этот ответ, чтобы узнать, как добавить дополнительный файл ресурсов макета.

  • Если вы также поддерживаете устройства до Android 3.2, вам нужно будет добавить папки large или xlarge для поддержки планшетов. (Обычно телефоны small и normal.)

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

введите описание изображения здесь

При использовании этого метода система все определяет за вас. Вам не нужно беспокоиться о том, какое устройство используется во время выполнения. Вы просто предоставляете соответствующие ресурсы, а Android делает всю работу.

Примечания

  • Вы можете использовать псевдонимы, чтобы избежать дублирования идентичных файлов ресурсов.

Документы по Android, которые стоит прочитать

person Suragch    schedule 14.01.2017

Если вы ориентируетесь только на уровень API> = 13, попробуйте

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

ваше здоровье :-)

person Mohanraj    schedule 08.09.2015

Думая о "новых" принятых каталогах (например, 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 (> 7 && ‹10): 1280/752
GALAXY S3: 360/615

Wdp = Ширина dp
Hdp = Высота dp

person Aracem    schedule 06.11.2012

Что ж, лучшее решение, которое сработало для меня, довольно простое:

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 (БОЛЬШОЙ) определяется как планшет, но не Galaxy S3 (НОРМАЛЬНЫЙ).

person Max    schedule 06.09.2013

Используйте этот метод, который возвращает true, если устройством является планшет.

public boolean isTablet(Context context) {  
    return (context.getResources().getConfiguration().screenLayout   
        & Configuration.SCREENLAYOUT_SIZE_MASK)    
        >= Configuration.SCREENLAYOUT_SIZE_LARGE; 
}
person Vyshnavi    schedule 24.04.2012
comment
Это решение, например, не работает на эмуляторе с API 18 и Nexus 7 1200 x 1920 xhdpi! - person Ingo; 13.10.2014
comment
Это больше не работает на некоторых устройствах. Например, он возвращает false для устройства Samsung Mega. - person bkurzius; 25.08.2015
comment
Да .. Это больше не работает ... Я действительно использовал для добавления логического значения во все строковые файлы для каждой папки values, values_large и т. Д. ‹Bool name = isTablet› false ‹/bool› ‹bool name = isLargeTablet› false ‹/bool› а затем проверьте, верно ли R.bool.isTablet, чтобы определить, является ли устройство планшетом. - person Vyshnavi; 25.08.2015

Если определение размера экрана не возвращает правильное значение на новых устройствах, попробуйте:

/*
 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 (извините за мой англ.)

person BSTech    schedule 05.11.2015

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

Если вы запустите гироскоп (или датчик вращения) на смартфоне, оси x и y могут быть определены иначе, чем на планшете, в зависимости от ориентации этого устройства по умолчанию (например, Samsung GS2 - портретная ориентация по умолчанию, Samsung GT-7310 - по умолчанию альбомная ориентация, новый Google Nexus 7 - портретная ориентация по умолчанию, хотя это планшет!).

Теперь, если вы хотите использовать Gyroscope, у вас может получиться рабочее решение для смартфонов, но путаница с осями на некоторых планшетах или наоборот.

Если вы используете одно из вышеперечисленных решений, чтобы выбрать только размер экрана, а затем примените

SensorManager.remapCoordinateSystem(inputRotationMatrix, SensorManager.AXIS_X, 
    SensorManager.AXIS_Y, outputRotationMatrix);

чтобы перевернуть ось, если у него большой или xlarge размер экрана, это может сработать в 90% случаев, но, например, на Nexus 7 это вызовет проблемы (поскольку он имеет портретную ориентацию по умолчанию и большой размер экрана).

Самый простой способ исправить это предоставляется в RotationVectorSample, который поставляется с демонстрациями API, установив для sceenOrientation значение nosensor в вашем манифесте:

<activity
    ...
    android:screenOrientation="nosensor">
...
</activity>
person Alexander Pacha    schedule 15.08.2013

com.sec.feature.multiwindow.tablet в диспетчере пакетов относится только к планшету, а com.sec.feature.multiwindow.phone - к телефону.

person RBz    schedule 08.01.2015

Нижеприведенный метод вычисляет длину диагонали экрана устройства, чтобы решить, является ли устройство телефоном или планшетом. Единственная проблема для этого метода - какое пороговое значение определяет, является ли устройство планшетом или нет. в приведенном ниже примере я установил его как 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 );
}
person MinFu    schedule 26.03.2015

Становится все труднее провести грань между телефоном и планшетом. Например (по состоянию на август 2015 г.) устройство Samsung Mega 6.3 извлекает ресурсы из sw600dp. папки - для Android это планшет.

Ответ от @Vyshnavi работает на всех протестированных нами устройствах, но не на Mega 6.3.

@Helton Isac ответ выше возвращает Mega 6.3 как телефон, но поскольку устройство по-прежнему захватывает ресурсы из sw600dp, это может вызвать другие проблемы - например, если вы используете viewpager для телефонов, а не для планшетов, вы столкнетесь с ошибками NPE.

В конце концов кажется, что существует слишком много условий, которые нужно проверить, и нам, возможно, просто придется признать, что некоторые телефоны на самом деле являются планшетами :-P

person bkurzius    schedule 01.09.2015

Это метод, который я использую:

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 < / сильный>

Это рекомендуемый метод!

person Jorgesys    schedule 24.09.2014
comment
Объяснение -1? , это метод, рекомендованный Google. - person Jorgesys; 07.06.2016

зачем это использовать?

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

it's ok?

person Longalei    schedule 18.12.2018

Смартфон / планшет мне нужно было определить только в файле макета, потому что я использую код навигации.

Сначала я создал каталог layout-sw600dp, но он не работал должным образом, потому что он активировался на моем Nokia 8 в ландшафтном режиме, но высота экрана была бы слишком маленькой.

Итак, я переименовал каталог в layout-sw600dp-h400dp и получил желаемый эффект. Параметр h-xxxdp должен зависеть от того, сколько контента вы хотите поместить в свой макет, и, как таковой, должен зависеть от приложения.

person Dominique Lorre    schedule 16.08.2019

Пожалуйста, ознакомьтесь с приведенным ниже кодом.

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;
}
person SathishBabu S    schedule 22.11.2011
comment
Больше не действует с ICS. Действительно, есть планшеты с версией Android ниже 11. - person mdelolmo; 14.02.2012
comment
Это НЕ НАДЕЖНО. Новые телефоны ICS имеют уровень API ›11. - person Jason Robinson; 15.02.2012

Я думаю, что планшет имеет минимальную и максимальную ширину и высоту 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;

person user1503892    schedule 07.07.2012
comment
Это неправильно, потому что разрешение Samsung galaxy s3 720 x 1280. - person Nikhil; 11.10.2012

Например. есть одно важное отличие (по крайней мере для моей программы) между телефоном и планшетом. Это ориентация устройства по умолчанию. Телефон имеет портретную ориентацию, планшет - альбомную. И соответственно способ определения устройства:

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

EDITED: после обсуждения с Дэном Халмом изменилось название метода.

person Silver    schedule 21.02.2012
comment
Не все планшеты имеют альбомную ориентацию по умолчанию. И если ориентация по умолчанию имеет значение для вашей программы, возможно, она неверна в других отношениях. См. эту запись в блоге разработчиков Android для примера. - person Dan Hulme; 28.10.2012
comment
Приведите, пожалуйста, конкретные примеры планшетов, у которых в стандартной ориентации ширина меньше высоты? И, конечно, вы лучше знаете, каким должно быть мое приложение: D. - person Silver; 10.11.2012
comment
Nexus 7 может быть одним из примеров. Но вам не нужно верить мне на слово: прочтите статью, на которую я дал ссылку, в которой все это объясняется. - person Dan Hulme; 10.11.2012
comment
Думаю, следует изменить название моего метода. На самом деле, что более важно (по крайней мере, для моего приложения;)) ориентация устройства по умолчанию, и мой метод подходит для этой задачи. Также очень правильно обозначил проблему @Nanne answer, см. Выше. - person Silver; 11.11.2012

Я рекомендую Android-библиотеку «кофеин», которая содержит телефон или планшет и 10 дюймов ~!

очень простое использование.

библиотека здесь.

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

и использовать

DisplayUtil.isTablet(this);
DisplayUtil.isTenInch(this);
person ShakeJ    schedule 24.09.2013

Для меня разница между телефоном и планшетом заключается не в размере устройства и / или плотности пикселей, которая будет меняться в зависимости от технологии и вкуса, а в соотношении экрана. Если я показываю экран с текстом, мне нужно знать, нужны ли, скажем, 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;
    }
person Androidcoder    schedule 08.10.2017

Я считаю, что это самый простой способ, если честно. Это проверит используемый размер экрана:

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

Удачи!

person Otroberts    schedule 29.04.2011