마시멜로부터는 BLE 스캔을 하기 위해서는 우선 ACCESS_COARSE_LOCATION 퍼미션을 런타임 때 주어야 합니다.
// BLE 관련 Permission 주기
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
// Android M Permission check
if(this.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("This app needs location access");
builder.setMessage("Please grant location access so this app can detect beacons.");
builder.setPositiveButton("Ok", null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
@TargetApi(Build.VERSION_CODES.M)
@Override
public void onDismiss(DialogInterface dialog) {
requestPermissions(new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
}
});
builder.show();
}
}
@Override
public void onRequestPermissionsResult(int reqeustCode, String permission[], int[] grantResults){
switch (reqeustCode){
case PERMISSION_REQUEST_COARSE_LOCATION:{
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
Log.d("permission", "coarse location permission granted");
}else{
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Functionality limited");
builder.setMessage("Since location access has not been granted, " +
"this app will not be able to discover beacons when in the background.");
builder.setPositiveButton("Ok", null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
}
});
builder.show();
}
return;
}
}
}
이 퍼미션을 주지 않으면 BLE 스캔 정보를 받아오는 ScanCallback 함수로 아무런 정보가 넘어오지 않습니다.
그리고 처음 앱을 킬 때 dialog 메시지 창을 통해 이 퍼미션에 대해서 동의를 하는지 묻고 한 번 동의를 하면 그뒤로 묻지 않습니다.