Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get screen size in Android, including virtual buttons?

Tags:

android

For normal uses you can use the DisplayMetrics class and get the "renderable" size, but I want to figure out the actual physical screen size, which includes the virtual buttons height.

On my Galaxy Nexus the reported size no matter what I tried is 1196x720, what can I use to get the physical one which is 1280x720 ? Same goes for Nexus 7, Nexus 4 and Nexus 10 devices.

UPDATE : This is the final code I now use, including the fix :

    //Activity A = this;
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager wm = (WindowManager) A.getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
    Display disp = wm.getDefaultDisplay();

    int API_LEVEL =  android.os.Build.VERSION.SDK_INT;
    if (API_LEVEL >= 17)
    {
        disp.getRealMetrics(displayMetrics);
    }
    else
    {
        disp.getMetrics(displayMetrics);
    }

    int Width = displayMetrics.widthPixels;
    int Height = displayMetrics.heightPixels;
like image 940
RelativeGames Avatar asked May 12 '13 00:05

RelativeGames


2 Answers

You should use Display.getRealSize(Point) From the official docs here

The display area is described in two different ways.

The application display area specifies the part of the display that may contain an application window, excluding the system decorations.

The application display area may be smaller than the real display area because the system subtracts the space needed for decor elements such as the status bar. Use the following methods to query the application display area: getSize(Point), getRectSize(Rect) and getMetrics(DisplayMetrics).

The real display area specifies the part of the display that contains content including the system decorations. Even so, the real display area may be smaller than the physical size of the display if the window manager is emulating a smaller display using (adb shell am display-size). Use the following methods to query the real display area: getRealSize(Point), getRealMetrics(DisplayMetrics).

like image 77
a.bertucci Avatar answered Oct 03 '22 01:10

a.bertucci


The answer in the similar question seems to have a solution to get the real size of the display when API < 17 https://stackoverflow.com/a/15699681/601298

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try {
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 17)
try {
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}
like image 37
orcy Avatar answered Oct 03 '22 01:10

orcy