투케이2K

280. (kotlin/코틀린) [유틸 파일] observablebluetoothPairingScanList : 블루투스 페어링 목록 스캔 결과 반환 본문

Kotlin

280. (kotlin/코틀린) [유틸 파일] observablebluetoothPairingScanList : 블루투스 페어링 목록 스캔 결과 반환

투케이2K 2023. 4. 28. 21:05

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Kotlin

 

[소스 코드]

 

        // -----------------------------------------------------------------------------------------
        // TODO [SEARCH FAST] : [Observable] : [블루투스 페어링 목록 스캔 결과 반환]
        // -----------------------------------------------------------------------------------------
        // TODO [호출 방법 소스 코드]
        // -----------------------------------------------------------------------------------------
        /*
        try {

            C_App.observablebluetoothPairingScanList(A_Intro@this)
                .subscribeOn(AndroidSchedulers.mainThread()) // [Observable (생성자) 로직을 IO 스레드에서 실행 : 백그라운드]
                .observeOn(Schedulers.io()) // [Observer (관찰자) 로직을 메인 스레드에서 실행]
                .subscribe(
                    { value ->
                        S_Log.ltw("================================================")
                        S_Log.cnt("[" + ACTIVITY_NAME + " >> BLE PAIRED SCAN RESULT :: onNext]")
                        S_Log.cnt("-----------------------------------------")
                        S_Log.cnt("[VALUE :: $value]")
                        S_Log.lbw("================================================")
                    },
                    { error ->
                        S_Log.lte("================================================")
                        S_Log.cnt("[" + ACTIVITY_NAME + " >> BLE PAIRED SCAN RESULT :: onError]")
                        S_Log.cnt("-----------------------------------------")
                        S_Log.cnt("[ERROR :: " + error.message.toString() + "]")
                        S_Log.lbe("================================================")
                    }
                )
                {
                }

        } catch (e : Exception) {
            e.printStackTrace()
        }
        */
        // -----------------------------------------------------------------------------------------
        var ble_Adapter: BluetoothAdapter? = null
        var ble_Bonded_COUNT = 0
        var ble_M_LOG = ""
        var ble_Paired_List: ArrayList<Any>? = null
        fun observablebluetoothPairingScanList(mContext: Context): Observable<ArrayList<Any>> {

            // [로직 처리 실시]
            return Observable.create { subscriber: ObservableEmitter<ArrayList<Any>> ->

                // [변수 초기화]
                ble_Adapter = null
                ble_Bonded_COUNT = 0
                ble_M_LOG = ""
                ble_Paired_List = null

                try {
                    // ===============================================================
                    S_Log._D_("블루투스 페어링 목록 리스트 스캔 시작", null)
                    // ===============================================================
                    Handler(Looper.getMainLooper()).postDelayed({
                        // [퍼미션 권한 체크 실시]
                        if (ActivityCompat.checkSelfPermission(mContext!!, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
                            || ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                            || ActivityCompat.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) {

                            // [퍼미션이 부여되어있지 않은 경우 종료]
                            ble_M_LOG = "[ERROR] : [observablebluetoothPairingScanList] : Bluetooth Pairing Scan Permission not Granted (블루투스 페어링 목록 스캔에 필요한 권한을 확인해주세요.)"

                            // ===============================================================
                            S_Log._E_("ERROR", arrayOf(
                                "ERROR :: $ble_M_LOG"
                            ))
                            // ===============================================================

                            // [리턴 반환 실시]
                            subscriber.onError(Throwable(ble_M_LOG))
                            subscriber.onComplete()
                        } else {

                            // ---------------------------------------------------------------

                            // [블루투스 페어링 목록 리스트 스캔 실시]
                            val bluetoothManager = mContext.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
                            ble_Adapter = bluetoothManager.adapter
                            val pairedDevices = ble_Adapter!!.bondedDevices

                            // ---------------------------------------------------------------
                            if (pairedDevices != null && pairedDevices.size > 0) { // [스캔 된 목록이 있는 경우]

                                ble_Bonded_COUNT = pairedDevices.size
                                ble_Paired_List = ArrayList<Any>()

                                for (device in pairedDevices) {

                                    //TODO [JSON 형식으로 포맷 실시]
                                    val map: MutableMap<String, Any> = HashMap<String, Any>()
                                    try {
                                        map["name"] = device.name.toString()
                                        map["address"] = device.address.toString()
                                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                                            map["alias"] = device.alias.toString()
                                        }
                                        map["uuid"] = Arrays.toString(device.uuids).toString().replace("\\[".toRegex(), "").replace("\\]".toRegex(), "")
                                        map["state"] = device.bondState.toString()
                                        map["type"] = device.type.toString()
                                    } catch (e: Exception) {
                                        e.printStackTrace()
                                    }

                                    ble_Paired_List!!.add(map)
                                }
                            } else {
                                ble_Bonded_COUNT = 0
                                ble_Paired_List = ArrayList<Any>()
                            }

                            // ---------------------------------------------------------------

                            // [로그 출력]
                            // ===============================================================
                            S_Log._W_("SUCCESS", arrayOf(
                                "SCAN COUNT :: $ble_Bonded_COUNT",
                                "SCAN LIST :: " + Gson().newBuilder().setPrettyPrinting().create().toJson(ble_Paired_List).toString()
                            ))
                            // ===============================================================

                            // ---------------------------------------------------------------

                            // [리턴 반환 실시]
                            subscriber.onNext(ble_Paired_List)
                            subscriber.onComplete()

                            // ---------------------------------------------------------------
                        }
                    }, 0)
                } catch (e: Exception) {
                    e.printStackTrace()
                    // ===============================================================
                    S_Log._E_("EXCEPTION", arrayOf(
                        "EXCEPTION :: " + e.message.toString()
                    ))
                    // ===============================================================

                    // ------------------------------------------------------
                    // TODO [리턴 데이터 반환]
                    // ------------------------------------------------------
                    try {
                        // [에러 메시지 삽입]
                        ble_M_LOG = "[EXCEPTION] : [observablebluetoothPairingScanList] : " + e.message.toString()

                        // [리턴 반환 실시]
                        subscriber.onError(Throwable(ble_M_LOG))
                        subscriber.onComplete()
                    } catch (ex: Exception) {
                        ex.printStackTrace()
                    }
                }
            }
        }

 


반응형
Comments