====== Android i Bluetooth ====== {{ android-bluetooth.jpg?400 }} Per aproximar-nos al tema dels dispositius Bluetooth podem seguir 2 estratègies diferents: * Escanejar els dispositius des de la nostra app. El codi és més feixuc. * Llista i triar entre els dispositius que han estat aparellats al sistema operatiu. {{tag> #Dam #DamMp08 #DamMp08Uf2 #DamMp08Uf02 Android mobile kotlin bluetooth BLE BT }} \\ ===== Llistar els dispositius emparellats ===== Obtenir aquesta llista és senzill accedint ''BluetoothAdapter.bondedDevices''. En aquest exemple, a més, filtrem els dispositius que poden ser del tipus BLE (Bluetooth Low Emission), però es pot treure el filtre si cal: fun updatePairedDevices() { // empty list dataset.clear() // update list val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter() for( elem in bluetoothAdapter.bondedDevices.filter { device -> // Filtrar per dispositius BLE device.type == BluetoothDevice.DEVICE_TYPE_LE || device.type == BluetoothDevice.DEVICE_TYPE_DUAL || device.type == BluetoothDevice.DEVICE_TYPE_UNKNOWN } ) { // afegim element al dataset dataset.add( elem ) } } \\ ===== Gestió de permisos ===== La gestió de permisos del Bluetooth és una part més engorrosa. Primer de tot, declarar els permisos estàtics a ''AndroidManifest.xml'': Seguidament, necessitarem al nostre codi demanar els permisos dinàmics. Abans de cridar a la funció ''updatePairedDevices()'' ja vista abans, haurem de fer una funció "wrapper" que abans s'asseguri que els permisos estan ben gestionats. private val REQUEST_CODE_BLUETOOTH = 100 // es pot posar un nombre aleatori no emprat en cap altre lloc private fun requestBluetoothPermissionAndUpdate() { val permission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 12+ requereix BLUETOOTH_CONNECT Manifest.permission.BLUETOOTH_CONNECT } else { // Versions anteriors Manifest.permission.BLUETOOTH } if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { // Demanar el permís ActivityCompat.requestPermissions( this, arrayOf(permission), REQUEST_CODE_BLUETOOTH ) } else { // Permís ja concedit - llegir dispositius updatePairedDevices() } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == REQUEST_CODE_BLUETOOTH) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Permís concedit - llegir dispositius updatePairedDevices() } else { // Permís denegat Toast.makeText(this, "Permís necessari per a llegir Bluetooth", Toast.LENGTH_SHORT).show() } } }