Qt on android开发手册
- android开发环境搭建
- android蓝牙调试环境搭建
- Qt On Android 隐藏状态栏
- 获取Android系统信息
- Android系统触控优化
- Android系统WIFI显示已保存但不会自动重连
- 其他参考文档
android蓝牙调试环境搭建
1.在windows平台调试蓝牙功能,MinGW 不支持蓝牙调试功能,需要将项目的Build转为MSVC。
2.安卓平台需要需要开启蓝牙权限,否则程序运行闪退。
搜索蓝牙时需要有ACCESS_COARSE_LOCATION权限,并且手机定位功能一定要打开。
3.关于如何开启安卓的蓝牙权限。
创建安卓模板文件
增加ACCESS_COARSE_LOCATION权限
在XML视图下查看安卓配置信息
参考链接: 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
目前查询到两种解决方法
- root安卓系统,直接修改系统文件。
修改默认值 开启:自动连接
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConnectivityManager.java
private boolean mAutoJoinEnabled = true;