안드로이드 스튜디오 블루투스 검색안됨 - andeuloideu seutyudio beullutuseu geomsaeg-andoem

Bluetooth StartDiscovery() always returns false

이미 페어링되어 있는 기기의 경우 잘 불러와지나,
새로운 기기 검색 리스트만 계속 조회 실패 한 경우..
계속 해서 빈 배열만 리턴되어따..;;

결론)

안드로이드 10 이상부터 관련 권한 체크를 필수적으로 해주어야했음.
세상에 권한 체크로직 넣으니 정상적으로 주변 기기들을 검색해 오는 것이었음..

블루투스 제어시 필요 권한

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

: location 관련 권한은 왜 필수일까..
하지만 정상작동을 위해 아래 두 항목 꼭 필요하다. 넣어주도록 하자.

[참고]

- 안드로이드 스튜디오 - 블루투스 통신

- Error 참고

+++ 추가

위치 설정 ON-!!
https://stackoverflow.com/questions/58428763/android-10-not-working-with-ble-bluetooth-scanning

안드로이드 스튜디오 블루투스 검색안됨 - andeuloideu seutyudio beullutuseu geomsaeg-andoem

Android를 사용하여 Bluetooth Le Application을 개발할 때 Connection을 위한 

Device Scan이 필요하고 이부분을 구현하였으나 정작 Scan list를 불러오지 못하는 경우가 있습니다.

이 부분은 예전에는 문제없었지만 구글의 바뀐 정책으로 인해 몇 가지 추가를 해주어야 합니다.

일단 기존에는 Bluetooth Scan 및 Connection을 위해서는 Manifest에 두 가지 permission만 선언하면 되었습니다.

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

하지만 구글의 바뀐 정책은 추가적으로 한가지 permission을 더 필요로 합니다.


<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

Manifest에 permission 추가 뒤, MainActivity 부분에 Bluetooth에 필요한 permission을

사용자에게 요청하는 부분을 추가해 주어야 합니다.

onCreate() 함수에 구현.



if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M){
     if(this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)!=

          PackageManager.PERMISSION_GRANTED){

          final AlertDialog.Builder builder = new AlertDialog.Builder(this);

          builder.setTitle("블루투스에 대한 액세스가 필요합니다");

          builder.setMessage("어플리케이션이 비콘을 감지할 수 있도록 위치 정보 액세스 권한을 부여하십시오.");

          builder.setPositiveButton(android.R.string.ok, null);

          builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
               @Override

               public void onDismiss(DialogInterface dialog) {
                    requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},     

                    PERMISSION_REQUEST_COARSE_LOCATION);
               }
          });
          builder.show();
     }
}


이렇게 구현하면 Application 실행 시 사용자에게 해당 권한에 대한 승인 요청을 하게 됩니다.

그 뒤 사용자의 동의 여부에 따른 메시지를 처리하게 위한 부분을 아래와 같이 구현합니다.

MainActivity Class에 구현.


@Override
public void onRequestPermissionsResult(int requestCode,String permissions [], int [] grantResults) {
     switch (requestCode) {
          case PERMISSION_REQUEST_COARSE_LOCATION: {
               if (grantResults [0] == PackageManager.PERMISSION_GRANTED) {
                    Log.d("디버깅", "coarse location permission granted");
               } else {
                    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setTitle("권한 제한");
                    builder.setMessage("위치 정보 및 액세스 권한이 허용되지 않아서 BT를 검색 및 연결할 수없습니다.");
                    builder.setPositiveButton(android.R.string.ok, null);
                    builder.setOnDismissListener(new DialogInterface.OnDismissListener() {

                         @Override
                         public void onDismiss(DialogInterface dialog) {
                         }

                    });
                    builder.show();
               }
               return;
          }
     }
}


여기까지 구현 한 뒤에 MainActivity Class내부에 아래 상수만 선언해 주면 끝입니다.

private static final int PERMISSION_REQUEST_COARSE_LOCATION=1;

이렇게 추가 한 뒤에 Application을 실행 한 뒤, Scan을 하면

Bluetooth 목록이 잘 올라오는 것을 확인 할 수 있습니다.