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 목록이 잘 올라오는 것을 확인 할 수 있습니다.
'안드로이드' 카테고리의 다른 글
[Android] 카메라로 읽은 이미지 고화질로 가져오기 (1) | 2021.09.06 |
---|---|
[Android] Application 사용 가능 기간 구현 (0) | 2021.08.18 |
[Android] Bluetooth Le Auto Connection 구현 (0) | 2021.08.18 |
[Android] APK파일 구글맵 연동 (0) | 2021.03.11 |
[Android] 프래그먼트 내부 구글맵 구현 (0) | 2021.03.03 |
댓글