Observar la conectividad del bluetooth de forma permamente usando el componente Livedata de los componentes de arquitectura de Android, detectar si está activado o bien desactivado.
Creando BluetoothStateLiveData
class BluetoothStateLiveData(val context: Context) : LiveData<Boolean>() {
private lateinit var broadCastReceiver: MyBroadcastReceiver
override fun onActive() {
super.onActive()
broadCastReceiver = MyBroadcastReceiver()
broadCastReceiver.register()
}
override fun onInactive() {
super.onInactive()
broadCastReceiver.unregister()
}
inner class MyBroadcastReceiver : BroadcastReceiver() {
@RequiresPermission(android.Manifest.permission.BLUETOOTH)
fun register() {
val bAdapter = BluetoothAdapter.getDefaultAdapter()
if (value == null ) {
//First instance retrieve value from BluetoothAdapter
postValue(bAdapter.isEnabled)
} else {
//Check if value BluetoothAdapter is same a value observed
if (value != bAdapter.isEnabled) postValue(bAdapter.isEnabled)
}
val filter = IntentFilter()
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED)
try {
context.registerReceiver(broadCastReceiver, filter)
} catch (e: IllegalArgumentException) {
e.printStackTrace()
}
}
fun unregister() {
//safeUnregister
try {
context.unregisterReceiver(broadCastReceiver)
} catch (e: IllegalArgumentException) {
e.printStackTrace()
}
}
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == BluetoothAdapter.ACTION_STATE_CHANGED) {
val previousState =
intent.getIntExtra(
BluetoothAdapter.EXTRA_PREVIOUS_STATE,
BluetoothAdapter.ERROR
)
val state =
intent.getIntExtra(
BluetoothAdapter.EXTRA_STATE,
BluetoothAdapter.ERROR)
if (previousState == BluetoothAdapter.STATE_OFF || previousState == BluetoothAdapter.STATE_TURNING_OFF) {
if (state == BluetoothAdapter.STATE_ON || state == BluetoothAdapter.STATE_TURNING_ON) {
postValue(true)
} else if (state == BluetoothAdapter.STATE_OFF || state == BluetoothAdapter.STATE_TURNING_OFF) {
postValue(false)
}
}
}
}
}
}
Implementando BluetoothStateLiveData
El ViewModel
debe extenderse de AndroidViewModel
de esa forma se puede obtener el contexto de la aplicación necesario para obtener el BluetoothAdapter
class MyViewModel(application: Application) : AndroidViewModel(application) {
val connectivityBluetooth: LiveData<Boolean>
init {
connectivityBluetooth = BluetoothStateLiveData(application)
}
}
Observando el BluetoothStateLiveData
Por último debemos crear el observador del estado que se encuentra el bluetooth
private val mViewModel: MyViewModel by lazy {
ViewModelProvider(this@HomeFragment).get(MyViewModel::class.java)
}
...
mViewModel.connectivityBluetooth.observe(viewLifecycleOwner, Observer {
it?.run {
if (it) {
Log.d(TAG, "Bluetooth ON")
} else {
Log.w(TAG, "Bluetooth OFF")
}
}
})