늘 겸손하게

안드로이드 BluetoothAdapter로 블루투스 검색이 안될때 ( 매니페스트 추가 ) 본문

Programming/Android

안드로이드 BluetoothAdapter로 블루투스 검색이 안될때 ( 매니페스트 추가 )

besforyou999 2021. 8. 27. 10:11

 

안녕하세요 besforyou입니다

이번 글에서는 BluetoothAdapter로 블루투스 기기 검색이 안될 때 해결책 한가지를 소개하겠습니다

 

 


문제 상황

 

android manifest에 Bluetooth, Bluetooth_ADMIN 퍼미션을 주고

BluetoothAdapter를 생성한 뒤 startDiscovery() 메소드를 호출해도 기기 주변 블루투스 장치가 검색이 안 되는 오류가 발생했습니다.

 

왜 그러나 싶었는데 스택 오버플로우에 해결책이 있었네요.

 

출처 : 

https://stackoverflow.com/questions/16184420/bluetooth-on-android-startdiscovery-not-working-cannot-scan-devices

 

Bluetooth on Android: StartDiscovery not working. Cannot scan devices

I am new to android and i am making an application with bluetooth functionalities. I am able to set the bluetooth adaptor, an fetch my own device information, but i could not use startdiscovery to

stackoverflow.com

 


해결책

 

 

AndroidManifest.xml에 

 

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

 

퍼미션이 있는지 확인하면 됩니다.

 

기기 위치 관련 퍼미션을 허락해야 startDiscovery() 함수가 제대로 작동하여 주변 블루투스 기기를 탐색합니다.

 

 

 

- 21.08.28 추가

 

안드로이드 API 버전 23이상부터는 동적으로 퍼미션을 받아야한다고 하네요. 그저 AndroidManifest.xml에 퍼미션을 추가하는것만으로는 BluetoothAdapater의 startDiscovery() 메소드가 실행 안될 수 있다고합니다.

 

 

사용자로부터 퍼미션을 동적으로 받는 코드

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void checkPermission() {
    if (Build.VERSION.SDK_INT >= 23) {
        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
            && checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {      
        } 
        else {
                ActivityCompat.requestPermissions(this, new String[]{
                        Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_COARSE_LOCATION }, 1);
        }
    }
}
 
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED 
        && grantResults[1] == PackageManager.PERMISSION_GRANTED } 
    else {
        checkPermission();
    }
}
cs

코드 해설

 

2 : 현재 빌드 버전이 23이상이고

3 : 퍼미션 중 ACCESS_FINE_LOCATION 과 ACCESS_COARSE_LOCATION이 허락된 상태면 메소드 종료

.

.

6 : 허락되지 않았으면 ActivityCompat.requestPermission 메소드로 사용자에게 퍼미션 요청

.

.

15 : 사용자에게 퍼미션 요청한 결과를 오버라이딩(요청 결과를 원하는대로 수정)

 

17: 두 가지 퍼미션 (ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION) 중 하나라도 허락이 되어 있지 않으면 다시 사용자에게 허락 요청

 

 

 

 

위 코드로 사용자로부터 필요한 퍼미션을 받은 뒤 startDiscovery() 함수를 호출하면 앱이 설치된 기기 주변의 블루투스 장치를 검색합니다.