【问题标题】:Android: How to get the real screen size of the device?Android:如何获取设备的真实屏幕尺寸?
【发布时间】:2012-11-29 14:52:25
【问题描述】:

我尝试了不同的方法来获取设备的屏幕尺寸,但它总是返回错误的尺寸(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);

我注意到在 logcat 中,返回了正确的大小:

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

在我的AndroidManifest:

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

我用过:

为什么我无法获得实际尺寸 (480x854)?或者如何使用“设备重新配置”返回的表面?

【问题讨论】:

  • 我很困惑。你问如何获得设备的物理尺寸,然后你说你得到的尺寸减去导航栏。然后你说你有设备的物理尺寸。你的问题到底出在哪里?
  • @deev 你说得对,我问的是如何获取设备的物理尺寸,我只是假设返回给我的尺寸是减去导航栏的尺寸。我正在寻求一种编写代码的方法,该代码将为任何设备提供物理尺寸。
  • @jameo 我正在尝试使用你的方法,但是当我尝试这个时:'final DisplayMetrics metrics = new DisplayMetrics();显示显示 = getWindowManager().getDefaultDisplay(); display.getRealMetrics(metrics);'我收到 getRealMetrics 错误,提示 方法 getRealMetrics(DisplayMetrics) 未针对 Display 类型定义。有什么想法吗?
  • 你在 Logcat 中说你得到了你期望的大小。日志不会为你改变变量,所以我还是很困惑。

标签: android resolution


【解决方案1】:

尝试调用

    display.getRealSize();

免责声明: 我没有意识到这一点,但这仅适用于 API 17(Android 4.2/JellyBean)及更高版本。

【讨论】:

    【解决方案2】:

    试试这个

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

    【讨论】:

    • 不应该是 JELLY_BEAN_MR1 而不是 JELLY_BEAN >= 17?
    • 我同意 Thomas,应该是 JELLY_BEAN_MR1。
    【解决方案3】:

    我在 Android 3.2 平板电脑上遇到了同样的问题。我测试了 getRealSize 和 getDisplayMetrics。预计它们会崩溃,因为它们应该在 API 17 上可用。但奇怪的是 getDisplayMetrics 不会在我的 3.2 上崩溃并返回正确的尺寸。 getRealSize 崩溃。

    【讨论】:

      【解决方案4】:

      如果要在activity中获取size,可以通过以下代码实现。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 2011-09-29
        • 1970-01-01
        • 2011-11-23
        • 1970-01-01
        • 1970-01-01
        • 2019-04-27
        相关资源
        最近更新 更多