force TRANSPORT_LE for connectGatt on Android 5 (#111)

This commit is contained in:
Eugene Kuleshov
2024-12-04 22:11:48 -05:00
committed by GitHub
parent e24d1bc302
commit 9b992b4800

View File

@ -26,6 +26,7 @@ import androidx.core.app.ActivityCompat
import androidx.core.app.ActivityOptionsCompat import androidx.core.app.ActivityOptionsCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import io.flutter.plugin.common.BinaryMessenger import io.flutter.plugin.common.BinaryMessenger
import java.lang.reflect.Method
import java.util.concurrent.Executor import java.util.concurrent.Executor
class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : MyBluetoothLowEnergyManager(context), MyCentralManagerHostAPI { class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : MyBluetoothLowEnergyManager(context), MyCentralManagerHostAPI {
@ -174,8 +175,24 @@ class MyCentralManager(context: Context, binaryMessenger: BinaryMessenger) : MyB
val transport = BluetoothDevice.TRANSPORT_LE val transport = BluetoothDevice.TRANSPORT_LE
device.connectGatt(context, autoConnect, mBluetoothGattCallback, transport) device.connectGatt(context, autoConnect, mBluetoothGattCallback, transport)
} else { } else {
try {
// From Android LOLLIPOP (21) the transport types exists, but it is private
// have to use reflection to call it for TRANSPORT_LE
val connectGattMethod: Method = device.javaClass.getDeclaredMethod(
"connectGatt",
Context::class.java,
Boolean::class.javaPrimitiveType,
BluetoothGattCallback::class.java,
Int::class.javaPrimitiveType
)
connectGattMethod.isAccessible = true
connectGattMethod.invoke(
device, context, autoConnect, mBluetoothGattCallback, 2 /* TRANSPORT_LE */) as BluetoothGatt
} catch (ex: Exception) {
// fall back to default method if reflection fails
device.connectGatt(context, autoConnect, mBluetoothGattCallback) device.connectGatt(context, autoConnect, mBluetoothGattCallback)
} }
}
mConnectCallbacks[addressArgs] = callback mConnectCallbacks[addressArgs] = callback
} catch (e: Throwable) { } catch (e: Throwable) {
callback(Result.failure(e)) callback(Result.failure(e))