본문 바로가기
안드로이드

[Android] SDK 30 Bluetooth Scan Permission

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

제목


기존에 블루투스 프로젝트에서 스캔이 안되던 문제는 ACCESS_CORE_LOCATION 권한을 추가하고

사용자에게 허용을 받는 다이얼로그를 띄워서 해결이 가능했습니다.

 

관련 내용은 아래 포스팅에서 확인할 수 있습니다.

2021.08.18 - [안드로이드] - Android Bluetooth Scan 안 되는 문제 해결

 

Android Bluetooth Scan 안되는 문제 해결

Android를 사용하여 Bluetooth Le Application을 개발할 때 Connection을 위한 Device Scan이 필요하고 이부분을 구현하였으나 정작 Scan list를 불러오지 못하는 경우가 있습니다. 이 부분은 예전에는 문제없었지

codinghero.tistory.com

 

위 방법은 SDK 30이하의 개발 환경에서는 완벽하게 해결 가능하지만

SDK 30이상의 개발 환경에서는 안드로이드 진영의 정책이 변경되어 수정을 해주어야 합니다.

 

먼저 Manifest 파일에 아래 권한을 추가합니다.

 

    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
        android:usesPermissionFlags="neverForLocation"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/>
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>

 

SDK 30이상의 블루투스 프로젝트에서는 새롭게 위 3가지의 권한이 추가되었습니다.

 

https://developer.android.com/about/versions/12/features/bluetooth-permissions?hl=ko

 

Android 12의 새 블루투스 권한  |  Android Developers

내년 초 출시될 대형 화면용 기능 출시인 12L을 준비하세요. 지금 사용해 보기 Android 12의 새 블루투스 권한 Android 12에서는 BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT 권한을 도입합니다. 이를 통

developer.android.com

 

다음으로는 기존에 Permission을 체크하는 부분에서 ACCESS_COARSE_LOCATION을

ACCESS_FINE_LOCATION으로 변경해 주어야 합니다.

 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (this.checkSelfPermission(Manifest.permission.ACCESS_FINE_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_FINE_LOCATION}, PERMISSION_ACCESS_FINE_LOCATION );
            }
        });
        builder.show();
    }
}

 

requestPermissions을 요청했기 때문에 onrequest를 overrid 하여 구현합니다.

 

@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();
            }
            return;
        }
    }
}

 

다시 앱을 빌드하면 문제없이 스캔이 잘 되는 것을 확인할 수 있습니다.

 

Android12 이상의 기기에서 실제 실행시 발생할 수 있는

SCAN 에러에 대한 해결방법은 다음 포스팅을 참고 부탁드립니다.

2022.01.24 - [안드로이드] - Need android.permission.BLUETOOTH_SCAN 해결

 

Need android.permission.BLUETOOTH_SCAN 해결

저번 포스팅에 SDK 30 이상 개발 환경에서 Bluetooth Scan 하는 방법에 대해 말씀드렸는데 오늘은 실질적으로 기기에 적용해서 실행했는데 다음과같은 에러 발생 후 어플이 튕겨버리는 현상에 관해

codinghero.tistory.com

 

728x90
반응형

댓글