An Android Library for handling Bluetooth Low Energy on Android Easy

Overview

Android BLE Made Easy

An easy to use, kotlin friendly BLE library for Android.

API

Installing

  • Step 1. Add the JitPack repository to your project gradle file
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
  • Step 2. Add the implementation dependency to your app gradle file
dependencies {
    ...

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

    ...
}
  • Step 3. Gradle sync and you're ready to go!

Core features

Lifecycle

The library accepts being used both in an Activity and a Fragment!

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

Automatic handle permissions

The library requests the permissions for you.

Asynchronous:

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
        }
    }
)

Coroutines:

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
    }
}

Automatic turn on the Bluetooth adapter

The library requests the Bluetooth hardware to be activated whenever it is off.

Asynchronous:

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
    }
}

Coroutines:

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
    }
}

Automatic turn on Location services

The library requests Location services to be activated whenever it is off.

Asynchronous:

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
    }
}

Coroutines:

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
    }
}

Asynchronous and Coroutines

You can both use the library with callbacks and with coroutines suspended functions The callback functions having the 'async' suffix. And requiring a HOF callback as a parameter .

Handling the bluetooth connections with graceful connection shutdown, in another words, waits for current running operations (Read and Write) to be finished before closing the connection

JetPack Contracts Ready!

The library uses the new JetPack contracts API to automatically handle permissions and adapter activation for you.

Compatible with older API levels

Theoretically compatible all the way down to API 18, but made targeting API 21+.

Well documented!

All the functions and variables you're gonna be using are very well documented with KotlinDOC. So you can get autocompletion information on Android Studio. But if you want to take a look without installing it... You can take a look on the dokka generated documentation

.github/workflows/wiki.yml

Both low level bytes and String conversion

The library gives you the option to receive and send raw Bytes if you want. But also you can let it encode and decode your strings automatically.

Automatically handles the pain of Known issues

Take for instance Issue 183108 where Lollipop devices will not work properly without a workaround to handle the connection.

Or the well-known BLE 133 error! The nightmare of everyone that already worked with BLE on Android, this library has a compilation of techniques being used to get around it

Usage

After instantiating the BLE class...

Fast scan for a specific device

If you already know the device you wanna connect to, you could use this:

Asynchronous:

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. ">
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.

Coroutines:

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
    }
}

Scanning BLE devices

Asynchronous:

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
    }
)

Coroutines:

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
    }
}

Or you could use the scan method without any timeout, only stopping it manually

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()

Manually connecting to a discovered device

After a successful scan, you'll have your Bluetooth device, now it is time to connect with it!

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()
}

Made With <3 by Leandro Quevedo

Comments
  • Getting started

    Getting started

    Hello,

    This isn't really an issue as much as it is a request in getting help with using BLE made easy. I'm some what new to app development and new to Kotlin.

    Background I'm currently working on a project where I want to control LED lights via ble. My first step is to do a simple toggle the lights on and off. I'm using HM-10 BLE module to receive signals and an arduino uno to control the signals to the lights. I've used the dabble app to test my HM-10 and arduino uno code and have successfully seen that the lights turn on. Now I would like to build my own app to control the lights from my phone.

    What I'm Seeing I've imported ble-made-easy into android studio and made sure there are no errors. When I test the app (via wireless debugging) on my device I only see main activity (screen title says "AndroidEasyBLE"). No list view or text views or buttons.

    Do I need to do anything in the main activity to inflate the fragments and bind correctly? Is there an example I can run out of the box, where I can scan, and connect to a BLE device?

    Thank you very much! Swarandeep Singh

    enhancement help wanted good first issue 
    opened by Swarandeep1 15
  • Not able to scan And print

    Not able to scan And print

    @LeandroSQ after integration of your library i am not able to scan and get BLE devices. I checked increase time out as well

    i am creating demo for print 58mm BLE printer i find name and mac address from other app but i dont what i need to pass as "characteristic" for write to printer?

    i create receipt format but dont know hot to send this to BLE printer and after compete print disconnect with printer

    can you please help me for that

    Thanks.

    help wanted 
    opened by iAmAndroidDeveloper 10
  • Failed to read characteristic

    Failed to read characteristic

    Hi there,

    I'm pretty new with kotlin and bluetooth and I'm trying your nice library, scan device works perfectly, but when I want to connect to a device and read a characteristic I get a null return and this is what I get in log : (failed to read characteristic)

    image

    Here is my code :

     * Connect BLE device
     */
    @SuppressLint("MissingPermission")
    public fun connectBLE(ble:BLE, device: BLEDevice) {
        var name: String = device.name.toString()
        lifecycleScope.launch {
                ble.connect(device)?.let { connection ->
                    // For watching bytes
                    val value = connection.read("00002A29-0000-1000-8000-00805F9B34FB")
                    Log.i("BLEDATA", "$value")
    
            }
    }
    

    I read that for reading 16 bits uuid with bluetooth low energy we have make uuid this form : 0000XXXX-0000-1000-8000–00805f9b34fb But maybe I'm wrong ?

    I got the uuid 0x180A with nrf Connect App and this is marked Read and correspond to the manufacturer brand name string. I bet I'm doing something wrong but dont know what...

    Thanks a lot !

    bug enhancement good first issue 
    opened by Octavelscx 9
  • react to events emitted from the ble device

    react to events emitted from the ble device

    Hi!

    i just stumblep upon your ble lib. Seems very well done ,congratz! When i looked through the code i asked myself if the lib can already react to events that are emmitted from the ble device?

    enhancement 
    opened by Ditscheridou 6
  • [Bug] Default scan settings are not satisfying legacy devices (< SDK 29)

    [Bug] Default scan settings are not satisfying legacy devices (< SDK 29)

    Hello, thank you for creating this awesome library!

    I am currently running into some issues on older devices. I tried running the sample project with 3 different Android versions: Android 6, Android 9 and Android 10. So far only the sample app installed on the Android 10 device managed to output scan results. I have also tested the Android 6 and Android 9 devices with other BLE apps to confirm that the BLE is not faulty. Has the library been tested with pre-Android10 devices before?

    bug 
    opened by NoelChew 5
  • No device scanned

    No device scanned

    2021-06-04 10:50:14.666 12002-12002/quevedo.soares.leandro.androideasyble D/MainActivity: Setting bluetooth manager up... 2021-06-04 10:50:14.684 12002-12050/quevedo.soares.leandro.androideasyble D/BluetoothMadeEasy: Checking App bluetooth permissions... 2021-06-04 10:50:14.684 12002-12002/quevedo.soares.leandro.androideasyble I/HwPartMagicWindowFactory: add android.common.HwPartMagicWindowFactoryImpl to memory. 2021-06-04 10:50:14.684 12002-12050/quevedo.soares.leandro.androideasyble D/BluetoothMadeEasy: All permissions granted! 2021-06-04 10:50:14.684 12002-12050/quevedo.soares.leandro.androideasyble D/BluetoothMadeEasy: Checking bluetooth adapter state... 2021-06-04 10:50:14.685 12002-12050/quevedo.soares.leandro.androideasyble D/BluetoothMadeEasy: Checking location services state... 2021-06-04 10:50:14.691 12002-12002/quevedo.soares.leandro.androideasyble I/HwPartPowerOfficeFactory: add HwPartPowerOfficeFactoryImpl to memory. 2021-06-04 10:50:14.697 12002-12002/quevedo.soares.leandro.androideasyble D/InputEventReceiver: dispatchInputInterval 1000000 2021-06-04 10:50:14.714 12002-12053/quevedo.soares.leandro.androideasyble D/HiTouch_PressGestureDetector: onAttached, package=quevedo.soares.leandro.androideasyble, windowType=1, mHiTouchRestricted=false 2021-06-04 10:50:14.721 12002-12047/quevedo.soares.leandro.androideasyble I/FrameFlow: FrameFlowInit app is not supported by frameflow solution 2021-06-04 10:50:14.721 12002-12047/quevedo.soares.leandro.androideasyble I/iGraphics: [0020080c] pn: quevedo.soares.leandro.androideasyble, p: 12002 2021-06-04 10:50:14.721 12002-12047/quevedo.soares.leandro.androideasyble I/iGraphics: [0030080c] no spt app: quevedo.soares.leandro.androideasyble 2021-06-04 10:50:14.729 12002-12047/quevedo.soares.leandro.androideasyble D/mali_winsys: EGLint new_window_surface(egl_winsys_display *, void *, EGLSurface, EGLConfig, egl_winsys_surface **, EGLBoolean) returns 0x3000 2021-06-04 10:50:14.732 12002-12047/quevedo.soares.leandro.androideasyble W/Gralloc3: mapper 3.x is not supported 2021-06-04 10:50:14.742 12002-12002/quevedo.soares.leandro.androideasyble I/HwViewRootImpl: removeInvalidNode jank list is null 2021-06-04 10:50:14.745 12002-12002/quevedo.soares.leandro.androideasyble I/RmeSchedManager: init Rme, version is: v1.0 2021-06-04 10:50:14.745 12002-12047/quevedo.soares.leandro.androideasyble D/OpenGLRenderer: disableOutlineDraw is true 2021-06-04 10:50:14.761 12002-12002/quevedo.soares.leandro.androideasyble D/DecorView: showOrHideHighlightView: hasFocus=true; winMode=1; isMrgNull=true 2021-06-04 10:50:14.761 12002-12002/quevedo.soares.leandro.androideasyble W/InputMethodManager: startInputReason = 1 2021-06-04 10:50:14.764 12002-12002/quevedo.soares.leandro.androideasyble W/InputMethodManager: startInputReason = 5 2021-06-04 10:50:14.777 12002-12050/quevedo.soares.leandro.androideasyble D/BluetoothMadeEasy: Starting scan... 2021-06-04 10:50:14.777 12002-12050/quevedo.soares.leandro.androideasyble I/BluetoothAdapter: isLeEnabled(): ON 2021-06-04 10:50:14.779 12002-12046/quevedo.soares.leandro.androideasyble D/BluetoothLeScanner: onScannerRegistered() - status=0 scannerId=9 mScannerId=0 2021-06-04 10:50:14.782 12002-12050/quevedo.soares.leandro.androideasyble D/BluetoothMadeEasy: Scan timeout reached! 2021-06-04 10:50:19.523 12002-12002/quevedo.soares.leandro.androideasyble I/AwareBitmapCacher: init lrucache size: 2097152 pid=12002 2021-06-04 10:50:24.786 12002-12050/quevedo.soares.leandro.androideasyble D/BluetoothMadeEasy: Stopping scan... 2021-06-04 10:50:24.787 12002-12050/quevedo.soares.leandro.androideasyble I/BluetoothAdapter: isLeEnabled(): ON 2021-06-04 10:50:24.790 12002-12050/quevedo.soares.leandro.androideasyble D/BluetoothMadeEasy: Scan finished! 0 devices found!

    My Phone

    MODEL: HUAWEI YAL-AL00 SYSTEM: Android 10 API 29

    help wanted 
    opened by D10NGYANG 5
  • Read always return null while observe works as intended

    Read always return null while observe works as intended

    Hi, I'm trying to use this to make a simple app to get heartbeat and step values from a mi band 6,

    However when i use ble.scanforasync to find and connect to the device, i find that i could only get data from notifiable characteristics like heart rate whenever they changed value , but when i try to use connection.read() on characteristics that is readable like device name , i always gets a null, is there something i missed or something else i should do?

    question 
    opened by JouleGit 4
  • Duplicate Location Service Enabling Prompt on Android 12 Device

    Duplicate Location Service Enabling Prompt on Android 12 Device

    Prompt to enable location service is shown twice on Android 12 devices. Clicking "OK" twice will cause app to crash.

    Steps to reproduce crash:

    1. Disable device Location Service
    2. Disable Bluetooth
    3. Kill app
    4. Start app
    5. Enable Bluetooth
    6. Click "OK" to enable Location Service
    7. Click "OK" to enable Location Service (again)

    Logcat: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=598333496, result=-1, data=Intent { (has extras) }} to activity {quevedo.soares.leandro.blemadeeasy/quevedo.soares.leandro.blemadeeasy.view.MainActivity}: java.lang.IllegalStateException: Already resumed, but proposed with update true

    bug 
    opened by NoelChew 3
  • 1.5.2 build error

    1.5.2 build error

    I am unable to use the 1.5.2 update since the build has an error.

    https://jitpack.io/com/github/LeandroSQ/android-ble-made-easy/v1.5.2/build.log

    if someone encounters the error Failed to resolve: com.github.LeandroSQ:android-ble-made-easy:v1.5.2 Just use the 1.5.1 update using

    dependencies {
        // ...
        implementation 'com.github.LeandroSQ:android-ble-made-easy:v1.5.1'
    }
    
    bug good first issue 
    opened by Stallos11 2
  • Using this library with Bottom Navigation

    Using this library with Bottom Navigation

    Hello,

    I've currently worked through you example and have been able to incorporate the scan and connect functionality into my app. I am currently using a bottom Navigation app structure, where one of my bottom menu items takes the user to a fragment that allows them to set up the connection and separate bottom menu items are different fragments where data can be sent. I've tried to setup the connection variable of type BluetoothConnection in my shared viewModel. However, whenever I navigate to a new fragment to send data, the connection variable pulled from the shared view model is null.

    Is there an easy way to set this up using a shared view model?

    Thanks! Swarandeep Singh

    help wanted 
    opened by Swarandeep1 2
  • Unable to create main BLE instance

    Unable to create main BLE instance

    I'm unable to create the main ble instance by using the code in the readme: val ble = BLE(activity = this) Android Studio cannot find the class and prompts me to create one instead of importing your library

    I have the library imported in my app build.gradle: implementation 'com.github.LeandroSQ:android-ble-made-easy:v1.4.0'

    and jitpack included in the maven repositories options: maven { url 'https://jitpack.io' }

    Your library looks super simple and easy to integrate, so I'm hoping I don't have to switch away simply because I can't get it to install

    help wanted 
    opened by trylaarsdam 2
  • Remove ACCESS_BACKGROUND_LOCATION for Android 11

    Remove ACCESS_BACKGROUND_LOCATION for Android 11

    • location permission prompt will only appear for Android 11 after removing ACCESS_BACKGROUND_LOCATION
    • additional notes:
      • ACCESS_BACKGROUND_LOCATION should only be included (for Android 10 devices) if the app is scanning for BLE devices in Foreground Service
      • ACCESS_BACKGROUND_LOCATION permission is not required if app scans for BLE devices in Activity
    opened by NoelChew 1
  • Is ACCESS_BACKGROUND_LOCATION permission really needed?

    Is ACCESS_BACKGROUND_LOCATION permission really needed?

    Hi, Would not be better to remove this permission (ACCESS_BACKGROUND_LOCATION) from the manifest file ?

    Without ACCESS_BACKGROUND_LOCATION permission, the scanning works. According to Google doc BACKGROUND PERMISSION if ACCESS_BACKGROUND_LOCATION is not relevant, it can be removed.

    Thanks

    question 
    opened by dononcharles 0
Releases(v1.8.0)
  • v1.8.0(Dec 22, 2022)

    Breaking changes

    • connection.read() is now either suspendable or async with callbacks

    Other

    Library

    • refactor: Better UI for the sample app
    • fix: #13 and #22
    • fix: #18
    • fix: #20
    Source code(tar.gz)
    Source code(zip)
  • v1.7.0(Nov 3, 2022)

  • v1.6.0(Jun 13, 2022)

    Breaking changes

    Renamed packages from "androideasyble" to "blemadeeasy"

    Other

    Library

    • Better default settings for Android 12+
    • Fixed dokka documentation
    • Added 'onUpdate' listener for scan methods
    • Added 'flushPendingScanResults' for flushing previous results
    • Removed 'suspend'from async methods, no need to be using coroutines when calling these, since they already do this automatically

    Sample App

    • Migrated to ViewBinding on the Sample App
    • Fixed bug when trying to update UI in another Thread
    Source code(tar.gz)
    Source code(zip)
  • v1.5.2(Nov 12, 2021)

  • v1.5.1(Nov 9, 2021)

  • v1.5.0(Nov 8, 2021)

    Library

    • Android 11 support
    • Android 12 support
    • Improved scan device discovery
    • fix: Updates not triggering for RSSI changes
    • Replaced GlobalScope with caller Activity/Fragment lifecycleScope
    • Replaced navigation constants with Navigation safe args generated classes

    Example app

    • Code refactoring
    • Migrated to view-binding
    • Migrated to list-adapter
    • Better visuals
    • Dark theme
    • Reactive updates for RSSI measurement
    Source code(tar.gz)
    Source code(zip)
  • v1.3.0(Feb 28, 2021)

Owner
Leandro SQ
I'm passionate about technology
Leandro SQ
An Android library that solves a lot of Android's Bluetooth Low Energy problems

A library that makes working with Bluetooth LE on Android a pleasure. Seriously.

Nordic Semiconductor 1.4k Jan 7, 2023
BLESSED Coroutines, a Bluetooth Low Energy (BLE) library for Android using Kotlin Coroutines

BLESSED for Android with Coroutines - BLE made easy BLESSED is a very compact Bluetooth Low Energy (BLE) library for Android 8 and higher, that makes

Martijn van Welie 82 Jan 1, 2023
Kotlin Asynchronous Bluetooth Low-Energy

Kable Kotlin Asynchronous Bluetooth Low Energy provides a simple Coroutines-powered API for interacting with Bluetooth Low Energy devices. Usage is de

JUUL Labs 493 Dec 25, 2022
Android Bluetooth Helper Library, Bluetooth Device Finder

Bluetooth Helper Allows you to access the Bluetooth of your mobile device, manage turn-on - turn off, and discover bluetooth devices around you. Getti

Tolga Bolatcan 44 Jul 15, 2022
[UNMAINTAINED][Android] Bluetooth Serial Port Profile which comfortable to developer application to communication with microcontroller via bluetooth

⚠ WARNING: This project is no longer being maintained Android-BluetoothSPPLibrary Bluetooth Serial Port Profile which comfortable to developer applica

Akexorcist 1.7k Dec 31, 2022
This library allows for easy access to a Bluetooth LE device's AdRecord and RSSI value. It offers additional functionality for iBeacons.

Bluetooth LE Library for Android This library allows for easy access to a Bluetooth LE device's Advertisement Records. It also offers: A simple runnin

Alexandros Schillings 843 Dec 13, 2022
A reactive, interface-driven central role Bluetooth LE library for Android

RxCentralBle RxCentralBle provides a simple reactive paradigm for connecting to and communicating with Bluetooth LE peripherals from the central role.

Uber Open Source 198 Nov 29, 2022
A Bluetooth kotlin multiplatform "Cross-Platform" library for iOS and Android

Blue-Falcon A Bluetooth "Cross Platform" Kotlin Multiplatform library for iOS, Android, MacOS, Raspberry Pi and Javascript. Bluetooth in general has t

Andrew Reed 220 Dec 28, 2022
Smooth communication via bluetooth with other android devices or microcontrollers such as Arduino.

Android Smooth Bluetooth Smooth communication via bluetooth with other android devices or microcontrollers such as Arduino. Getting Started Add Gradle

Mantas Palaima 191 Nov 28, 2022
RxBle: Use Android Bluetooth API in Rx way

RxBle: Use Android Bluetooth API in Rx way A lightweight encapsulation of Android Bluetooth API. Use Android Bluetooth API in Rx way. Support multiple

null 3 Dec 2, 2022
A non-trivial Bluetooth LE app using Kable and app architecture best practices

kable_mvvm_demo The intention of this project is to demonstrate a non-trivial Bluetooth LE app using Kable and app architecture best practices. ⚠️ The

Chris Laplante 14 Aug 18, 2022
BluePass extracts two factor authentication codes (2FA) from SMS and sends them to a paired device via Bluetooth RFCOMM.

BluePass extracts two factor authentication codes (2FA) from SMS and sends them to a paired device via Bluetooth RFCOMM.

Manuel Huber 15 Dec 4, 2022
Open-source weight and body metrics tracker, with support for Bluetooth scales

Open-source weight and body metrics tracker, with support for Bluetooth scales

OliE 1.3k Jan 4, 2023
Simple bluetooth flutter project

bluetooth_simple Simple bluetooth implementation. Getting Started This project is a starting point for a Flutter application. A few resources to get y

Aleksey Vasiliev 0 Nov 25, 2021
The purpose is to share the Internet capability of one device to the entire Bluetooth LAN.

bluenet The purpose is to share the Internet capability of one device to the entire Bluetooth LAN. To make a prototype of a soft bus, or actually, I w

yunlong.wen 1 Jun 28, 2022
User-friendly Lightweight TPM Remote Attestation over Bluetooth

Ultrablue Ultrablue (User-friendly Lightweight TPM Remote Attestation over Bluetooth) is a solution to allow individual users to perform boot state at

ANSSI 32 Jan 2, 2023
A simple, lightweight library intended to take away some of the cruft and tediousness of using the Android BLE.

Blueteeth What Is Blueteeth? Blueteeth is a simple, lightweight library intended to take away some of the cruft and tediousness of using the Android B

Robot Pajamas 103 Nov 26, 2022
Allows Android apps to interact with BLE beacons

Android Beacon Library An Android library providing APIs to interact with beacons. Please visit the project website for how to use this library. IMPOR

AltBeacon 2.7k Dec 28, 2022
🍔 Meals is a small demo app based on modern Android technologies and MVVM architecture

Meals ?? Meals is a small demo app based on modern Android technologies and MVVM architecture. built-in Kotlin, Coroutine, Flow, Retrofit, and Jetpack

Amr Jyniat 4 Nov 6, 2022