Android DisplayMetrics возвращает неверный размер экрана в пикселях на ICS

Я пробовал это....

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int fullscreenheight = metrics.heightPixels;
int fullscreenwidth = metrics.widthPixels;

и....

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

Gnex имеет дисплей 720×1280. Возвращаемый результат для ширины/высоты (в зависимости от ориентации, конечно) никогда не 1280. Я подумал, что это может иметь какое-то отношение к панели навигации на экране в Ice Cream Sandwich, поэтому я скрываю это с :

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

...а затем начал поток, который непрерывно регистрирует высоту/ширину размера экрана. Даже после навигации МПС полностью исчезла....размер экрана никогда не сообщит значение 1280. Я бы получил такие цифры:

width  = 720
height = 1184

как вы получаете истинное разрешение экрана устройства в ICS?

причина, почему мне нужно это значение, потому что мое приложение воспроизводит видео и я бы хотел, чтобы видео на весь экран, когда устройство находится в альбомной ориентации. Теперь я знаю, что вы думаете, почему бы просто не дать videoview значение "match_parent" для высоты/ширины? Причина это потому, что мои видео имеют несколько пропорций, и я хотел бы иметь возможность рассчитать правильный размер видео в зависимости от всей ширины экрана.

6 ответов


Я нашел это скрытое сокровище только для ICS......если вы ориентируетесь по API выше, чем ICS см. Комментарий к Крис Schmich ниже.

как скрыть и отобразить панель навигации на Android ICS build

в случае, если ссылка умрет....вот как получить фактический размер экрана устройства.....

Display display = getWindowManager().getDefaultDisplay();     
Method mGetRawH = Display.class.getMethod("getRawHeight");
Method mGetRawW = Display.class.getMethod("getRawWidth");
int rawWidth = (Integer) mGetRawW.invoke(display);
int rawHeight = (Integer) mGetRawH.invoke(display);

редактировать (11/19/12)

приведенный выше код не будет работать на Android 4.2 и будет выдано исключение....Я еще найти способ, чтобы получить полный размер экрана устройства в Android 4.2. Когда я это сделаю, я отредактирую этот ответ, но пока вы должны кодировать с непредвиденными обстоятельствами для android 4.2!!


из ответа Ахмеда, это полный код без ошибок:

    int width = 0, height = 0;
    final DisplayMetrics metrics = new DisplayMetrics();
    Display display = getWindowManager().getDefaultDisplay();
    Method mGetRawH = null, mGetRawW = null;

    try {
        // For JellyBean 4.2 (API 17) and onward
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
            display.getRealMetrics(metrics);

            width = metrics.widthPixels;
            height = metrics.heightPixels;
        } else {
            mGetRawH = Display.class.getMethod("getRawHeight");
            mGetRawW = Display.class.getMethod("getRawWidth");

            try {
                width = (Integer) mGetRawW.invoke(display);
                height = (Integer) mGetRawH.invoke(display);
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    } catch (NoSuchMethodException e3) {  
        e3.printStackTrace();
    }

можно использовать getRealSize чтобы получить разрешение экрана. Он официально поддерживается в API 17 и выше, но он фактически существовал в SDK с API 14. Если вы используете платформу SDK для API 17 или выше, вы можете получить доступ к методу нормально и просто обойти предупреждение о том, что он доступен только в API 17.

/**
 * Gets the device's native screen resolution rotated
 * based on the device's current screen orientation.
 */
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) //To remove warning about using
                                               //getRealSize prior to API 17
private Point screenResolution() {
    WindowManager windowManager =
        (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Display display = windowManager.getDefaultDisplay();
    Point screenResolution = new Point();

    if (Build.VERSION.SDK_INT < 14)
        throw new RuntimeException("Unsupported Android version.");
    display.getRealSize(screenResolution);

    return screenResolution;    
}

я протестировал это в реальном устройстве Android 5.0.2 и эмуляторе под управлением 4.1.1 (и, возможно, других).

спасибо benc на указали на это в комментариях.


попробуй такое

    final DisplayMetrics metrics = new DisplayMetrics(); 
    Display display = getWindowManager().getDefaultDisplay();     
    Method mGetRawH = null,mGetRawW = null;

    try {
                    // For JellyBeans and onward
        if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN){
            display.getRealMetrics(metrics);

            realWidth = metrics.widthPixels;
            realHeight = metrics.heightPixels;
        }else{
            mGetRawH = Display.class.getMethod("getRawHeight");
            mGetRawW = Display.class.getMethod("getRawWidth");

            try {
                realWidth = (Integer) mGetRawW.invoke(display);
                realHeight = (Integer) mGetRawH.invoke(display);
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

public static Point getRealSize(Display display) {
        Point outPoint = new Point();
        Method mGetRawH;
        try {
            mGetRawH = Display.class.getMethod("getRawHeight");
            Method mGetRawW = Display.class.getMethod("getRawWidth");
            outPoint.x = (Integer) mGetRawW.invoke(display);
            outPoint.y = (Integer) mGetRawH.invoke(display);
            return outPoint;
        } catch (Throwable e) {
            return null;
        }
    }

    public static Point getSize(Display display) {
        if (Build.VERSION.SDK_INT >= 17) {
            Point outPoint = new Point();
            DisplayMetrics metrics = new DisplayMetrics();
            display.getRealMetrics(metrics);
            outPoint.x = metrics.widthPixels;
            outPoint.y = metrics.heightPixels;
            return outPoint;
        }
        if (Build.VERSION.SDK_INT >= 14) {
            Point outPoint = getRealSize(display);
            if (outPoint != null)
                return outPoint;
        }
        Point outPoint = new Point();
        if (Build.VERSION.SDK_INT >= 13) {
            display.getSize(outPoint);
        } else {
            outPoint.x = display.getWidth();
            outPoint.y = display.getHeight();
        }
        return outPoint;
    }

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

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