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

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

Ответы [ 29 ]

2 голосов
/ 08 сентября 2015

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

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

ура: -)

2 голосов
/ 14 января 2017

Код не требуется

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

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

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

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

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

enter image description here

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

Примечания

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

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

1 голос
/ 06 ноября 2012

Думая о «новых» зарезервированных каталогах (например, 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 ПРИМЕЧАНИЕ: 400/615
NEXUS 7: 961/528
GALAXY TAB (> 7 && <10): 1280/752 <br>GALAXY S3: 360/615

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

1 голос
/ 24 апреля 2012

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

public boolean isTablet(Context context) {  
    return (context.getResources().getConfiguration().screenLayout   
        & Configuration.SCREENLAYOUT_SIZE_MASK)    
        >= Configuration.SCREENLAYOUT_SIZE_LARGE; 
}
1 голос
/ 06 сентября 2013

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

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 (НОРМАЛЬНЫЙ).

1 голос
/ 05 ноября 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 (извините за мой английский.)

0 голосов
/ 07 июля 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;

0 голосов
/ 24 сентября 2013

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

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

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

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

и использование

DisplayUtil.isTablet(this);
DisplayUtil.isTenInch(this);
0 голосов
/ 15 мая 2015
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 голосов
/ 01 сентября 2015

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

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

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

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

...