Observar la conectividad Bluetooth con LiveData en Kotlin Android


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")
        }
    }
 })
Anuncio publicitario

Publicado por Codelaby

Mobile DevDesigner

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: