@jsulm Thanks for the feedback. I think that at least Qt5.15 is required to supports Android 13 (see https://medium.com/@shmilysyg/set-android-target-sdk-level-33-in-qt-38bb9049924c). I prefer using Qt5.15.2 since I am using .pro files. Also, I suppose that I need higher JDK and NDK versions.
While I do not think that the issue is related to the code (I tested Qt example and did not work), here is my formatted code:
void MainWindow::deviceDiscovered(const QBluetoothDeviceInfo &device)
{
qDebug() << "[BLE] Raw: " << device.name() << device.address().toString();
if(device.coreConfigurations()&QBluetoothDeviceInfo::LowEnergyCoreConfiguration)
{
qDebug() << "Discovered:" << device.name() << device.address().toString();
if(BLE_liste->findItems(device.name()+"\n"+device.address().toString(),Qt::MatchExactly).count()==0)
{
BLE_liste->addItem(device.name()+"\n"+device.address().toString());
*dev_info=device;
QBluetoothDeviceInfo* temp_info=new QBluetoothDeviceInfo;
*temp_info=device;
dev_info_list.append(temp_info);
}
}
}
void MainWindow::searchCharacteristic()
{
if(BLE_service){
foreach (QLowEnergyCharacteristic c, BLE_service->characteristics()) {
if(c.isValid()){
if (c.properties() & QLowEnergyCharacteristic::WriteNoResponse ||
c.properties() & QLowEnergyCharacteristic::Write) {
m_writeCharacteristic = c;
if(c.properties() & QLowEnergyCharacteristic::WriteNoResponse)
m_writeMode = QLowEnergyService::WriteWithoutResponse;
else
m_writeMode = QLowEnergyService::WriteWithResponse;
}
if (c.properties() & QLowEnergyCharacteristic::Read)
m_readCharacteristic = c;
if(c.properties() & QLowEnergyCharacteristic::Notify)
{
m_notificationDesc = c.descriptor(
QBluetoothUuid::ClientCharacteristicConfiguration);
if (m_notificationDesc.isValid())
{
BLE_service->writeDescriptor(m_notificationDesc, QByteArray::fromHex("0100"));
}
}
}
}
}
}
void MainWindow::on_listWidget_itemClicked(QListWidgetItem *item)
{
string = item->text();
string = string.split("\n").at(0); //get the 1st word in string
*dev_info=*(dev_info_list.at(BLE_liste->row(item)));
BLE_controlleur=new QLowEnergyController(*dev_info,this);
connect(BLE_controlleur, SIGNAL(connected()),this,SLOT(device_connected()));
connect(BLE_controlleur, SIGNAL(discoveryFinished()),this,SLOT(service_discovered()));
BLE_controlleur->connectToDevice();
}
void MainWindow::device_connected()
{
BLE_controlleur->discoverServices();
}
void MainWindow::service_discovered()
{
services_discovered=1;
m_servicesUuid = BLE_controlleur->services();
int maxl=m_servicesUuid.length();
for(int i=0;i<maxl;i++)
{
if(m_servicesUuid.at(i).toString()=="{6e400001-b5a3-f393-e0a9-e50e24dcca9e}")
{
BLE_service= BLE_controlleur->createServiceObject(m_servicesUuid.at(i), this);
connect(BLE_service, SIGNAL(stateChanged(QLowEnergyService::ServiceState)),
this, SLOT(onServiceStateChanged(QLowEnergyService::ServiceState)));
connect(BLE_service, SIGNAL(characteristicWritten(QLowEnergyCharacteristic,QByteArray)),
this, SLOT(update_com_state_(QLowEnergyCharacteristic,QByteArray)));
connect(BLE_service, SIGNAL(error(QLowEnergyService::ServiceError)),
this, SLOT(error_slot(QLowEnergyService::ServiceError)));
connect(Comm_timer, SIGNAL(timeout()),this, SLOT(update_com_state()));
if(BLE_service->state() == QLowEnergyService::DiscoveryRequired)
{
BLE_service->discoverDetails();
}
else
searchCharacteristic();
BLE_liste->setStyleSheet("QListWidget{background-color: rgba(0,0,0,0);color:rgb(202,233,250);font-weight:bold;font-family:Myriad Pro Regular;font-size:64px;border:4px solid rgb(249,159,65);border-radius:12px;} QListWidget::item:selected{background:rgb(249,159,65);color:rgb(0,0,0);}");
}
}
}
void MainWindow::onServiceStateChanged(QLowEnergyService::ServiceState s)
{
if (s == QLowEnergyService::ServiceDiscovered)
{
searchCharacteristic();
}
}
void MainWindow::BLE_search_slot()
{
if(agent!=nullptr)
{
delete agent;
}
if(ble_widget->isHidden()==false)
{
if(localDevice.hostMode()==QBluetoothLocalDevice::HostPoweredOff)
{localDevice.powerOn();
QTimer::singleShot(2000, this, SLOT(BLE_search_slot()));
}
BLE_liste->clear();
dev_info_list.clear();
QtAndroid::requestPermissionsSync({
"android.permission.ACCESS_FINE_LOCATION",
"android.permission.BLUETOOTH_SCAN",
"android.permission.BLUETOOTH_CONNECT"
});
agent = new QBluetoothDeviceDiscoveryAgent(); // create an object in ctors
connect(agent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),this, SLOT(deviceDiscovered(QBluetoothDeviceInfo)));
agent->start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod);
}
}