Определите, является ли устройство смартфоном или планшетом? [дубликат]
этот вопрос уже есть ответ здесь:
Планшет или телефон - Android
28 ответов
Я хотел бы получить информацию об устройстве, чтобы увидеть, если это смартфон или планшет. Как я могу это сделать?
Я хотел бы показать различные веб-страницы из ресурсов в зависимости от типа устройства:
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)
}
9 ответов:
эта тема обсуждается в обучении 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 }
Я считаю, что планшет имеет по крайней мере 6,5-дюймовый экран. Вот как это вычислить, основываясь на ответе Нольфа выше.
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 }
Я предполагаю, что когда вы определяете "мобильный/телефон", вы хотите знать, можете ли вы сделать телефонный звонок на устройстве, которое не может быть сделано на чем-то, что будет определено как "планшет". Способ проверить это приведен ниже. Если вы хотите узнать что-то на основе датчиков, размера экрана и т. д., то это действительно другой вопрос.
кроме того, при использовании разрешения экрана или управления ресурсами large vs xlarge, возможно, был правильный подход в прошлом новый "мобильный" устройства теперь поставляются с такими большими экранами и высокими разрешениями, что они размывают эту линию, в то время как если вы действительно хотите знать телефонный звонок против возможности телефонного звонка, ниже "лучший".
TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); if(manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE){ return "Tablet"; }else{ return "Mobile"; }
мне нравится решение Ol_v_er, и это простота однако, я обнаружил, что это не всегда так просто, что с новыми устройствами и дисплеями постоянно выходит, и я хочу быть немного более "гранулированным" в попытке выяснить фактический размер экрана. Еще одно решение, которое я нашел здесь by John использует строковый ресурс вместо логического, чтобы указать размер планшета. Итак, вместо того, чтобы просто поставить true в A /res/values-sw600dp/screen.xml-файл (предполагая, что это где ваш макеты для небольших планшетов) вы бы поставили:
<?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-дюймовый планшет программно было также то, что я искал. Вы можете проверить это, если ответы здесь не позволяют вам быть такими конкретными, как вам хотелось бы. Он делает большую работу, объясняя, как рассчитать различные показатели, чтобы выяснить, что вы вообще-то разбираюсь.
обновление
глядя на исходный код приложения Google I/O 2013, я столкнулся со следующим, что они используют, чтобы определить, является ли устройство планшетом или нет, поэтому я решил, что добавлю его. Вышеизложенное дает вам немного больше "контроля" над ним, но если вы просто хотите знать, если это планшет, следующее довольно просто:
public static boolean isTablet(Context context) { return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; }
поскольку планшет в целом больше, чем смартфоны, и поскольку планшет с низким разрешением может иметь то же количество пикселей, что и смартфон с высоким разрешением, один из способов решить эту проблему-рассчитать физический размер (а не разрешение) устройства:
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 }
лучший вариант, который я нашел и менее навязчивый, - это установить тег param в вашем 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"/>TABLET XML LAYOUT
<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.
Я использую этот метод во всех моих приложениях, и он успешно работает:
public static boolean isTablet(Context ctx){ return (ctx.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; }
решение, которое я использую, чтобы определить два макета. Один с папкой макета, например макет-sw600dp Я использую это, чтобы предоставить кнопку Меню для моих пользователей планшета и скрыть это для пользователей телефона. Таким образом, мне (пока) не нужно реализовывать панель действий для моих существующих приложений ...
посмотреть этот пост для более подробной информации.
Re: касательная выше о том, как отличить телефон от не-телефона: насколько я знаю, только телефон имеет 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", поэтому кажется, что проверка типа телефона ненадежна. Аналогично, getNetworkType () вернет 0 для телефона в самолете режим. Фактически, режим полета приведет к тому, что getLine1Number () и методы getSim* также вернут null. Но даже в режиме полета IMEI телефона сохраняется.
Comments