Qt on android开发手册

  • android开发环境搭建
  • android蓝牙调试环境搭建
  • Qt On Android 隐藏状态栏
  • 获取Android系统信息
  • Android系统触控优化
  • Android系统WIFI显示已保存但不会自动重连
  • 其他参考文档



android蓝牙调试环境搭建

1.在windows平台调试蓝牙功能,MinGW 不支持蓝牙调试功能,需要将项目的Build转为MSVC。

2.安卓平台需要需要开启蓝牙权限,否则程序运行闪退。

搜索蓝牙时需要有ACCESS_COARSE_LOCATION权限,并且手机定位功能一定要打开。

3.关于如何开启安卓的蓝牙权限。

创建安卓模板文件

qt on android 连接wifi qt蓝牙连接不上_Qt

增加ACCESS_COARSE_LOCATION权限

qt on android 连接wifi qt蓝牙连接不上_android studio_02


在XML视图下查看安卓配置信息

qt on android 连接wifi qt蓝牙连接不上_Android_03

参考链接: Qt for Android 蓝牙调用.
参考链接: Android 12 蓝牙权限(解决闪退问题).

Qt On Android 隐藏状态栏

程序界面顶部会被安卓状态栏遮住,以下是实现隐藏状态栏的方法。
在AndroidManifest.xml中,修改 android:theme="@android:style/Theme.NoTitleBar.Fullscreen"属性

<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:name="com.Battery" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:label="DrillingRobot" android:screenOrientation="landscape" android:launchMode="singleTop">


获取Android系统信息

由于qt不能直接访问安卓系统api,需要使用jni方式调用Java文件实现系统信息获取。
要注意的是java文件的路径,AndroidManifest.xml文件中android:name=""属性与java包名的匹配。

//获取安卓系统电量
bool MainWindow::OnReadAndroidBatteryState()
{
#if defined(Q_OS_ANDROID)
    QAndroidJniObject activity = QtAndroid::androidActivity();
    // 获取到Java当前getBatteryStatus方法 Qt里的JNI
    QAndroidJniObject batteryStatus = QAndroidJniObject::callStaticObjectMethod(
                "com/Battery",
                "getBatteryStatus",
                "(Landroid/content/Context;)Ljava/lang/String;",
                activity.object<jobject>());
    if(batteryStatus.isValid()){
         // 获取到Java返回值
         QStringList sList = batteryStatus.toString().split("|");
         int temp =(int)sList[0].toDouble();
         ui->power_progressBar->setValue(temp);
         sList[1].toInt()==2? ui->power_lb->setVisible(true):ui->power_lb->setVisible(false);
         return true;
    }
    qDebug() << "获取安卓设备信息失败";
#endif
    return false;
}
//监测 wlan连接状态的信号槽
 QNetworkConfigurationManager mgr;
 connect(&mgr,SIGNAL(onlineStateChanged(bool)),this,SLOT(isNetWorkOnline(bool)));


Android系统触控优化

使用QScroller实现触摸屏的滑动效果

QScrollerProperties scrollerProps;
    // 鼠标按下后,目标收到鼠标按下事件的延迟时间,单位s。如果在延迟时间内开始了拖拽,目标不会收到鼠标事件
    scrollerProps.setScrollMetric(QScrollerProperties::MousePressEventDelay, 1);
    // 鼠标按下后开始移动到被判定为拖拽操作的距离,单位m
    scrollerProps.setScrollMetric(QScrollerProperties::DragStartDistance, 0.003);
    // 似乎是影响速度的计算,平滑拖拽到自动滚动的速度
    scrollerProps.setScrollMetric(QScrollerProperties::DragVelocitySmoothingFactor, 1);
    // 未测试
//    scrollerProps.setScrollMetric(QScrollerProperties::AxisLockThreshold, 0.1);
    // 滚动曲线和减速影响因子,具体应该配合曲线。因为可以自定义曲线,所以曲线必须构造出QEasingCurve,
    scrollerProps.setScrollMetric(QScrollerProperties::ScrollingCurve, QEasingCurve(QEasingCurve::OutQuad));
    scrollerProps.setScrollMetric(QScrollerProperties::DecelerationFactor, 0.3);
    // 当鼠标抬起后,触发自动滚动的最小速度、以及能达到的最大速度,单位m/s
    scrollerProps.setScrollMetric(QScrollerProperties::MinimumVelocity, 0.003);
    scrollerProps.setScrollMetric(QScrollerProperties::MaximumVelocity, 1);
    // 当鼠标抬起后,点击操作会停止当前滚动,滚动速度超过该速度时,鼠标点击不会传递给目标,单位m/s
    scrollerProps.setScrollMetric(QScrollerProperties::MaximumClickThroughVelocity, 0.06);
    // 当鼠标抬起后自动滚动,在该时间内的加速滑动手势会加速当前滚动,单位s, 可以设置加速后速度比例,必须大于1
    scrollerProps.setScrollMetric(QScrollerProperties::AcceleratingFlickMaximumTime, 2);
    scrollerProps.setScrollMetric(QScrollerProperties::AcceleratingFlickSpeedupFactor, 1.5);
    scrollerProps.setScrollMetric(QScrollerProperties::OvershootDragResistanceFactor, 0.2); // 过量拖拽时,实际拖拽距离与鼠标移动距离的比例,越小越阻塞,范围0-1
    scrollerProps.setScrollMetric(QScrollerProperties::OvershootDragDistanceFactor, 0.5);   // 过量拖拽时,最大可拖拽距离占窗口的比例,范围0-1
    scrollerProps.setScrollMetric(QScrollerProperties::OvershootScrollDistanceFactor, 0.2);   // 允许的自动滚动时的过量滚动比例,同上
    scrollerProps.setScrollMetric(QScrollerProperties::OvershootScrollTime, 0.3);   // 过量拖拽后释放,恢复到初始状态的时间,单位s
     // 设置允许过量拖拽的策略,滚动条出现时开启、始终关闭、始终开启
    scrollerProps.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff);
    scrollerProps.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOn);
    scrollerProps.setScrollMetric(QScrollerProperties::FrameRate, QScrollerProperties::Fps60);

    pScroller=QScroller::scroller(ui->log_textBrowser);
    pScroller->grabGesture(ui->log_textBrowser,QScroller::LeftMouseButtonGesture);
    pScroller->setScrollerProperties(scrollerProps);

Android系统WIFI显示已保存但不会自动重连

调试时发现,小米平板连接无公网的路由器时,断开后不会自动连接,原因是安卓系统面对无网络连接的wifi不会启动自动重连机制。
查看发现不能自动重连的WIFI会有NETWORK_SELECTION_PERMANENTLY_DISABLED此项配置,正常的为NETWORK_SELECTION_ENABLED
目前查询到两种解决方法

  1. root安卓系统,直接修改系统文件。
    修改默认值 开启:自动连接
    frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConnectivityManager.java
private boolean mAutoJoinEnabled = true;