Как получить размер экрана устройства?

Желание имеет 480 x 800 пикселей, 3,7 дюйма, а HD - 480 x 800 пикселей, спецификация экрана 4.3 дюйма.

Я запускаю код, который принимается как ответ из этого потока Как получить размер экрана устройства?, но это неправильно! Например, для размера экрана 3,7 дюймы возвращает 2.4, что очень неправильно!

Кто-нибудь знает, как получить реальный размер экрана? Мне не нужна резолюция. Мне нужен размер экрана на дюймах.

ПРИМЕЧАНИЕ: этот код неверен (для меня это не работает)

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels; //give me 320
int height = dm.heightPixels; //give me 533

У меня HTC Desire и мое разрешение 480 x 800 пикселей!

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

Спасибо

Ответ 1

ОК НАКОНЕЦ Я нашел свою проблему

Да, этот код работает нормально, но я не возвращаю пиксели, он возвращает DIP (независимые от плотности пиксели), что не то же самое!

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels; //320 dip
int height = dm.heightPixels; //533 dip

Мне нужны были РЕАЛЬНЫЕ пикселы, и их вычисление выглядит следующим образом:

int widthPix = (int) Math.ceil(dm.widthPixels * (dm.densityDpi / 160.0));

теперь ширинаPix равна 480!

Ответ 2

Я нашел ваш вопрос, и это заставило меня задуматься, почему я определенно не вижу этого эффекта на любом устройстве, которое я разрабатываю или тестирую с помощью... getWidth()/getHeight() возвращают точные экстенты используемого экрана, Я подозреваю, что другие тоже окажутся здесь, добавив код, который вызывает больше путаницы и не понимает первопричину.

Оказывается, это именно то, что происходит, если вы явно отключите предварительное масштабирование. Смотрите вторую маркерную точку этого документа. (Быстрый поиск Google на терминах "320x533" привлек много других людей, которые столкнулись с этим.) Избавьтесь от своего предварительного масштабирования, и расхождение должно исчезнуть (getWidth()/getHeight() вернет фактическое размер, а не масштабный размер.

Примечание для разработчиков планшета: getWidth()/getHeight() не вернет размер необработанного экрана, потому что нижняя панель (48 пикселей или около того) не является частью области, к которой приложение может рисовать. Вы получите размер всего, что вы можете нарисовать (например, 1280x752, а не полный 1280x800 в альбомном режиме). Опять же, никакое предварительное масштабирование означает, что эти значения являются точными и точными.

Ответ 3

Вы можете сделать так:

DisplayMetrics m = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(m); // fills m

int x = m.xdpi;
int y = m.ydpi;

И это даст вам тип плотности экрана:

int density= m.densityDpi;

Ответ 4

Попробуйте использовать Display класс, а не DisplayMetrics.

Display dispOb = getWindowManager().getDefaultDisplay();
String widthAndHeight= dispOb.getWidth()+"X"+dispOb.getHeight();

Ответ 5

Отключите предварительное масштабирование, добавив эту строку в файл манифеста:

<supports-screens android:anyDensity="true" />

Позиция

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="...."
  android:versionCode="1"
  android:versionName="1.0">

<supports-screens android:anyDensity="true" />

<application android:label="@string/app_name" >
...