How to Get Bluetooth Connected List in Jetpack Compose
How to Get Bluetooth Connected List in Jetpack Compose. Hi Everyone in this Android jetpack compose article we make an example to get the list of connected Bluetooth devices. in this blog below you can find the steps and full source code.
Bluetooth Connected list in android studio.
In this Bluetooth connectivity article, we make a simple jetpack Ui and show a button on UI and a List on a connected Bluetooth device. and showing the list of devices names. As you know the android jetpack library is a custom Ui making with kotlin there is no XML code used to make it. So let’s start to make it.
So Let’s start to make this jetpack example start your android studio and make a simple project with the jetpack compose an activity wait to build it. After successfully building your project follow the below step.
Step 1: Open your Manifests file and add below Permission Bluetooth Connected list
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.BLETOUOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
Step 2: Check Gradle Build dependencies.
dependencies { implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.5.0' implementation "androidx.compose.ui:ui:$compose_version" implementation "androidx.compose.material:material:$compose_version" implementation "androidx.compose.ui:ui-tooling-preview:$compose_version" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0' implementation 'androidx.activity:activity-compose:1.4.0' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version" debugImplementation "androidx.compose.ui:ui-tooling:$compose_version" }
Step 3: Open Your MainActivity Kotlin file and used the below code.
The final step is to write the code of making UI and Bluetooth requests to the connectivity of it. first, check, the permission is allow or not if it does not allow show a popup to allow Bluetooth permission. After that make a Bluetooth adapter to get the list of devices and showing in UI.
MainActivity File Source code Bluetooth Connected list.
package com.codeplayon.bluetoothconnect import android.Manifest import android.annotation.SuppressLint import android.bluetooth.BluetoothAdapter import android.bluetooth.BluetoothAdapter.getDefaultAdapter import android.bluetooth.BluetoothDevice import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.content.pm.PackageManager import android.os.Build import android.os.Build.VERSION.SDK_INT import android.os.Bundle import android.os.Handler import android.os.Looper import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.RequiresApi import androidx.compose.foundation.layout.* import androidx.compose.material.* import androidx.compose.runtime.getValue import androidx.compose.runtime.setValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import com.jetpack.bluetoothconnect.ui.theme.BluetoothConnectTheme class MainActivity : ComponentActivity() { private val PERMISSION_CODE = 1 private val bluetoothAdapter: BluetoothAdapter = getDefaultAdapter() private val activityResultLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == RESULT_OK) { Log.i("Bluetooth", ":request permission result ok") } else { Log.i("Bluetooth", ":request permission result canceled / denied") } } private fun requestBluetoothPermission() { val enableBluetoothIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) activityResultLauncher.launch(enableBluetoothIntent) } @SuppressLint("MissingPermission") var pairedDevices: Set<BluetoothDevice> = bluetoothAdapter.bondedDevices var discoveredDevices: Set<BluetoothDevice> = emptySet() private val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent) { when (intent.action) { BluetoothDevice.ACTION_FOUND -> { val device: BluetoothDevice? = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) if (device != null) { val updated = discoveredDevices.plus(device) discoveredDevices = updated } Log.i("Bluetooth", "onReceive: Device found") } BluetoothAdapter.ACTION_DISCOVERY_STARTED -> { Log.i("Bluetooth", "onReceive: Started Discovery") } BluetoothAdapter.ACTION_DISCOVERY_FINISHED -> { Log.i("Bluetooth", "onReceive: Finished Discovery") } } } } @SuppressLint("MissingPermission") @RequiresApi(Build.VERSION_CODES.M) fun scan(): Set<BluetoothDevice> { if (bluetoothAdapter.isDiscovering) { bluetoothAdapter.cancelDiscovery() bluetoothAdapter.startDiscovery() } else { bluetoothAdapter.startDiscovery() } Handler(Looper.getMainLooper()).postDelayed({ bluetoothAdapter.cancelDiscovery() }, 10000L) return discoveredDevices } @RequiresApi(Build.VERSION_CODES.M) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val foundFilter = IntentFilter(BluetoothDevice.ACTION_FOUND) val startFilter = IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED) val endFilter = IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED) registerReceiver(receiver, foundFilter) registerReceiver(receiver, startFilter) registerReceiver(receiver, endFilter) if (!bluetoothAdapter.isEnabled) { requestBluetoothPermission() } if (SDK_INT >= Build.VERSION_CODES.O) { if (ContextCompat.checkSelfPermission( baseContext, android.Manifest.permission.ACCESS_BACKGROUND_LOCATION ) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), PERMISSION_CODE ) } } setContent { var devices: Set<BluetoothDevice> by remember { mutableStateOf(emptySet()) } BluetoothConnectTheme { Surface(color = MaterialTheme.colors.background) { Scaffold( topBar = { TopAppBar( title = { Text( text = "Jetpack Bluetooth Connected List", modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Left ) } ) } ) { Column( modifier = Modifier .fillMaxSize() .padding(top = 20.dp), horizontalAlignment = Alignment.CenterHorizontally ) { Button( onClick = { devices = scan() } ) { Text( text = "Scan", style = MaterialTheme.typography.subtitle1 ) } Spacer(modifier = Modifier.height(10.dp)) Text( text = "Paired Devices List", style = MaterialTheme.typography.h6 ) Spacer(modifier = Modifier.height(10.dp)) pairedDevices.forEach { device -> Card( modifier = Modifier .fillMaxWidth() .padding(horizontal = 10.dp, vertical = 5.dp), elevation = 10.dp ) { Column( modifier = Modifier .fillMaxWidth() .padding(10.dp), verticalArrangement = Arrangement.spacedBy(10.dp) ) { Text(text = device.name) Text(text = device.address) } } } } } } } } } @SuppressLint("MissingPermission") override fun onDestroy() { super.onDestroy() if (bluetoothAdapter.isDiscovering) bluetoothAdapter.cancelDiscovery() unregisterReceiver(receiver) } }
After completing the code you are ready to test the app let’s run your app and test it Bluetooth Connected list.
.
Read More Tutorial
- Bluetooth 5 and its uses in IoT explained
- Bluetooth Thermal Receipt Printer Android Integration Printer
- Jetpack Compose Tutorial
- Android Tutorial
- Flutter Tutorial