본문 바로가기
안드로이드

Need android.permission.BLUETOOTH_SCAN 해결

by 코딩히어로 2022. 1. 24.
728x90

저번 포스팅에 SDK 30 이상 개발 환경에서 Bluetooth Scan 하는 방법에 대해 말씀드렸는데

오늘은 실질적으로 기기에 적용해서 실행했는데 다음과같은 에러 발생 후 어플이 튕겨버리는

현상에 관해 해결 방법을 남겨봅니다.

 

Need android.permission.BLUETOOTH_SCAN permission for AttributionSource { uid = 10553, packageName = com.garin.android.smartlight, attributionTag = null, token = android.os.BinderProxy@1e585c3, next = null }: GattService registerScanner

 

분명 저번글에서 매니페스트 파일에 SCAN과 CONNECT에 대해 추가했는데

위와 같은 에러가 발생하였습니다.

2022.01.21 - [안드로이드] - Android SDK 30 Bluetooth Scan Permission

 

Android SDK 30 Bluetooth Scan Permission

기존에 블루투스 프로젝트에서 스캔이 안되던 문제는 ACCESS_CORE_LOCATION 권한을 추가하고 사용자에게 허용을 받는 다이얼로그를 띄워서 해결이 가능했습니다. 관련 내용은 아래 포스팅에서 확인

codinghero.tistory.com

해당 내용은 이전 포스팅 참고 부탁드립니다.

매니페스트에 추가를 하긴 했지만 해당 권한은 민감한 permission이기 때문에

사용자에게 직접적으로 통보를 하고 승인을 받아야 합니다.

 

먼저 MainActivity에 다음과 같이 권한을 체크하여 사용자에게 요청하는 구문을 추가합니다.

 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    if (this.checkSelfPermission(Manifest.permission.BLUETOOTH_SCAN) != 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.BLUETOOTH_SCAN}, 2 );
            }
        });
        builder.show();
    }
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    if (this.checkSelfPermission(Manifest.permission.BLUETOOTH_CONNECT) != 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.BLUETOOTH_CONNECT}, 3 );
            }
        });
        builder.show();
    }
}

 

SCAN과 CONNECT에 대한 권한이 없을 경우 사용자에게 Dialog를 띄워서 승인을 요청합니다.

사용자가 확인을 누를 경우 실질적으로 해당 권한을

허용하는 요청을 하는 구문을 다음과 같이 추가합니다.

 

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_ACCESS_FINE_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("위치 정보 및 액세스 권한이 허용되지 않았으므로 블루투스를 검색 및 연결할수 없습니다.");
                builder.setPositiveButton(android.R.string.ok, null);
                builder.setOnDismissListener(new DialogInterface.OnDismissListener() {

                    @Override
                    public void onDismiss(DialogInterface dialog) {
                    }

                });
                builder.show();
            }
            break;
        }
        case 2: {
            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("블루투스 스캔권한이 허용되지 않았습니다.");
                builder.setPositiveButton(android.R.string.ok, null);
                builder.setOnDismissListener(new DialogInterface.OnDismissListener() {

                    @Override
                    public void onDismiss(DialogInterface dialog) {
                    }

                });
                builder.show();
            }
            break;
        }
        case 3: {
            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("블루투스 연결 권한이 허용되지 않았습니다.");
                builder.setPositiveButton(android.R.string.ok, null);
                builder.setOnDismissListener(new DialogInterface.OnDismissListener() {

                    @Override
                    public void onDismiss(DialogInterface dialog) {
                    }

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

 

제 경우에는 블루투스 FINE ACCESS 권한과 CONNECT 그리고 SCAN권한 세 가지를

사용자에게 요청한 뒤 승인을 받도록 작성하였습니다.

 

여기까지 추가한 뒤에 빌드하시면 에러 없이 블루투스 연결과 스캔이 잘 되는

것을 확인하실 수 있습니다.

728x90
반응형

댓글