Bt Socket cerró la exception

Estoy construyendo una aplicación que se supone que envía un file a través de un socket Bluetooth, pero por alguna razón sigo recibiendo la misma exception. El post de error dice que el socket ya está cerrado pero no entiendo cómo o por qué se cierra antes de intentar leer de él. Al usuario se le presenta un AlertDialog con opciones para elegir. se supone que deben: 1. Par a un dispositivo. 2. enviar file al dispositivo (actualmente labeldo como "conectar" en el cuadro de dialog). La exception ocurre después de que los dispositivos están emparejados, cuando se selecciona la opción de connection. cuando el dispositivo receptor intenta leer desde el socket obtengo esta exception:

Process: com.example.zemcd.toofxchange, PID: 1074 java.io.IOException: bt socket closed, read return: -1 at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:588) at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96) at java.io.BuffenetworkingInputStream.read1(BuffenetworkingInputStream.java:273) at java.io.BuffenetworkingInputStream.read(BuffenetworkingInputStream.java:334) at java.io.FilterInputStream.read(FilterInputStream.java:107) at kotlin.io.ByteStreamsKt.copyTo(IOStreams.kt:101) at kotlin.io.ByteStreamsKt.copyTo$default(IOStreams.kt:98) at kotlin.io.ByteStreamsKt.readBytes(IOStreams.kt:117) at com.example.zemcd.toofxchange.BluetoothUtils$Companion.receiveFile(BluetoothUtils.kt:82) at com.example.zemcd.toofxchange.ListenThread$run$acceptThread$1.run(BluetoothUtils.kt:104) at java.lang.Thread.run(Thread.java:761) 

a continuación se muestran las funciones utilizadas para emparejar, desvincular y conectar (para enviar datos) junto con las subclasss de hilos que utilizaron:

 class BluetoothUtils { companion object { var listener: ListenThread? = null val _UUID = UUID.fromString("a0e7e4c7-0e4e-43b7-9d18-659192512164") val TAG = "BluetoothUtils" val receiver = MainBTStatusReceiver() fun initPairingServer(adapter: BluetoothAdapter){ var mmServerSocket: BluetoothServerSocket? try { var tmp = adapter.listenUsingRfcommWithServiceRecord(TAG, _UUID) mmServerSocket = tmp listener = ListenThread(mmServerSocket) listener!!.start() }catch (ioe: IOException){ Log.e(TAG, "Error initializing Bluetooth", ioe) } } fun cancelListener() = listener!!.cancel() fun connect(adapter: BluetoothAdapter, device: BluetoothDevice):Unit{ var btSocket: BluetoothSocket? Log.d(TAG, "connect function called") if (device.bondState==BluetoothDevice.BOND_NONE)return //to prompt user to pair try { adapter.cancelDiscovery() btSocket = device.createRfcommSocketToServiceRecord(_UUID) ConnectThread(btSocket).start() }catch (ioe: IOException){ Log.e(TAG, "error connecting", ioe) } } fun startPair(adapter: BluetoothAdapter, device: BluetoothDevice): Unit{ adapter.cancelDiscovery() Log.d(TAG, device.bondState.toString()) device.createBond() } fun unPair(device: BluetoothDevice): Any = device::class.java.getMethod("removeBond").invoke(device) fun sendFile(btSocket: BluetoothSocket){ val out = btSocket.outputStream.buffenetworking() out.use { val msg = "hello".toByteArray() Log.d(TAG, "sending data") it.write(msg, 0, msg.size) it.flush() } btSocket.close() } fun receiveFile(btSocket: BluetoothSocket){ Log.d(TAG, "receiveFile called") val inStream = btSocket.inputStream.buffenetworking() //val bytes: ByteArray = ByteArray(1024) val bytes: ByteArray = inStream.use { it.readBytes(1024)} Log.d(TAG, bytes.toString()) btSocket.close() } } } class ListenThread(val btServSock: BluetoothServerSocket) : Thread(){ companion object { val TAG = "ListenThread" } var btSocket: BluetoothSocket? = null override fun run() { super.run() while (true){ try { Log.d(TAG, "listening . . . ") btSocket = btServSock.accept() Log.d(TAG, btSocket.toString() + " was accepted") val acceptThread = Thread(Runnable { BluetoothUtils.receiveFile(btSocket!!) }) acceptThread.start() }catch (ioe: IOException){ Log.e(TAG, "Error", ioe) break } } } fun cancel() = btServSock.close() } class ConnectThread(val btSocket: BluetoothSocket) : Thread(){ companion object { val TAG = "Pairing Thread" } override fun run() { super.run() try { Log.d(TAG, "attempting to connect") btSocket.connect() BluetoothUtils.sendFile(btSocket) }catch (ioe: IOException){ Log.e(TAG, "error connecting", ioe) btSocket.close() } } } 

y se llaman así dentro de OnClickListener:

 ops.forEach { it.setOnClickListener { Toast.makeText(it.context, it.id.toString(), Toast.LENGTH_SHORT).show() when(it.id){ R.id.statOp -> {} R.id.connectOp -> { Log.d(TAG, "connectOp reached") BluetoothUtils.connect(BluetoothAdapter.getDefaultAdapter(), btDevice) dialog!!.dismiss() } R.id.pairOp -> { Log.d(TAG, "pairOp reached") mReceiver.setFocus(this@DeviceHolder) BluetoothUtils.startPair(BluetoothAdapter.getDefaultAdapter(), btDevice) Log.d(TAG, "start pair complete") dialog!!.dismiss() } R.id.unPairOp -> { Log.d(TAG, "unPairOp reached") mReceiver.setFocus(this@DeviceHolder) BluetoothUtils.unPair(btDevice) Log.d(TAG, "unpair complete") dialog!!.dismiss() } R.id.sendOp -> {} } } } 

y aquí está mi function de resources:

 inline fun <T: AutoCloseable, U> withResources(resource: T, fn: (T) -> U) : U{ try { return fn(resource) }finally { resource.close() } } 

por favor, ayúdame a encontrar mi error. si se necesitan otras piezas de mi código, avíseme y las publicaré. Gracias por tu ayuda.