{"id":20556545,"url":"https://github.com/xyoraclenetwork/sdk-ble-android","last_synced_at":"2025-07-18T00:08:20.185Z","repository":{"id":103604900,"uuid":"144223864","full_name":"XYOracleNetwork/sdk-ble-android","owner":"XYOracleNetwork","description":"A robust Bluetooth solution for Android","archived":false,"fork":false,"pushed_at":"2021-12-03T23:11:16.000Z","size":1861,"stargazers_count":25,"open_issues_count":6,"forks_count":7,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-06-13T09:45:39.669Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://xyo.network","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/XYOracleNetwork.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-08-10T01:58:31.000Z","updated_at":"2024-12-26T22:18:53.000Z","dependencies_parsed_at":"2023-03-13T15:07:06.309Z","dependency_job_id":null,"html_url":"https://github.com/XYOracleNetwork/sdk-ble-android","commit_stats":null,"previous_names":[],"tags_count":45,"template":false,"template_full_name":null,"purl":"pkg:github/XYOracleNetwork/sdk-ble-android","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XYOracleNetwork%2Fsdk-ble-android","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XYOracleNetwork%2Fsdk-ble-android/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XYOracleNetwork%2Fsdk-ble-android/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XYOracleNetwork%2Fsdk-ble-android/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/XYOracleNetwork","download_url":"https://codeload.github.com/XYOracleNetwork/sdk-ble-android/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XYOracleNetwork%2Fsdk-ble-android/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265683381,"owners_count":23810840,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-16T03:29:05.777Z","updated_at":"2025-07-18T00:08:20.157Z","avatar_url":"https://github.com/XYOracleNetwork.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![logo]](https://xyo.network)\n\n# XYO Bluetooth SDK\n\n![](https://github.com/XYOracleNetwork/sdk-xyo-android/workflows/Build/badge.svg?branch=develop)  ![](https://github.com/XYOracleNetwork/sdk-xyo-android/workflows/Release/badge.svg?branch=master) [![Download](https://api.bintray.com/packages/xyoraclenetwork/xyo/sdk-ble-android/images/download.svg)](https://bintray.com/xyoraclenetwork/xyo/sdk-ble-android/_latestVersion)\n[![Maintainability](https://api.codeclimate.com/v1/badges/73ee685fc9e2c61454b2/maintainability)](https://codeclimate.com/github/XYOracleNetwork/sdk-ble-android/maintainability)\n\n[![BCH compliance](https://bettercodehub.com/edge/badge/XYOracleNetwork/sdk-ble-android?branch=master)](https://bettercodehub.com/results/XYOracleNetwork/sdk-ble-android)\n[![Sonarcloud Status](https://sonarcloud.io/api/project_badges/measure?project=XYOracleNetwork_sdk-ble-android\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=XYOracleNetwork_sdk-ble-android)\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/b14446847e614a2fae7152892765dac1)](https://www.codacy.com/app/arietrouw/sdk-ble-android?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=XYOracleNetwork/sdk-ble-android\u0026utm_campaign=Badge_Grade) [![Known Vulnerabilities](https://snyk.io/test/github/XYOracleNetwork/sdk-ble-android/badge.svg?targetFile=build.gradle)](https://snyk.io/test/github/XYOracleNetwork/sdk-ble-android?targetFile=build.gradle)\n\n\u003e The XYO Foundation provides this source code available in our efforts to advance the understanding of the XYO Protocol and its possible uses. We continue to maintain this software in the interest of developer education. Usage of this source code is not intended for production.\n\n## Table of Contents\n\n-   [Title](#xyo-bluetooth-sdk)\n-   [Description](#description)\n-   [Prerequisites](#prerequisites)\n-   [Install](#install)\n-   [Usage](#usage)\n-   [License](#license)\n-   [Credits](#credits)\n\n## Description\n\nA robust Bluetooth solution for Android. This BLE SDK was written from ground-up, in Kotlin,\n to help developers with the agonizing issues with Android the BLE stack.\nNot only will this SDK make XYO apps better, but bring XYO functionality to existing apps.  In addition to generalized BLE support, the SDK also has support for XY specific hardware.\n\n## Prerequisites\n\n-   JDK 1.8\n-   Android SDK\n\n    -   Kotlin\n    -   Build Tools 27+\n\n## Install\n\nYou can add sdk-ble-android to your existing app by cloning the project and manually adding it\nto your build.gradle:\n\n```gradle\nallprojects {\n    repositories {\n        maven { url \"https://dl.bintray.com/xyoraclenetwork/xyo\" }\n    }\n}\n```\n\n```gradle\ndependencies {\n    implementation 'com.github.XYOracleNetwork:sdk-ble-android:3.0.1165'\n}\n```\n\n## Usage\n\n\u003e As of version 3.0.1165, listeners have been renamed to streamline class names. Updates to examples below.\n\nA full Working example is included in the project. Look at the ble-android-sample folder for more information.\n\nConfigure and create an instance of the scanner:\n\n```kotlin\n// enable the device types you want to listen for\n// you can create your own custom listener\n// for any type of BLE device by creating a Class that extends XYBluetoothDevice\nXYAppleBluetoothDevice.enable(true)     //Apple devices\nXYIBeaconBluetoothDevice.enable(true)   //iBeacon device\nXYFinderBluetoothDevice.enable(true)    //XY device\nXY4BluetoothDevice.enable(true)         //XY4+ Find It device\nXY3BluetoothDevice.enable(true)         //XY3 Find It device\nXY2BluetoothDevice.enable(true)         //XY2 Find It device\nXYGpsBluetoothDevice.enable(true)       //XY GPS device\nmyCustomDevice.enable(true)\n\nval scanner: XYFilteredSmartScan = XYFilteredSmartScanModern(MyApplication.getAppContext())\n```\n\nAdd a listener for the XYFilteredSmartScan:\n\n```kotlin\n\n\n\n  scanner.addListener(\n    \"myTAG\",\n    object : XYFilteredSmartScanListener() {\n\n        override fun entered(device: XYBluetoothDevice) {\n            super.entered(device)\n            checkMyDeviceTypeAddListener(device)\n        }\n    \n        override fun exited(device: XYBluetoothDevice) {\n            super.exited(device)\n            doSomethingOnExit()\n        }\n    \n        override fun detected(device: XYBluetoothDevice) {\n            super.detected(device)\n            doSomethingOnDetected()\n        }\n    \n        override fun connectionStateChanged(device: XYBluetoothDevice, newState: Int) {\n            super.connectionStateChanged(device, newState)\n            doSomethingOnChanged()\n        }\n\n},)\n\n```\n\nStart scanning for BLE devices:\n\n```kotlin\nscanner.start()\n```\n\nOnce we know the device type, add a specific device type listener\n\n```kotlin\n\nprivate fun checkMyDeviceTypeAddListener(device: XYBluetoothDevice) {\n\n    (device as? XY4BluetoothDevice)?.addListener(\"myTAG\", object : XY4BluetoothDeviceListener() {\n        override fun buttonSinglePressed(device: XYFinderBluetoothDevice) {\n            super.buttonSinglePressed(device)\n            doSomethingOnSinglePressed()\n        }\n\n        override fun buttonDoublePressed(device: XYFinderBluetoothDevice) {\n            super.buttonDoublePressed(device)\n            doSomethingOnDoublePressed()\n        }\n\n        override fun buttonLongPressed(device: XYFinderBluetoothDevice) {\n            super.buttonLongPressed(device)\n            doSomethingOnLongPressed()\n        }\n\n        override fun entered(device: XYBluetoothDevice) {\n            super.entered(device)\n            doSomethingOnEntered()\n        }\n\n        override fun exited(device: XYBluetoothDevice) {\n            super.exited(device)\n            doSomethingOnExited()\n        }\n\n        override fun detected(device: XYBluetoothDevice) {\n            super.detected(device)\n            doSomethingOnDetected()\n        }\n\n        override fun connectionStateChanged(device: XYBluetoothDevice, newState: Int) {\n            super.connectionStateChanged(device, newState)\n            doSomethingOnConnectionStateChanged()\n        }\n    })\n\n    (device as? XY3BluetoothDevice)?.addListener(\"myTAG\", object : XY3BluetoothDeviceListener(){\n        //add your logic here\n    })\n\n    (device as? XY2BluetoothDevice)?.addListener(\"myTAG\", object : XY2BluetoothDeviceListener(){\n    //add your logic here\n    })\n\n    (device as? XYIBeaconBluetoothDevice)?.addListener(\"myTAG\", object : XYIBeaconBluetoothDeviceListener(){\n    //add your logic here\n    })\n\n}\n```\n\nConnecting to a BLE device:\n\n```kotlin\nfun connectXY4Device(device: XY4BluetoothDevice) {\n    device.connection {\n        // within this connection, you can do multiple tasks\n        // the connection will stay open until all tasks are completed\n        // the connection will auto-disconnect after 5 seconds of inactivity.\n\n        var batteryLevel = device.batteryService.level.get().await()\n        var firmwareVersion = device.deviceInformationService.firmwareRevisionString.get().await()\n        var deviceName = device.genericAccessService.deviceName.get().await()\n    }\n}\n```\n\nBasic callback server use\n\n```kotlin\nval myAwesomeReadCharacteristic = XYBluetoothReadCharacteristic(UUID.fromString(\"01ef8f90-e99f-48ae-87bb-f683b93c692f\"))\nval myAwesomeWriteCharacteristic = XYBluetoothWriteCharacteristic(UUID.fromString(\"01ef8f90-e99f-48ae-87bb-f683b93c692f\"))\n\n/**\n * Will send \"Carter is cool\" on every read\n */\nmyAwesomeReadCharacteristic.addResponder(\"myResponder\", object : XYBluetoothReadCharacteristic.XYBluetoothReadCharacteristicResponder {\n    override fun onReadRequest(device: BluetoothDevice?): ByteArray? {\n        return \"Carter is cool\".toByteArray()\n    }\n},)\n\nmyAwesomeWriteCharacteristic.addResponder(\"myResponder\", object : XYBluetoothWriteCharacteristic.XYBluetoothWriteCharacteristicResponder {\n    override fun onWriteRequest(value: ByteArray, device: BluetoothDevice?): Boolean? {\n        if (value.size == 10) {\n            return true\n        }\n        return false\n    }\n},)\n\nval myAwesomeService = XYBluetoothService(UUID.fromString(\"3079ca44-ae64-4797-b4e5-a31e3304c481\"), BluetoothGattService.SERVICE_TYPE_PRIMARY)\nmyAwesomeService.addCharacteristic(myAwesomeReadCharacteristic)\nmyAwesomeService.addCharacteristic(myAwesomeWriteCharacteristic)\n\nval server = XYBluetoothGattServer(applicationContext)\nserver.addService(myAwesomeService).await()\nserver.startServer()\n```\n\nBasic await server use\n\n```kotlin\nval myAwesomeService = XYBluetoothService(UUID.fromString(\"3079ca44-ae64-4797-b4e5-a31e3304c481\"), BluetoothGattService.SERVICE_TYPE_PRIMARY)\nmyAwesomeService.addCharacteristic(myAwesomeReadCharacteristic)\nmyAwesomeService.addCharacteristic(myAwesomeWriteCharacteristic)\n\nval server = XYBluetoothGattServer(applicationContext)\nserver.addService(myAwesomeService).await()\nserver.startServer()\n```\n\n```kotlin\n//make sure you stop the scanner when no longer needed\nscanner.stop()\n\n//remove all device listeners when shutting down an activity:\n override fun onStop() {\n    super.onStop()\n    device!!.removeListener(TAG)\n}\n```\n\n## License\n\nSee the [LICENSE.md](LICENSE) file for license details.\n\n## Credits\n\nMade with 🔥and ❄️ by [XYO](https://www.xyo.network)\n\n[logo]: https://cdn.xy.company/img/brand/XYO_full_colored.png\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxyoraclenetwork%2Fsdk-ble-android","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxyoraclenetwork%2Fsdk-ble-android","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxyoraclenetwork%2Fsdk-ble-android/lists"}