El Arsenal de Android – Bluetooth

Una biblioteca BLE para Android fácil de usar y compatible con Kotlin.

Instalación

  • Paso 1. Agregue el repositorio de JitPack a su archivo proyecto archivo gradle
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
  • Paso 2. Agregue la dependencia de implementación a su archivo archivo gradle de la aplicación
dependencies {
    ...

    implementation 'com.github.LeandroSQ:android-ble-made-easy:1.3.0'

    ...
}
  • Paso 3. ¡Sincronización de Gradle y listo!

Principales características

Ciclo vital

¡La biblioteca acepta ser utilizada tanto en una actividad como en un fragmento!

val ble = BLE(activity = this)
// or
val ble = BLE(fragment = this)

Permisos automáticos de manejo

La biblioteca requiere permisos para ti.

Asincrónico:

ble.verifyPermissionsAsync(
    rationaleRequestCallback = { next ->
        // Include your code to show an Alert or UI explaining why the permissions are required
        // Calling the function bellow if the user agrees to give the permissions
        next()
    },
    callback = { granted ->
        if (granted) {
            // Continue your code....
        } else {
            // Include your code to show an Alert or UI indicating that the permissions are required
        }
    }
)

Corutina:

GlobalScope.launch {
    val granted = ble.verifyPermissions(
        rationaleRequestCallback = { next ->
            // Include your code to show an Alert or UI explaining why the permissions are required
            // Calling the function bellow if the user agrees to give the permissions
            next()
        }
    )

    if (granted) {
        // Continue your code....
    } else {
        // Include your code to show an Alert or UI indicating that the permissions are required
    }
}

Activación automática del adaptador Bluetooth

La biblioteca requiere que el hardware Bluetooth se active cada vez que se apaga.

Asincrónico:

ble.verifyBluetoothAdapterStateAsync { active ->
    if (active) {
        // Continue your code...
    } else {
        // Include your code to show an Alert or UI indicating that the Bluetooth adapter is required to be on in order to your project work
    }
}

Corutina:

GlobalScope.launch {
    if (ble.verifyBluetoothAdapterState()) {
        // Continue your code...
    } else {
        // Include your code to show an Alert or UI indicating that the Bluetooth adapter is required to be on in order to your project work
    }
}

Activación automática de servicios de ubicación

La biblioteca requiere la activación de los servicios de ubicación cada vez que se desactiva.

Asincrónico:

ble.verifyLocationStateAsync{ active ->
    if (active) {
        // Continue your code...
    } else {
        // Include your code to show an Alert or UI indicating that Location is required to be on in order to your project work
    }
}

Corutina:

GlobalScope.launch {
    if (ble.verifyLocationState()) {
        // Continue your code...
    } else {
        // Include your code to show an Alert or UI indicating that Location is required to be on in order to your project work
    }
}

Asincrónico y corrutinas

Puede utilizar la biblioteca tanto con devoluciones de llamada como con funciones de rutina suspendidas. Las funciones de devolución de llamada tienen el sufijo “async”. Y requiere una devolución de llamada HOF como parámetro.

Administre las conexiones Bluetooth con un cierre elegante de la conexión, en otras palabras, espere a que se completen las operaciones en curso (lectura y escritura) antes de cerrar la conexión

¡Contratos JetPack listos!

La biblioteca utiliza la nueva API de contratos JetPack para administrar automáticamente los permisos y la activación del adaptador.

Compatible con niveles de API anteriores

Teóricamente compatible hasta API 18, pero diseñado para API 21+.

¡Bien documentada!

Todas las funciones y variables que utilizará están muy bien documentadas con KotlinDOC. De esta manera, puede obtener información de autocompletar en Android Studio. Pero si quieres echar un vistazo sin instalarlo … puedes echar un vistazo a la documentación generada por dokka

Conversión de cadenas y bytes de bajo nivel

La biblioteca le brinda la capacidad de recibir y enviar bytes sin procesar si lo desea. Pero también puede dejar que codifique y decodifique sus cadenas automáticamente.

Gestiona automáticamente el dolor de los problemas conocidos

Tomemos por ejemplo Número 183108 donde los dispositivos Lollipop no funcionarán correctamente sin una solución alternativa para administrar la conexión.

O el conocido BLE 133 ¡Error! La pesadilla de todos los que han trabajado anteriormente con BLE en Android, esta biblioteca tiene una colección de técnicas utilizadas para solucionar el problema.

Uso

Después de instanciar el BLE clase…

Escaneo rápido de un dispositivo específico

Si ya conoce el dispositivo al que desea conectarse, puede usar esto:

Asincrónico:

ble.scanForAsync(
 // You only need to supply one of these, no need for all of them!
       macAddress = "00:00:00:00",
       name = "ESP32",
       service = "00000000-0000-0000-0000-000000000000",
       onFinish = { connection ->
  if (connection != null) {
   // And you can continue with your code
         it.write("00000000-0000-0000-0000-000000000000", "Testing")
  } else {
   // Show an Alert or UI with your preferred error message about the device not being available
  }
 },
       onError = { errorCode ->
   // Show an Alert or UI with your preferred error message about the error
 }
)

// It is important to keep in mind that every single one of the provided arguments of the function shown above, are optionals! Therefore, you can skip the ones that you don't need.

Corutina:

GlobalScope.launch {
    // You can specify filters for your device, being them 'macAddress', 'service' and 'name'
    val connection = ble.scanFor(
        // You only need to supply one of these, no need for all of them!
        macAddress = "00:00:00:00",
        name = "ESP32",
        service = "00000000-0000-0000-0000-000000000000"
    )

    // And it will automatically connect to your device, no need to boilerplate
    if (connection != null) {
        // And you can continue with your code
        it.write("00000000-0000-0000-0000-000000000000", "Testing")
    } else {
        // Show an Alert or UI with your preferred error message about the device not being available
    }
}

Buscar dispositivos BLE

Asincrónico:

ble.scanAsync(
    duration = 10000,
    onDiscover = { device ->
        // Update your UI with the newest found device, in real time
    },
    onFinish = { devices ->
        // Continue with your code handling all the devices found
    },
    onError = { errorCode ->
        // Show an Alert or UI with your preferred error message
    }
)

Corutina:

GlobalScope.launch {
    try {
        // Continue with your code handling all the devices found
        val devices = ble.scan(duration = 10000)
    } catch (e: Exception) {
        // Show an Alert or UI with your preferred error message
    } catch (e: ScanFailureException) {
        // Show an Alert or UI with your preferred error message
    }
}

O puede usar el método de escaneo sin tiempo de espera, simplemente deteniéndolo manualmente

ble.scanAsync(
    duration = 0, // Disables the timeout
    onDiscover = { device ->
        // Update your UI with the newest found device, in real time
    },
    onFinish = { devices ->
        // Continue with your code handling all the devices found
    },
    onError = { errorCode ->
        // Show an Alert or UI with your preferred error message
    }
)

// Stops your scan manually
ble.stopScan()

Conectarse manualmente a un dispositivo detectado

Después de un escaneo exitoso, tendrá su dispositivo Bluetooth, ¡ahora es el momento de conectarse con él!

ble.connect(device)?.let { connection ->
    // Continue with your code
    val value = connection.read("00000000-0000-0000-0000-000000000000")
    connection.write("00000000-0000-0000-0000-000000000000", "0")
    connection.close()
}

Hecho con <3 por Leandro Quevedo

.

Compruebe también

en vivo desde Droidcon, incluida la mayor actualización de Gemini en Android Studio y más lanzamientos del SDK de Android.

Acabamos de lanzar nuestro episodio de otoño de #TheAndroidShow en YouTube etcétera desarrollador.android.comy esta vez …

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *