투케이2K

922. (Android/Java) [TargetSdk 33] observableBluetoothPairingScanList : 블루투스 페어링 된 목록 리스트 스캔 수행 본문

Android

922. (Android/Java) [TargetSdk 33] observableBluetoothPairingScanList : 블루투스 페어링 된 목록 리스트 스캔 수행

투케이2K 2024. 12. 24. 20:44

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Java / Kotlin

 

[소스 코드]

 

// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------

- 언어 : Java / Kotlin


- 개발 툴 : AndroidStudio


- 기술 구분 : Bluetooth / Scan

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






// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------

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

      C_Bluetooth_Module.observableBluetoothPairingScanList(A_Intro.this)
              .subscribeOn(AndroidSchedulers.mainThread()) // [Observable (생성자) 로직을 IO 스레드에서 실행 : 백그라운드]
              .observeOn(Schedulers.io()) // [Observer (관찰자) 로직을 메인 스레드에서 실행]
              .subscribe(new Observer<ArrayList>() { // [Observable.create 타입 지정]
                  @Override
                  public void onSubscribe(@NonNull Disposable d) {
                  }
                  @Override
                  public void onNext(@NonNull ArrayList value) {
                      S_Log._W_(ACTIVITY_NAME + " :: 블루투스 페어링 스캔 :: onNext", new String[]{String.valueOf(value)});
                  }
                  @Override
                  public void onError(@NonNull Throwable e) {
                      S_Log._E_(ACTIVITY_NAME + " :: 블루투스 페어링 스캔 :: onError", new String[]{String.valueOf(e.getMessage())});
                  }
                  @Override
                  public void onComplete() {
                  }
              });

  } catch (Exception e) {
      S_Log._printStackTrace_(mContext, S_FinalData.LOG_BUG_STATE, null, e);
  }
  */
  // --------------------------------------------------------------

  // [필요 변수 선언]
  static BluetoothAdapter ble_Pair_Adapter;
  static int ble_Pair_COUNT = 0;
  static String ble_Pair_LOG = "";
  static ArrayList ble_Paired_List = null;

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

  public static Observable<ArrayList> observableBluetoothPairingScanList(Context mContext) {

      // [로직 처리 실시]
      return Observable.create(subscriber -> {

          // [변수 초기화]
          ble_Pair_Adapter = null;
          ble_Pair_COUNT = 0;
          ble_Pair_LOG = "";
          ble_Paired_List = null;

          try {
              // ===============================================================
              S_Log._D_(ACTIVITY_NAME + " :: observableBluetoothPairingScanList :: 블루투스 페어링 목록 리스트 스캔 시작", null);
              // ===============================================================

              new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                  @Override
                  public void run() {

                      // [퍼미션 권한 체크 실시]
                      if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
                              || ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

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

                          S_Log._E_(ACTIVITY_NAME + " :: observableBluetoothPairingScanList :: 에러 발생", new String[]{String.valueOf(ble_Pair_LOG)});

                          // [리턴 반환 실시]
                          if (subscriber != null && subscriber.isDisposed() == false) {
                              subscriber.onError(new Throwable(ble_Pair_LOG));
                              subscriber.onComplete();
                          }
                          return;

                      } else {

                          // ---------------------------------------------------------------
                          // TODO [Android 12 이상 권한 체크 방어 로직]

                          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
                                  && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED
                                  || ActivityCompat.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {

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

                              S_Log._E_(ACTIVITY_NAME + " :: observableBluetoothPairingScanList :: 에러 발생", new String[]{String.valueOf(ble_Pair_LOG)});

                              // [리턴 반환 실시]
                              if (subscriber != null && subscriber.isDisposed() == false) {
                                  subscriber.onError(new Throwable(ble_Pair_LOG));
                                  subscriber.onComplete();
                              }
                              return;
                          }

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

                          // [블루투스 페어링 목록 리스트 스캔 실시]
                          BluetoothManager bluetoothManager = (BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE);
                          ble_Pair_Adapter = bluetoothManager.getAdapter();

                          if (ble_Pair_Adapter == null || ble_Pair_Adapter.isEnabled() == false) {

                              // [블루투스가 활성화 되어 있지 않은 경우 종료]
                              ble_Pair_LOG = "[ERROR] : Bluetooth Adapter Is Null Or Enabled False (블루투스 기능 지원 여부 및 블루투스 기능 활성 상태 확인 필요)";

                              S_Log._E_(ACTIVITY_NAME + " :: observableBluetoothPairingScanList :: 에러 발생", new String[]{String.valueOf(ble_Pair_LOG)});

                              // [리턴 반환 실시]
                              if (subscriber != null && subscriber.isDisposed() == false) {
                                  subscriber.onError(new Throwable(ble_Pair_LOG));
                                  subscriber.onComplete();
                              }
                              return;

                          }

                          Set<BluetoothDevice> pairedDevices = ble_Pair_Adapter.getBondedDevices();

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

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

                              ble_Pair_LOG = "[Success] : Bluetooth Pairing List Found";
                              ble_Pair_COUNT = pairedDevices.size(); // [카운트 추가]
                              ble_Paired_List = new ArrayList<>(); // [리스트 객체 초기화]

                              for (BluetoothDevice device : pairedDevices) {

                                  //TODO [JSON 형식으로 포맷 실시]
                                  Map map = new HashMap();
                                  try {

                                      map.put("name", String.valueOf(device.getName()));
                                      map.put("address", String.valueOf(device.getAddress()));

                                      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                                          map.put("alias", String.valueOf(device.getAlias()));
                                      }

                                      map.put("uuid", String.valueOf(Arrays.toString(device.getUuids())).replaceAll("\\[", "").replaceAll("\\]", ""));
                                      map.put("state", String.valueOf(device.getBondState()));
                                      map.put("type", String.valueOf(device.getType()));

                                  } catch (Exception e) {
                                      S_Log._printStackTrace_(mContext, S_FinalData.LOG_BUG_STATE, null, e);
                                  }

                                  ble_Paired_List.add(map);
                              }

                          } else {

                              // [페어링 된 목록이 없는 경우]
                              ble_Pair_LOG = "[Success] : Bluetooth Pairing List Not Found";
                              ble_Pair_COUNT = 0;
                              ble_Paired_List = new ArrayList<>();
                          }

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

                          S_Log._W_(ACTIVITY_NAME + " :: observableBluetoothPairingScanList :: 블루투스 페어링 리스트 확인", new String[]{
                                  "M_LOG :: " + String.valueOf(ble_Pair_LOG),
                                  "SCAN_COUNT :: " + String.valueOf(ble_Pair_COUNT),
                                  "SCAN_LIST :: " + String.valueOf(ble_Paired_List)
                          });

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

                          // [리턴 반환 실시]
                          if (subscriber != null && subscriber.isDisposed() == false) {
                              subscriber.onNext(ble_Paired_List);
                              subscriber.onComplete();
                          }

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

                      }

                  }
              }, 0);

          } catch (final Exception e) {
              S_Log._printStackTrace_(mContext, S_FinalData.LOG_BUG_STATE, null, e);

              S_Log._E_(ACTIVITY_NAME + " :: observableBluetoothPairingScanList :: EXCEPTION", new String[]{String.valueOf(e.getMessage())});

              try {
                  // [에러 메시지 삽입]
                  ble_Pair_LOG = "[EXCEPTION] : " + String.valueOf(e.getMessage());

                  // [리턴 반환 실시]
                  if (subscriber != null && subscriber.isDisposed() == false) {
                      subscriber.onError(new Throwable(ble_Pair_LOG));
                      subscriber.onComplete();
                  }
              } catch (Exception ex) {
                  ex.printStackTrace();
              }
          }

      });
  }

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






// --------------------------------------------------------------------------------------
[결과 출력]
// --------------------------------------------------------------------------------------

D///===========//: ================================================
I/: [LOG :: CLASS PLACE :: com.example.javaproject.C_Module.C_Bluetooth_Module.lambda$observableBluetoothPairingScanList$0(C_Bluetooth_Module.java:136)]
I/: ----------------------------------------------------
I/: [LOG :: DESCRIPTION :: C_Bluetooth_Module :: observableBluetoothPairingScanList :: 블루투스 페어링 목록 리스트 스캔 시작]
D///===========//: ================================================


W///===========//: ================================================
I/: [LOG :: CLASS PLACE :: com.example.javaproject.C_Module.C_Bluetooth_Module$1.run(C_Bluetooth_Module.java:228)]
I/: ----------------------------------------------------
I/: [LOG :: DESCRIPTION :: C_Bluetooth_Module :: observableBluetoothPairingScanList :: 블루투스 페어링 리스트 확인]
I/: ----------------------------------------------------
I/: [LOG :: M_LOG :: [Success] : Bluetooth Pairing List Found]
I/: ----------------------------------------------------
I/: [LOG :: SCAN_COUNT :: 1]
I/: ----------------------------------------------------
I/: [LOG :: SCAN_LIST :: [{address=00:19:01:75:D3:94, name=BLE CR747BN 1, alias=BLE CR747BN 1, state=12, type=3, uuid=00001101-0000-1000-8000-00805f9b34fb}]]
W///===========//: ================================================

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

 

반응형
Comments