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

Я пробовал разные способы получить размер экрана устройства, но он всегда возвращал мне неправильный размер (791x480 вместо 854x480). Это может быть из-за панели навигации. В настоящее время на моем устройстве работает JellyBean 4.1.1.

Я пытался:

Display display = getWindowManager().getDefaultDisplay();  
Point size = new Point();
display.getSize(size);
OpenGLRenderer.widthScreen = size.x;
OpenGLRenderer.heightScreen = size.y;

И:

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
String resolution = dm.widthPixels + "x" + dm.heightPixels;

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

setContentView(mGLSurfaceView);
mGLSurfaceView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

Я заметил, что в логарифме возвращается правильный размер:

01-01 03:05:06.967: I/InputReader(1961): 
    Device reconfigured: id=8, name='cyttsp-spi', 
    surface size is now 480x854, mode is 1

In my AndroidManifest:

uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16"

Я использовал:

Почему я не могу получить реальный размер (480x854)? Или как я могу использовать поверхность, возвращенную «Устройством перенастроено»?


person Trois    schedule 29.11.2012    source источник
comment
попробуйте getRealMetrics developer.android.com/reference /андроид/вид/   -  person Jameo    schedule 29.11.2012
comment
Я смущен. Вы спрашиваете, как получить физический размер устройства, а затем говорите, что получаете размер за вычетом панели навигации. Затем вы говорите, что у вас есть физический размер устройства. Где именно ваша проблема?   -  person DeeV    schedule 29.11.2012
comment
@deev Вы правы, я спрашиваю, как получить физический размер устройства, я просто предполагаю, что возвращаемый мне размер - это размер минус панель навигации. Я прошу способ написать код, который даст физический размер для любого устройства.   -  person Trois    schedule 30.11.2012
comment
@jameo Я пытаюсь использовать ваш метод, но когда я пробую это: 'final DisplayMetrics metrics = new DisplayMetrics(); Отображение дисплея = getWindowManager().getDefaultDisplay(); display.getRealMetrics(метрики);' Я получил сообщение об ошибке для getRealMetrics, в котором говорится: Метод getRealMetrics(DisplayMetrics) не определен для типа Display. Любая идея ?   -  person Trois    schedule 30.11.2012
comment
Вы сказали в Logcat, что получили ожидаемый размер. Лог не изменит для вас переменные, так что я все еще в замешательстве.   -  person DeeV    schedule 30.11.2012
comment
Строка с хорошим значением, которую я вижу в логарифме, не является результатом, который я контролирую. Это не из-за строки кода, которую я написал, это возвращается «автоматически», поэтому я спрашиваю, какую функцию я должен использовать, чтобы получить хороший размер (или как я могу получить хорошее значение, которое возвращается автоматически, чтобы поместите его в переменную). Если более понятно.   -  person Trois    schedule 30.11.2012


Ответы (4)


Попробуйте позвонить

    display.getRealSize();

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я этого не осознавал, но это будет работать только для API 17 (Android 4.2/JellyBean) и выше.

person Andrew Campbell    schedule 29.11.2012

Попробуй это

 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{
    // Below Jellybeans you can use reflection method 

        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();
        }
    }
person Ahmed    schedule 29.04.2013
comment
не должно ли это быть JELLY_BEAN_MR1, а не JELLY_BEAN быть ›= 17? - person ThomasRS; 15.10.2013
comment
Я согласен, Томас, это должен быть JELLY_BEAN_MR1. - person Ethan; 26.03.2016

Я столкнулся с той же проблемой на планшете Android 3.2. Я тестировал как getRealSize, так и getDisplayMetrics. Ожидается, что они вылетят, поскольку должны были быть доступны в API 17. Но, как ни странно, getDisplayMetrics не вылетает в моем 3.2 и возвращает правильное измерение. getRealSize аварийно завершает работу.

person Herve Thu    schedule 03.01.2014

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

findViewById(android.R.id.content).getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            View view =  findViewById(android.R.id.content);
            Log.e("test", "root view height is " + view.getHeight());

        }
    });
person Liu Tom    schedule 22.06.2018