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
해당 내용은 이전 포스팅 참고 부탁드립니다.
매니페스트에 추가를 하긴 했지만 해당 권한은 민감한 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
반응형
'안드로이드' 카테고리의 다른 글
Application 실행 중 화면 유지 (10) | 2022.02.03 |
---|---|
안드로이드 EditText 자동 키보드 막는 방법 (14) | 2022.01.28 |
패키지명 전체 변경하기 (8) | 2022.01.24 |
[Android] android.view.WindowLeaked 에러 해결 (10) | 2022.01.24 |
[Android] SDK 30 Bluetooth Scan Permission (23) | 2022.01.21 |
댓글