2017-04-10 53 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,但因爲我更新它無法找到這個值。而我在其他手機上試過我也得到了錯誤的值 –