我试过了......
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.我认为这可能与冰淇淋三明治中的屏幕导航栏有关,所以我隐藏了:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
...然后启动一个连续记录屏幕尺寸高度/宽度的线程。即使在ICS导航栏完全消失后......屏幕大小也永远不会报告1280值。我会得到这样的数字:
width = 720
height = 1184
如何在ICS中获得真正的设备屏幕分辨率?
我之所以需要此值,是因为我的应用会播放视频,并且我希望视频在设备处于横向时占据整个屏幕。现在我知道你在想什么,为什么不给视频视图增加高度/宽度的“match_parent”值?原因是我的视频有多种宽高比,我希望能够根据屏幕的整个宽度计算出正确的视频大小。
答案 0 :(得分:19)
我只为ICS发现了这个隐藏的宝藏......如果您的目标API高于ICS,请参阅Chris Schmich的评论。
How to hide and display the navigation bar on 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编写偶然事件!!
答案 1 :(得分:19)
从Ahmed的回答中,这是完整的代码,没有错误:
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();
}
答案 2 :(得分:8)
您可以使用getRealSize
来获取屏幕分辨率。它在API 17及更高版本中得到官方支持,但它实际上存在于自API 14开始的SDK中。如果您将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(可能还有其他设备)的模拟器中对此进行了测试。
答案 3 :(得分:6)
试试这个
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();
}
}
答案 4 :(得分:3)
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;
}
答案 5 :(得分:1)
在某些设备上,例如平板电脑,根本无法隐藏导航栏(source,请参阅“系统UI可见性控制”部分),因为没有硬件按钮作为备份。如果您的设备上已经设法隐藏了该栏,您可以使用getWidth()和getHeight()进行全屏查看并请求其大小。
据我所知,没有一种可靠的方法可以在所有ICS设备上获得屏幕尺寸。