기존에 블루투스 프로젝트에서 스캔이 안되던 문제는 ACCESS_CORE_LOCATION 권한을 추가하고
사용자에게 허용을 받는 다이얼로그를 띄워서 해결이 가능했습니다.
관련 내용은 아래 포스팅에서 확인할 수 있습니다.
2021.08.18 - [안드로이드] - Android Bluetooth Scan 안 되는 문제 해결
위 방법은 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
다음으로는 기존에 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 해결
'안드로이드' 카테고리의 다른 글
패키지명 전체 변경하기 (8) | 2022.01.24 |
---|---|
[Android] android.view.WindowLeaked 에러 해결 (10) | 2022.01.24 |
[Android] 버튼 하나로 다국어 모드 (30) | 2022.01.20 |
[Android] 버튼 눌림 효과 적용 (30) | 2022.01.19 |
[Android] Failed to apply plugin 'com.android.internal.application' 에러 해결 (21) | 2022.01.18 |
댓글