附上参考链接:代码的连接,也是其他网友的,里面的程序很有参考价值,一个程序是通过调取本地的jar等文件实现蓝牙控制,还有一种是加载好jar的库在xml中,也能达到同样的效果:Qt on Android 蓝牙通信开发 + Qt5.10+WIN10_Sky_Lannister的博客-CSDN博客
还有一个参考链接,用的也是本地的一些jar文件,但是文件获取不到,导致程序一操作蓝牙就睡奔溃了,所以这个链接主要看其中的内容讲解QT on Android 编写蓝牙使用HC-05_JameScottX的博客-CSDN博客
本博主要分享一下蓝牙配置的经验,具体代码的实现我也不详细的去述说了,根据以上的连接中代码,很容易的去消化移植程序,但是配置起来就很坑了,一个不到位就会各种闪退崩溃,所以我就主要说明一下蓝牙的配置部分。
其中蓝牙的配置主要在两个文件中,一个是AndroidManifest.xml中,还有一个是工程的pro文件中
在pro文件中添加好QT+=bluetooth即可
在AndroidManifest.xml中:
查找图片中run with local libs部分,其中的android.app.load_local_jars和android.app.static_init_classes是为系统配置功能模块的库文件部分,此图中后面的value值都是INSERT_LOCAL_JARS和INSERT_INIT_CLASSES,意思是调用本地文件中的相关配置文件
打开这个工程可以看到other files中有许多的配置文件,在我配置蓝牙的过程中,完全不理解这些个文件是怎么来的,也不知道是不是固定的,所以就算我把这些东西移植到程序中也没有成功,所以我就放弃了用这种方式。
当然还有第二种方式,其xml配置如下
可以看到图中圈中部分和之前的不一样,这个方式就是在xml中加载好bluetooth所需要的jar文件,不用把配置文件放在本地去调用,之前移植好程序,总是调用蓝牙就各种闪退,搞得我都有些快要崩溃了,后来仔细一对比,发现在xml中大有文章,原来我移植后的程序没有加载这些jar等文件库,所以才导致崩溃,后来把这些加载进去,就完美的可以控制蓝牙各种运行啦。
这种在工程文件中就不需要调用其他的文件,显得程序很干净。好了先介绍这么多,此博客还会继续更新,把我做的app蓝牙部分功能分享到下面。
以下是实现蓝牙连接的所有代码
/****************************蓝牙******************************/
//刷新完毕,重置按键状态
void MainWindow::scanFinshed(){
if(connectsuccessflag==false)
ui->pushButton_7->setEnabled(true);
ui->pushButton_7->setText("刷新蓝牙设备");
}
//刷新搜索到的蓝牙列表
void MainWindow::addBlueToothDevicesToList( const QBluetoothDeviceInfo &info )
{
QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name());
QList<QListWidgetItem *> items = ui->listWidget->findItems(label, Qt::MatchExactly);
if (items.empty()) {
QListWidgetItem *item = new QListWidgetItem(label);
QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(info.address());
if (pairingStatus == QBluetoothLocalDevice::Paired || pairingStatus == QBluetoothLocalDevice::AuthorizedPaired )
item->setTextColor(QColor(Qt::green));
else
item->setTextColor(QColor(Qt::black));
ui->listWidget->addItem(item);
}
}
//连接蓝牙
void MainWindow::itemActivated(QListWidgetItem *item)
{
QString text = item->text();
int index = text.indexOf(' ');
if (index == -1)
return;
if( localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff ) {
QAndroidJniObject javaToast = QAndroidJniObject::fromString("蓝牙未开启,请打开蓝牙!");
QAndroidJniObject::callStaticMethod<void>("com/ZtActivity/ZtActivity",
"makeToast",
"(Ljava/lang/String;)V",
javaToast.object<jstring>());
localDevice->powerOn();
}
else{
QBluetoothAddress address(text.left(index));
QString name(text.mid(index + 1));
//qDebug() << "You has choice the bluetooth address is " << address;
//qDebug() << "The device is connneting.... ";
QAndroidJniObject javaToast = QAndroidJniObject::fromString("正在连接选中设备...");
QAndroidJniObject::callStaticMethod<void>("com/ZtActivity/ZtActivity",
"makeToast",
"(Ljava/lang/String;)V",
javaToast.object<jstring>());
socket->connectToService(address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite);
connectflag=1;
}
}
//蓝牙接收数据处理
void MainWindow::readBluetoothDataEvent()
{
QByteArray allData;
while (!socket->atEnd())
{
allData += socket->readAll().toHex();
comBatAnalyze(allData);//处理串口得到的数据
}
}
//蓝牙连接成功回调
void MainWindow::bluetoothConnectedEvent()
{
ui->listWidget->setVisible(false);
ui->pushButton_7->setEnabled(false);
connectsuccessflag=true;
ui->label->setStyleSheet("image: url(:/PIC/greecircle.png)");
QAndroidJniObject javaToast = QAndroidJniObject::fromString("蓝牙连接成功!");
QAndroidJniObject::callStaticMethod<void>("com/ZtActivity/ZtActivity",
"makeToast",
"(Ljava/lang/String;)V",
javaToast.object<jstring>());
}
//蓝牙断开回调
void MainWindow::bluetoothDisconnectedEvent()
{
connectsuccessflag=false;
ui->label->setStyleSheet("image: url(:/PIC/redcircle.png)");
ui->pushButton_7->setEnabled(true);
QMessageBox::information(this,tr("提示"),tr("蓝牙已断开,请重新连接!"));
}
//刷新蓝牙列表
void MainWindow::on_pushButton_7_clicked()
{
ui->listWidget->setVisible(true);
disconnect(ui->listWidget,SIGNAL(itemActivated(QListWidgetItem*)),this,SLOT(itemActivated(QListWidgetItem*)));
ui->listWidget->clear();
connect(ui->listWidget,SIGNAL(itemActivated(QListWidgetItem*)),this,SLOT(itemActivated(QListWidgetItem*)));
if( localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff ) {
//QMessageBox::information(this,tr("提示"),tr("蓝牙未开启,请打开蓝牙!"));
QAndroidJniObject javaToast = QAndroidJniObject::fromString("蓝牙未开启,请打开蓝牙!");
QAndroidJniObject::callStaticMethod<void>("com/ZtActivity/ZtActivity",
"makeToast",
"(Ljava/lang/String;)V",
javaToast.object<jstring>());
localDevice->powerOn();
}
else{
discoveryAgent->start();
ui->pushButton_7->setEnabled(false);
ui->pushButton_7->setText("正在刷新蓝牙设备...");
}
}
//重连蓝牙设备
void MainWindow::on_pushButton_clicked()
{
socket->disconnectFromService();
ui->listWidget->setVisible(true);
if(connectsuccessflag==true)
ui->pushButton_7->setEnabled(true);
}
/****************************蓝牙end******************************/