안드로이드 블루투스 (classic bl) #4. 이미 연결된 기기 체크

나고수·2022년 6월 26일
0

Android

목록 보기
83/109
post-thumbnail
//기기 연결되어있는지 체크하는 쓰레드 

@SuppressLint("MissingPermission")
class ScanPairedDevice(
    private val context: Context,
) {

    fun isSpecificDeviceConnected(): Boolean {
        val adapter = context.getBlAdapter()
        val pairedDevices: Set<BluetoothDevice>? = adapter?.bondedDevices //연결된 기기 목록
        val myBl =
            pairedDevices?.singleOrNull() { it.address == Const.blMac } //연결된 기기 목록 중에 내가 원하는 기기가 있는지 확인
        myBl?.let { //연결된 기기 목록 중에 내가 원하는 기기가 있다면..
            Const.blDevice = it
            Const.blSocket =
//                Const.blDevice?.createRfcommSocketToServiceRecord(UUID.fromString(Const.blUUID))
                if (Const.blSocket != null) {
                    Const.blSocket
                } else {
                    it::class.java.getMethod(
                        "createRfcommSocket",
                        *arrayOf<Class<*>?>(Int::class.javaPrimitiveType)
                    ).invoke(it, 1) as BluetoothSocket
                }
        }
        return myBl != null
    }

    inner class Reconnect(
        private val successHandler: Handler,
        private val failHandler: Handler
    ) : Thread() {
        override fun run() {
            try {
                Const.blSocket?.let {
                    it.connect() //소켓과 연결
                }
            } catch (e: Exception) {
                e.printStackTrace()
                val ms = failHandler.obtainMessage()
                ms.obj = "블루투스와 연결이 불가합니다."
                ms.sendToTarget() //실패 핸들러
                return
            }
            val ms = successHandler.obtainMessage()
            ms.sendToTarget() //성공 핸들러
        }
    }
}
//메인에서 블루투스 연결되어있는지 체크하는 코드

        binding.buttonHomeStart.setOnClickListener {
            if (adapter?.isEnabled == false) {
                //블투 꺼져있음
            } else if (!ScanPairedDevice(requireContext()).isSpecificDeviceConnected()) {
                //디바이스 연결 안되어 있음
            } else {
                //디바이스 연결 됨. 소켓 연결 되어 있는지 체크
                if (Const.blSocket?.isConnected == true) {
                    //소켓 연결 되어있음
                }else {
                    //소켓 연결 안되어있으면 재연결 시도 
                    ScanPairedDevice(requireContext()).Reconnect(
                        //재연결 가능
                        object : Handler(Looper.getMainLooper()) {
                            override fun handleMessage(msg: Message) {
                                super.handleMessage(msg)
                                Timber.d("goToStartFragment - thread")
                            }
                        },
                        //재연결 불가
                        object : Handler(Looper.getMainLooper()){
                            override fun handleMessage(msg: Message) {
                                super.handleMessage(msg)
                                Timber.d("goToStartFragment - toast")
                                val toastMessage = msg.obj.toString()
                                Toast.makeText(requireContext(),toastMessage, Toast.LENGTH_SHORT).show()
                            }
                        }
                    ).start()
                }
            }
        }
profile
되고싶다

0개의 댓글

관련 채용 정보