有没有办法确定android的物理屏幕高度(厘米或英寸)?

有没有办法确定android的物理屏幕高度(厘米或英寸)?,android,screen,resolution,inches,Android,Screen,Resolution,Inches,我需要知道设备上屏幕的实际长度单位有多大,这样我才能计算重力引起的加速度,单位为像素/毫秒 Android API中是否有用于此的方法?您需要使用屏幕密度来计算此值 Context.getResources().getDisplayMetrics().density 根据文件: 显示器的逻辑密度。这是密度无关像素单元的比例因子,其中一个倾角是大约160 dpi屏幕(例如240x320,1.5“x2”屏幕)上的一个像素,提供系统显示的基线。因此,在160dpi屏幕上,该密度值为1;在120 dp

我需要知道设备上屏幕的实际长度单位有多大,这样我才能计算重力引起的加速度,单位为像素/毫秒


Android API中是否有用于此的方法?

您需要使用屏幕密度来计算此值

Context.getResources().getDisplayMetrics().density
根据文件:

显示器的逻辑密度。这是密度无关像素单元的比例因子,其中一个倾角是大约160 dpi屏幕(例如240x320,1.5“x2”屏幕)上的一个像素,提供系统显示的基线。因此,在160dpi屏幕上,该密度值为1;在120 dpi的屏幕上,它将是0.75;等等

该值并不完全遵循真实屏幕大小(由xdpi和ydpi给出),而是用于根据显示dpi的总体变化逐步调整整个UI的大小。例如,240x320屏幕的密度为1,即使其宽度为1.8英寸1.3英寸但是,如果屏幕分辨率增加到320x480,但屏幕大小保持在1.5“x2”,则密度将增加(可能增加到1.5)

使用
xdpi*widthPixels
ydpi*heightPixels
可能会得到您想要的。我认为。

使用以下方法:

    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    double x = Math.pow(mWidthPixels/dm.xdpi,2);
    double y = Math.pow(mHeightPixels/dm.ydpi,2);
    double screenInches = Math.sqrt(x+y);
    Log.d("debug","Screen inches : " + screenInches);
当mWidthPixels和mHeightPixels取自下面的代码时

private void setRealDeviceSizeInPixels()
{
    WindowManager windowManager = getWindowManager();
    Display display = windowManager.getDefaultDisplay();
    DisplayMetrics displayMetrics = new DisplayMetrics();
    display.getMetrics(displayMetrics);


    // since SDK_INT = 1;
    mWidthPixels = displayMetrics.widthPixels;
    mHeightPixels = displayMetrics.heightPixels;

    // includes window decorations (statusbar bar/menu bar)
    if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
    {
        try
        {
            mWidthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(display);
            mHeightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(display);
        }
        catch (Exception ignored)
        {
        }
    }

    // includes window decorations (statusbar bar/menu bar)
    if (Build.VERSION.SDK_INT >= 17)
    {
        try
        {
            Point realSize = new Point();
            Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize);
            mWidthPixels = realSize.x;
            mHeightPixels = realSize.y;
        }
        catch (Exception ignored)
        {
        }
    }
private void setRealDeviceSizeInPixels()
{
WindowManager WindowManager=getWindowManager();
Display Display=windowManager.getDefaultDisplay();
DisplayMetrics DisplayMetrics=新的DisplayMetrics();
display.getMetrics(displayMetrics);
//因为SDK_INT=1;
mWidthPixels=displayMetrics.widthPixels;
mHeightPixels=displayMetrics.heightPixels;
//包括窗口装饰(状态栏/菜单栏)
如果(Build.VERSION.SDK_INT>=14&&Build.VERSION.SDK_INT<17)
{
尝试
{
mWidthPixels=(整数)Display.class.getMethod(“getRawWidth”).invoke(Display);
mHeightPixels=(整数)Display.class.getMethod(“getRawHeight”).invoke(Display);
}
捕获(忽略异常)
{
}
}
//包括窗口装饰(状态栏/菜单栏)
如果(Build.VERSION.SDK_INT>=17)
{
尝试
{
点realSize=新点();
Display.class.getMethod(“getRealSize”,Point.class).invoke(Display,realSize);
mWidthPixels=realSize.x;
mHeightPixels=realSize.y;
}
捕获(忽略异常)
{
}
}
请参阅本帖:

要获取当前大小,请在末尾使用Math.round

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

screenInches=  (double)Math.round(screenInches * 10) / 10;

下面的代码片段将帮助您获得以英寸为单位的屏幕大小

public static double getScreenSizeInches(Activity activity){
    WindowManager windowManager = activity.getWindowManager();
    Display display = windowManager.getDefaultDisplay();
    DisplayMetrics displayMetrics = new DisplayMetrics();
    display.getMetrics(displayMetrics);

    // since SDK_INT = 1;
    int mWidthPixels = displayMetrics.widthPixels;
    int mHeightPixels = displayMetrics.heightPixels;

    // includes window decorations (statusbar bar/menu bar)
    if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17) {
        try{
            mWidthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(display);
            mHeightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(display);
        } catch (Exception ignored) {}
    }

    // includes window decorations (statusbar bar/menu bar)
    if (Build.VERSION.SDK_INT >= 17) {
        try {
            Point realSize = new Point();
            Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize);
            mWidthPixels = realSize.x;
            mHeightPixels = realSize.y;
        } catch (Exception ignored) {}
    }

    DisplayMetrics dm = new DisplayMetrics();
    activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
    double x = Math.pow(mWidthPixels / dm.xdpi, 2);
    double y = Math.pow(mHeightPixels / dm.ydpi, 2);
    return Math.sqrt(x + y);
}
公共静态双getScreenSizeInches(活动){
WindowManager WindowManager=activity.getWindowManager();
Display Display=windowManager.getDefaultDisplay();
DisplayMetrics DisplayMetrics=新的DisplayMetrics();
display.getMetrics(displayMetrics);
//因为SDK_INT=1;
int mWidthPixels=displayMetrics.widthPixels;
int mHeightPixels=displayMetrics.heightPixels;
//包括窗口装饰(状态栏/菜单栏)
如果(Build.VERSION.SDK_INT>=14&&Build.VERSION.SDK_INT<17){
试一试{
mWidthPixels=(整数)Display.class.getMethod(“getRawWidth”).invoke(Display);
mHeightPixels=(整数)Display.class.getMethod(“getRawHeight”).invoke(Display);
}捕获(忽略异常){}
}
//包括窗口装饰(状态栏/菜单栏)
如果(Build.VERSION.SDK_INT>=17){
试一试{
点realSize=新点();
Display.class.getMethod(“getRealSize”,Point.class).invoke(Display,realSize);
mWidthPixels=realSize.x;
mHeightPixels=realSize.y;
}捕获(忽略异常){}
}
DisplayMetrics dm=新的DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
double x=数学功率(mWidthPixels/dm.xdpi,2);
双y=数学功率(mHeightPixels/dm.ydpi,2);
返回数学sqrt(x+y);
}

希望这能帮上忙。

我用这个得到了真正的尺寸

final DisplayMetrics metrics = new DisplayMetrics();
final WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    windowManager.getDefaultDisplay().getRealMetrics(metrics);
}
else {
    windowManager.getDefaultDisplay().getMetrics(metrics);
}
int realHeight = metrics.heightPixels; // This is real height
int realWidth = metrics.widthPixels; // This is real width

我已经尝试了其他答案中提到的大多数方法,但这些方法在特定的设备上失败。因此,下面是我对解决这个问题的一点贡献。代码是用Kotlin编写的

获取DisplayMetrics对象:

    val manager = mContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    val displayMetrics = DisplayMetrics()
    manager.getDefaultDisplay().getMetrics(displayMetrics)
以英寸为单位计算屏幕宽度,如下所示:

    val widthInDotPoints : Double = (displayMetrics.widthPixels * (160 * 1.0 /displayMetrics.densityDpi))
    val widthInInches : Double = width / displayMetrics.xdpi
在这里,我使用widthPixels计算了设备的宽度(以点为单位,dp),然后将其转换为以英寸为单位的宽度。我使用160.I.DisplayMetrics.DENSITY_media作为转换因子,将宽度像素转换为宽度点

同样,以英寸为单位计算屏幕高度:

    val heightInDotPoints : Double = (displayMetrics.heightPixels * (160 * 1.0 /displayMetrics.densityDpi))
    val heightInInches : Double = height / displayMetrics.ydpi

如另一张海报所述,使用xdpi和ydpi。密度故意不是物理屏幕大小的绝对映射,而是一个更抽象的单位,可以量化为少量离散值(目前为120dpi、160dpi、240dpi)。这是一种糟糕的方法,会导致dpi和分辨率的值不准确。我有约15台测试设备,其中一些设备出现故障,例如,它在摩托罗拉里程碑或中兴手机等某些型号上不起作用。返回值不准确,因为
getMetrics
(和
display.getwidt()
,或
display.getHeight()
)返回应用程序可用的值(例如,它不包含操作栏高度)。因此,在1280x800屏幕上,您可以获得值1260x800或1280x780等等。正如STeN提到的,此计算对于某些设备是不正确的。例如,此代码报告了一个3“的机器人仿生屏幕,实际上有一个4.3”的屏幕仿生上xdpi和ydpi的返回值分别为368和365,可能是由于奔腾显示器或摩托罗拉混淆。Th