Android 使用非本机工具检测Qt中平板电脑或手机的正确方法

Android 使用非本机工具检测Qt中平板电脑或手机的正确方法,android,ios,qt,size,screen,Android,Ios,Qt,Size,Screen,我的目的是确定我在平板电脑或手机上部署应用程序 在我部署iOS、Android、Linux桌面和Windows应用程序时,最好使用非本机工具 但作为实验的一部分,我在android上尝试了以下技巧(java类的方法): 实验#1 public class JniUtilities { public static boolean isTablet(Context context) { Log.d("INDENTIFICATOR >> ", "HEJJ, I AM

我的目的是确定我在平板电脑或手机上部署应用程序

在我部署iOS、Android、Linux桌面和Windows应用程序时,最好使用非本机工具

但作为实验的一部分,我在android上尝试了以下技巧(java类的方法):

实验#1

public class JniUtilities {
    public static boolean isTablet(Context context) {
        Log.d("INDENTIFICATOR >> ", "HEJJ, I AM CALLED!");
        return ((context.getResources().getConfiguration().screenLayout
                & Configuration.SCREENLAYOUT_SIZE_MASK)
                >= Configuration.SCREENLAYOUT_SIZE_LARGE);
    }
}
结果:它似乎工作正常,但不适用于其他操作系统:(

实验#2

让我们试试Qt框架工具。在这里我可以了解设备的物理尺寸,它具有
QScreen类
实例。作为
isTablet
的标准,我将使用
对角线>7.0英寸
的条件

qreal Utils::getDiagInch() {
    QScreen *srn = qApp->screens().at(0);
    qreal w = srn->physicalSize().width();
    qreal h = srn->physicalSize().height();
    qreal inches = qSqrt(w * w + h * h) / 25.4; // millimeters to inches
    qDebug() << "physical diagonal >> " << inches;
    return inches;
}
输出:

D/ph宽度>>(27948):3.380281686782837
D/ph高度>>(27948):6.009389877319336
D/ph对角线>>(27948):6.894858300184821

结果:DisplayMetrics也返回不正确的值

总体


我尝试过许多playmarket应用程序。他们知道如何准确地回答这个问题:没有一个应用程序错误地检测平板电脑/手机。他们是如何做到的?他们使用本机工具吗?或者Qt Framework有一种通用的非本机方法来毫不含糊地解决这个问题???

如果你必须获得屏幕的dpi值,你可以遵循以下方法:

专业版

android{
QT += androidextras
}
包括

#if defined(Q_OS_ANDROID)
#include <QAndroidJniObject>
#endif
物理尺寸:

width/m_dpi //should give the physical width of screen in inches.
要在android设备中检查设备是平板电脑还是移动设备,最小宽度为600dp的mdpi(160 dpi)android设备可以被视为平板电脑(根据您的要求可能有所不同)

我已经验证了Android和iOS的代码。 您可能必须为windows使用以下代码。(请验证)

谢谢!问题是:QScreen对physicalSize()的计算不正确,因为QScreen::physicalDotsPerInch()返回错误的值,但DisplayMetrics::densityDpi返回正确的值。HTC ONE X的测试结果:QScreen::physicalDotsPerInch():212.574 ppi DisplayMetrics::densityDpi:文档中的320 ppi:~312 ppi
qreal m_dpi;
qreal m_pixelRatio;

#if defined(Q_OS_ANDROID)
QAndroidJniObject qtActivity =    QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
QAndroidJniObject resources = qtActivity.callObjectMethod("getResources","()Landroid/content/res/Resources;");
QAndroidJniObject displayMetrics = resources.callObjectMethod("getDisplayMetrics","()Landroid/util/DisplayMetrics;");
int density = displayMetrics.getField<int>("densityDpi");
m_dpi = density;
m_pixelRatio = 1;
#else
m_dpi = qApp->primaryScreen()->physicalDotsPerInch();
m_pixelRatio = qApp->primaryScreen()->devicePixelRatio();
#endif
qreal m_dpiRef = 132; //reference device dpi (ipad);
double scalingFactor = 1;

if(m_dpi>0&&m_dpiRef >0)
 scalingFactor=m_dpi/m_dpiRef;
width/m_dpi //should give the physical width of screen in inches.
width*160/m_dpi >= 600 //to check if the screen size is large enough(tablet). 
m_dpi = qApp->primaryScreen()->logicalDotsPerInch()*qApp->primaryScreen()->devicePixelRatio();