diff --git a/QBluetoothLeUart.pri b/QBluetoothLeUart.pri index c190bbf..0fce52c 100644 --- a/QBluetoothLeUart.pri +++ b/QBluetoothLeUart.pri @@ -27,3 +27,7 @@ HEADERS += \ $$PWD/qbluetoothleuartclient.h \ $$PWD/qbluetoothleuartdevice.h \ $$PWD/qbluetoothleuartdevicemodel.h + +android { +QT += androidextras +} diff --git a/qbluetoothleuartclient.cpp b/qbluetoothleuartclient.cpp index c803641..a96e21d 100644 --- a/qbluetoothleuartclient.cpp +++ b/qbluetoothleuartclient.cpp @@ -31,8 +31,26 @@ QBluetoothLeUartClient::~QBluetoothLeUartClient(){ // ------------------------------ bool QBluetoothLeUartClient::startScanningForDevices(){ - if(this->state != Idle && this->state != ScanFinished) + if(this->state != Idle && this->state != AdapterTurnedOff && this->state != ScanFinished && this->state != LocationPermissionDenied) return false; +#ifdef Q_OS_ANDROID + else if(this->state == LocationPermissionDenied) { + // try to get permission + QtAndroid::PermissionResultMap resultMap = QtAndroid::requestPermissionsSync({"android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_COARSE_LOCATION"}, 5000); + bool resultBool = true; + for(QtAndroid::PermissionResult result : resultMap) { + if(result != QtAndroid::PermissionResult::Granted) { + resultBool = false; + break; + } + } + + if(!resultBool) { + emit this->scanningErrorOccured(LocationPermissionDeniedError); + } + + } +#endif this->availableDevicesModel->clear(); @@ -161,10 +179,7 @@ bool QBluetoothLeUartClient::sendData(QString data, bool asynchronous){ const QLowEnergyCharacteristic RxChar = bluetoothService->characteristic(QBluetoothUuid(QUuid(this->txUUID))); - QByteArray Data; - Data.append(data); - - bluetoothService->writeCharacteristic(RxChar, Data, QLowEnergyService::WriteWithoutResponse); + bluetoothService->writeCharacteristic(RxChar, data.toUtf8(), QLowEnergyService::WriteWithoutResponse); return true; } @@ -204,10 +219,33 @@ void QBluetoothLeUartClient::handleScanFinished() void QBluetoothLeUartClient::handleDeviceScanError(QBluetoothDeviceDiscoveryAgent::Error error) { - if (error == QBluetoothDeviceDiscoveryAgent::PoweredOffError) + qWarning() << "Scanning ERROR: " << error; + + this->availableDevices.clear(); + this->availableDevicesModel->clear(); + + if (error == QBluetoothDeviceDiscoveryAgent::PoweredOffError) { + this->setState(AdapterTurnedOff); emit this->scanningErrorOccured(AdapterTurnedOffError); - else if (error == QBluetoothDeviceDiscoveryAgent::InputOutputError) + } + else if (error == QBluetoothDeviceDiscoveryAgent::InputOutputError) { + this->setState(AdapterTurnedOff); emit this->scanningErrorOccured(InputOutputError); + } +#ifdef Q_OS_ANDROID + else if (error == QBluetoothDeviceDiscoveryAgent::UnknownError) { + // check for permission error + QtAndroid::PermissionResult fineLocationAccess = QtAndroid::checkPermission("android.permission.ACCESS_FINE_LOCATION"); + QtAndroid::PermissionResult coarseLocationAccess = QtAndroid::checkPermission("android.permission.ACCESS_COARSE_LOCATION"); + + if(fineLocationAccess != QtAndroid::PermissionResult::Granted || coarseLocationAccess != QtAndroid::PermissionResult::Granted) { + this->setState(LocationPermissionDenied); + emit this->scanningErrorOccured(LocationPermissionDeniedError); + } + else + emit this->scanningErrorOccured(UnknownError); + } +#endif else emit this->scanningErrorOccured(UnknownError); diff --git a/qbluetoothleuartclient.h b/qbluetoothleuartclient.h index 0f7a67b..8914646 100644 --- a/qbluetoothleuartclient.h +++ b/qbluetoothleuartclient.h @@ -6,6 +6,10 @@ #include #include +#ifdef Q_OS_ANDROID +#include +#endif + #ifdef QBluetoothLeUart_QML #include #endif @@ -127,6 +131,8 @@ public: */ enum BluetoothLeUartClientState { Idle = 0, /*!< Waiting for instrucions */ + AdapterTurnedOff, /*!< The bluetooth adapter is turned off */ + LocationPermissionDenied, /*!< The location permssion was denied and we are therfor unable to scan! */ Scanning, /*!< Scanning for devices */ ScanFinished, /*!< Scanning has finished, we are ready to connect */ Connecting, /*!< Trying to connect */ @@ -139,7 +145,8 @@ public: enum BluetoothScanError { UnknownError, AdapterTurnedOffError, - InputOutputError + InputOutputError, + LocationPermissionDeniedError }; Q_ENUM(BluetoothScanError);