如何获取安卓设备屏幕尺寸?

34

我有两个分辨率相同的安卓设备

设备1 -> 分辨率480x800,对角线屏幕尺寸 -> 4.7英寸

设备2 -> 分辨率480x800,对角线屏幕尺寸 -> 4.0英寸

如何找到设备的对角线屏幕尺寸?

以编程方式检测7英寸和10英寸平板电脑

我已经使用了上面的链接,但它给出的是两台设备的相同对角线屏幕尺寸 -> 5.8


那么你的问题是什么? - GrIsHu
我想编程方式找到对角线屏幕尺寸,以确定设备类型。 - Kailas
你尝试的代码是正确的,因为你得到了对角线屏幕尺寸。 - GrIsHu
2
但是它为两个设备提供了相同的对角线屏幕尺寸。还有其他计算对角线屏幕尺寸的方法吗? - Kailas
7个回答

88

尝试使用此代码以获取屏幕尺寸(英寸)

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width=dm.widthPixels;
int height=dm.heightPixels;
double wi=(double)width/(double)dm.xdpi;
double hi=(double)height/(double)dm.ydpi;
double x = Math.pow(wi,2);
double y = Math.pow(hi,2);
double screenInches = Math.sqrt(x+y);

7
无法获取精确位置。如果屏幕尺寸为5.00英寸,则获得4.338值。 - Vrajesh
9
double wi=(double)width/dm.xdpi; double hi=(double)height/dm.ydpi; 这样做更加精确。根据 DensityMetrics 的文档,它可以给出精确的密度值,而 dm.densityDpi 只能提供某些离散的值。我已经验证过在两个设备上运行正常。 - Matthew Grivich
4
不准确,我的4.7英寸手机测得返回值是4.3英寸。 - Shayan_Aryan
1
如果你得到了奇怪的答案(或者更重要的是,因为你使用大小来缩放东西而导致图像出现问题),不要忘记使用scaledDensity。请参见下面的答案。 - Moe Singh
1
对于SDK 17及以上版本,请参考https://dev59.com/WGIk5IYBdhLWcg3wke7N#55337830以获取准确的屏幕尺寸。 - devgun
当Google Pixel 2 XL实际上为6英寸时,返回5.7英寸。 - Johann

12

这个行不通吗?

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
double x = Math.pow(dm.widthPixels / dm.xdpi, 2);
double y = Math.pow(dm.heightPixels / dm.ydpi, 2);
double screenInches = Math.sqrt(x + y);
Log.d("debug", "Screen inches : " + screenInches); 

11
很好的复制粘贴 :) 相似的答案请参考 https://dev59.com/sGw15IYBdhLWcg3weLoF - GrIsHu
你也可以作为评论发布。 - GrIsHu
9
有趣,我从http://stackoverflow.com/questions/18106854/how-does-android-choose-which-small-normal-large-resource-folder?rq=1复制。 - Smartis

8

如果您像我一样根据屏幕尺寸更改大小,请不要忘记将屏幕尺寸乘以缩放密度。例如:

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
double x = Math.pow(dm.widthPixels / dm.xdpi, 2);
double y = Math.pow(dm.heightPixels / dm.ydpi, 2);
double screenInches = Math.sqrt(x + y) * dm.scaledDensity;
Log.d("debug", "Screen inches : " + screenInches); 

请注意倒数第二行!以下是有关scaledDensity的更多信息:DisplayMetrics.scaledDensity在Android中实际返回什么?

你链接的问题的被采纳答案也提到了使用getResources().getDisplayMetrics();来获取正确的scaledDensity值。 - jk7
dm.scaledDensity 挽救了我的一天。谢谢。 - masgar

7

以上答案都没有给出正确的屏幕尺寸... 但下面的方法可以实现正确的尺寸。

private String getScreenSize() {
    Point point = new Point();
    ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRealSize(point);
    DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
    int width=point.x;
    int height=point.y;
    double wi=(double)width/(double)displayMetrics.xdpi;
    double hi=(double)height/(double)displayMetrics.ydpi;
    double x = Math.pow(wi,2);
    double y = Math.pow(hi,2);
    return String.valueOf(Math.round((Math.sqrt(x+y)) * 10.0) / 10.0);
}

注意:这仅适用于API 17及以上版本。

我有一块1.5英寸的手表,这个方法返回5.5。 - Sergey

5

试试这个:

 public static Boolean isTablet(Context context) {

    if ((context.getResources().getConfiguration().screenLayout & 
            Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE) {

      return true;
  }
    return false;
}

4
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
String screenWidthInPix = displayMetrics.widthPixels;
String screenheightInPix = displayMetrics.heightPixels;
这段代码获取了屏幕的宽度和高度信息,其中getDisplayMetrics()方法返回了一个DisplayMetrics对象,该对象包含了一些关于显示器的通用信息,如分辨率、密度等。widthPixels和heightPixels属性分别表示屏幕的宽度和高度像素值。

1
这是一种不好的方法。三个资源返回了不准确的dpi和分辨率。 - grebulon

4

使用毕达哥拉斯定理来计算安卓手机/平板电脑屏幕的对角线尺寸,同样的原则也可以应用于iPhone或Blackberry屏幕。

以下是另一种方法:

  DisplayMetrics met = new DisplayMetrics();                
  this.getWindowManager().getDefaultDisplay().getMetrics(met);// get display metrics object
  String strSize = 
  new DecimalFormat("##.##").format(Math.sqrt(((met.widthPixels / met.xdpi) *
  (met.widthPixels / met.xdpi)) +
  ((met.heightPixels / met.ydpi) * (met.heightPixels / met.ydpi))));
  // using Dots per inches with width and height

这个.getWindowManager()会报错,我该怎么办?我可以通过这些view.getContext().getResources().getDisplayMetrics()获取显示矩阵。 - Kailas
方法getWindowManager()对于homeFragment类型未定义。 - Kailas
我是这样写的。有什么问题吗?因为它给了我错误的对角线屏幕尺寸。 DisplayMetrics met = view.getContext().getResources().getDisplayMetrics();// 获取显示度量对象 String strSize = new DecimalFormat("##.##").format(Math.sqrt(((met.widthPixels / met.xdpi) * (met.widthPixels / met.xdpi)) + ((met.heightPixels / met.ydpi) * (met.heightPixels / met.ydpi))));Log.d("Sreen Inches0", "Inches0:"+strSize); - Kailas
方法 getWindowManager() 需要活动实例,因此您需要编写 Activity.getWindowManager() - GrIsHu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接