【问题标题】:Get the size of the screen not using getMetrics不使用 getMetrics 获取屏幕大小
【发布时间】:2017-04-10 09:26:31
【问题描述】:

我想获取手机屏幕的尺寸,但它总是给我错误的值,我已经用过

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;
}

但是在我的 Samsung S7 on sdk 7.0 上我得到了 1920x1080 这是错误的,因为在我的 S7 on sdk 6.0.1 上我得到了 2560x1440 这是真正的价值。 我尝试了很多解决方案,但没有发现任何好处。

谢谢

【问题讨论】:

    标签: android size screen resolution


    【解决方案1】:

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

    【讨论】:

    • 谢谢,没看到,我更改了设置并得到了正确的结果,但是在更新到 7.1.1 的模拟 Nexus 5 上仍然有问题,我得到的是 1794x1080 而不是 1920x1080 ,你知道为什么吗?
    • 找到了我的答案,问题是按钮栏不被视为屏幕的一部分。因此,如果您使用物理按钮创建虚拟设备,您将不再出现此错误。与华为 P9 一样,使用按钮栏的真实设备也是如此。
    【解决方案2】:

    使用这个

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

    【讨论】:

      【解决方案3】:

      这肯定会奏效。

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

      【讨论】:

      • 相同的结果,没有异常但得到 1920x1080
      【解决方案4】:

      试试this link

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

      【讨论】:

      • 相同的结果,1920x1080 在我的 sdk 7.0 上的三星 S7 上
      【解决方案5】:

      下面的方法返回一个Point,其中包含显示size(x 为宽度,y 为高度):

      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;
          }
      

      P.S:这是 Telegram 用于获取显示尺寸的代码。

      【讨论】:

      • 我试过这个方法但是得到了这个日志:tmessagesdisplay size = 1080 1920 435.42825x431.57477
      • 好吧,“1080 1920”是您的设备尺寸(以像素为单位)
      • 但我知道 1920x1080 是错误的,因为如果你在三星网站上查看,你会发现 2560x1440,我发现了一次值,但在 sdk 6.0.1 上的三星 S7 上,但因为我没办法更新它找到这个值。我在其他手机上试过,我也得到了错误的值
      • 这个值是你的手机绘制视图的真实状态,所以它确实是你得到的所有像素。但这可能是一个与操作系统相关的问题,你认为操作系统有可能缩小你的显示为全高清?你有没有调整任何显示设置?
      • 我想我没有,因为我在另一个 S7 上的 7.0 上得到了相同的值,我也在其他一些手机和模拟器上尝试过,仍然给我错误的值。
      猜你喜欢
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      相关资源
      最近更新 更多