2017-04-10 20 views
1

我想拿到手机的屏幕尺寸,但它一直给我错误的价值观,我已经使用获取屏幕的大小不使用getMetrics

WindowManager windowmanager = (WindowManager)  
getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
Display display = windowmanager.getDefaultDisplay(); 
DisplayMetrics displayMetrics = new DisplayMetrics(); 
display.getMetrics(displayMetrics); 

float deviceWidth = displayMetrics.widthPixels; 
float deviceHeight = displayMetrics.ydpi; 

我想这太代码:

Resources resources = getResources(); 
Configuration config = resources.getConfiguration(); 
DisplayMetrics dm = resources.getDisplayMetrics(); 
// Note, screenHeightDp isn't reliable 
// (it seems to be too small by the height of the status bar), 
// but we assume screenWidthDp is reliable. 
// Note also, dm.widthPixels,dm.heightPixels aren't reliably pixels 
// (they get confused when in screen compatibility mode, it seems), 
// but we assume their ratio is correct. 
double screenWidthInPixels = (double)config.screenWidthDp *dm.density; 
double screenHeightInPixels = screenWidthInPixels * dm.heightPixels /dm.widthPixels; 
deviceWidth = (int)(screenWidthInPixels + .5); 
deviceHeight = (int)(screenHeightInPixels + .5); 

而且还认为:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
    Point realSize = new Point(); 
    display.getRealSize(realSize); 
    deviceWidth= realSize.x; 
    deviceHeight = realSize.y; 
} 

但在我的三星S7在SDK 7.0我得到了1920×1080这是错误的,因为在S7在sdk 6.0.1我得到了2560x1440这是真正的价值。 我尝试了很多解决方案,但没有发现任何好的东西。

感谢

回答

0

你的代码是正确的。以防万一,如果您想知道为什么得到这些值,那是因为您的手机在更新至7.0(牛轧糖)后会自动将默认分辨率设置为1920x1080,以节省电池寿命。 Nougat的新功能之一是显示缩放选项,您可以将手机(在此情况下为S7)设置为3种可用模式(WQHD(2560x1440),FHD(1920x1080)和HD(1280x720))。尝试转至Settings -> Display并根据需要更改设置。你可以在这里阅读更多:Galaxy S7 on Nougat defaults to 1080p

+0

谢谢,没有看到,我改变了设置,并得到了正确的结果,但我仍然有一个模拟的Nexus 5更新到7.1.1的问题,我得到1794x1080而不是1920x1080,你有什么想法为什么? –

+0

找到我的答案,问题是按钮栏不被视为屏幕的一部分。所以如果你用pysical按钮创建一个虚拟设备,你不会再有这个错误了。与使用按钮栏的真实设备相同,如华为P9。 –

0

使用本

getWindowManager().getDefaultDisplay().getHeight(); 
    getWindowManager().getDefaultDisplay().getWidth(); 
+0

我已经试过这种方法,结果相同 –

0

这将肯定工作。

try { 
display.getRealSize(size); 
height = size.y; 
width=size.x; 
} catch (NoSuchMethodError e) { 
height = display.getHeight(); 
width=display.getWidth(); 
} 
+0

同样的结果,没有例外,但得到了1920x1080 –

+0

http://stackoverflow.com/a/43320354/7795876是正确的。 – Hangman

0

尝试this link

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

同样的结果,在我的三星S7在sdk 7.0上的1920x1080 –

0

下面的方法返回包含显示大小(x作为宽度和y为高度)一个Point

public static Point checkDisplaySize(Context context) { 
     Point tempDisplaySize = new Point(); 
     try { 
      WindowManager manager = (WindowManager) context().getSystemService(Context.WINDOW_SERVICE); 
      if (manager != null) { 
       Display display = manager.getDefaultDisplay(); 
       if (display != null) { 
        display.getSize(tempDisplaySize); 
        Log.d("tmessages", "display size = " + displaySize.x + " " + displaySize.y); 
       } 
      } 
     } catch (Exception e) { 
      Log.e("tmessages", e.getMessage(), e); 
     } 
     return tempDisplaySize; 
    } 

PS:这是代码电报用于获取显示大小。

+0

我试过这种方法,但得到了这个日志: tmessagesdisplay size = 1080 1920 435.42825x431.57477 –

+0

好吧“1080 1920”是你的设备大小像素 –

+0

但我知道1920x1080是错误的,因为如果你检查三星网站,你会发现2560x1440,价值我发现一次,但在sdk 6.0.1上的三星S7,但因为我更新它无法找到这个值。而我在其他手机上试过我也得到了错误的值 –