본문 바로가기
안드로이드

[Android] Android Bluetooth Scan 안되는 문제 해결

by 코딩히어로 2021. 8. 18.
728x90

제목


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 목록이 잘 올라오는 것을 확인 할 수 있습니다.

728x90
반응형

댓글