본문 바로가기

프로젝트/블루투스 무드등

[비전공자도 만들 수 있는 블루투스 무드등] 7. 안드로이드 앱 part 2-1, 블루투스 권한 설정

안녕하세요? 닉네임간편입니다. 이번 시간부터는 본격적으로 자바 코드를 작성하며 블루투스 앱을 완성해보도록 하겠습니다. 우선 이번 시간에는 블루투스 권한 선언 및 설정에 대해 알아보겠습니다.


전체 소스는 여기에 있습니다.

https://github.com/creativeduck/MyLED

앱을 미리 사용해보고 계신 분들은, 이 링크를 타고 설치해주시면 됩니다.

https://play.google.com/store/apps/details?id=com.mybest.myled


1. 블루투스 권한

안드로이드 앱에서 블루투스 기능을 사용하기 위해선 블루투스 권한을 미리 선언해야 합니다. 블루투스 기능을 사용하기 위해 필요한 권한은 다음과 같습니다.

 

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

 

1) BLUETOOTH

이 권한은 연결을 요청 및 수락하거나 데이터를 전송하는 등 블루투스 통신을 수행하는 데 필요한 권한입니다.

 

2) BLUETOOTH_ADMIN

이 권한은 앱에서 다른 블루투스 기기를 검색하거나 블루투스 설정을 조작할 때 필요한 권한입니다.

 

권한 선언은 메니페스트 파일에서 선언하며, AndroidManifest.xml 파일 내에서 다음과 같이 적어주시면 됩니다.

 

권한 설정

2. 블루투스 설정

앱이 블루투스를 사용하기 위해선 블루투스가 기기에서 지원되는지를 먼저 확인해야 합니다.

만일 기기가 블루투스를 지원하지 않는 경우, 모든 블루투스 기능을 비활성화해야 합니다.
만일 기기가 블루투스를 지원하는 경우 블루투스를 활성화해야 하며, 블루투스가 비활성화된 상태라면 블루투스를 활성화하도록 요청합니다.

 

먼저 필요한 변수들을 정의한 후 해당 기능을 하는 메서드를 설명하겠습니다.

 

static final int REQUEST_ENABLE_BT = 100;
BluetoothAdapter bluetoothAdapter;

 

1) REQUEST_ENABLE_BT

추후에 블루투스 요청 코드가 필요하므로, 여기서 정의합니다. 요청 코드는 각각의 액티비티를 구별하기 위해 사용되며, 이 값은 0보다 커야 하며, 저는 100으로 설정했습니다.

 

2) BluetoothAdapter

블루투스를 활성화하기 위해선 BluetoothAdapter가 필요합니다. 따라서 여기서 먼저 정의해줍니다.

 

 

private void checkBluetooth() {
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if(bluetoothAdapter==null) {
            Toast.makeText(getApplicationContext(), "해당 기기는 블루투스를 지원하지 않습니다.",
                                                        Toast.LENGTH_SHORT).show();
            finish();
        } else { 
            if(bluetoothAdapter.isEnabled()) {
                selectPairedDevice();
            } else {  
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            }
        }
    }

 

1) 블루투스 어댑터 가져오기

getDefaultAdapter() 메서드를 통해 기기의 블루투스 어댑터를 가져올 수 있습니다.

안드로이드는 시스템에서 오직 하나의 블루투스 어댑터를 갖고 있기 때문에 생성자로 만들지 않고 이런 방식으로 가져옵니다.

 

만일 getDefaultAdapter()가 null을 반환하면 해당 기기는 블루투스를 지원하지 않는 것입니다. 따라서 이 경우 토스트 메시지를 전달한 뒤, 기기를 종료합니다.

finish() 메서드는 앱을 종료하는 메서드입니다.

2) 블루투스 활성화 여부에 따른 처리

getDefaultAdapter() 메서드로 블루투스 어댑터를 제대로 가져왔다면, 이제 isEnabled() 메서드를 호출하여 현재 블루투스가 활성화되어있는지를 확인합니다. isEnabled() 메서드는 boolean 타입이므로 true or false를 반환합니다.

 

a) true를 반환하는 경우

블루투스가 활성화되어있는 것으로, 페어링 된 블루투스 장치 목록에서 블루투스 연결을 시도합니다. 해당 기능을 하는 메서드를 호출합니다.

 

b) false를 반환하는 경우

블루투스가 비활성화된 것입니다.

블루투스 활성화를 요청하려면 우선 ACTION_REQUEST_ENABLE 액션을 수행하는 인텐트 객체를 만듭니다. ACTION_REQUEST_ENABLE은 사용자로 하여금 블루투스를 활성화할 수 있게 하는 시스템 액티비티 화면을 띄웁니다.

이후 startActivityForResult() 메서드에 인텐트 객체와 요청 코드를 파라미터로 전달하고 호출합니다.
앞서 만든 인텐트 객체는 시스템으로 하여금 블루투스를 활성화할 수 있도록 하는 새 액티비티 화면을 띄웁니다. 이 화면에서 사용자가 활성화를 하기로 했다면 해당 응답이 발생합니다. startActivityForResult() 메서드는 해당 인텐트 객체가 요청한 새 액티비티 화면에서 발생한 응답을 처리할 때 사용하는 메서드입니다.
이때 어떤 액티비티로부터 온 응답인지를 구분하기 위해 요청 코드의 코드 값을 이용하며, 앞서 정의한 REQUEST_ENABLE_BT를 사용합니다.

즉, 블루투스 활성화를 하도록 하는 화면을 띄우는 인텐트 객체를 우선 만듭니다.
이후 이 화면에서 오는 응답을 처리하도록 startActivityForResult 메서드를 호출합니다. 이때 REQUEST_ENABLE_BT라는 요청 코드를 사용해 어떤 화면에서 온 응답인지를 구별할 수 있도록 합니다.

 

인텐트 객체로 인해 띄워지는 화면은 다음과 같이 블루투스 활성화 여부를 묻는 화면이며, 허용을 선택하면 응답 코드로 RESULT_OK가 전달되고, 거부를 선택하면 RESULT_CANCELED이 전달됩니다.

3. 응답 처리

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode==REQUEST_ENABLE_BT) {
            if(resultCode==RESULT_OK) {
                selectPairedDevice();
            } else if(resultCode==RESULT_CANCELED) {
                finish();
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

 

이제 받아온 응답을 처리하는 메서드에 대해 설명드리겠습니다.

이 메서드는 MainActivity의 부모 클래스인 AppCompatActivity의 메서드이므로, 이를 재정의하여 사용합니다.

이때 메소드 상단에 @Override 키워드를 적습니다. 이렇게 되면 만일 재정의한 메서드에 타이핑 오류가 있을 경우 에러가 발생했다고 알려줍니다. 
만일 @Override 키워드를 사용하지 않고 메서드를 재정의할 경우, 부모 클래스의 메서드를 재정의하는 것이 아니라 새로운 메서드를 정의한다는 것으로 인식하여 사용자의 의도와 다르게 구동할 수 있기 때문에, 해당 키워드를 사용하는 것이 좋습니다.

이 메서드는 startActivityForResult() 메서드로 받은 응답을 처리합니다.
먼저 요청 코드에 따라 구분하기 위해 if문으로 구분하였습니다.
만일 요청 코드가 우리가 앞서 정의했던 REQUEST_ENABLE_BT라면 추가적인 동작을 수행합니다.

1) resultCode가 RESULT_OK라면
페어링 된 블루투스 장치 목록에서 블루투스 연결을 실행하는 메서드를 호출합니다. 

2) resultCode가 RESULT_CANCELED라면
블루투스를 활성화하지 않는다는 것이므로, 앱을 종료합니다.

super.onActivityResult() 메서드는 부모 클래스의 onActivityResult() 메서드를 호출해서 기능을 수행하는 것입니다. 만일 부모 클래스에서 이 메서드가 호출되었을 때 반드시 수행되어야 할 기능이 있음에도 불구하고 이를 호출해주지 않는다면 문제가 발생할 수 있으므로, super를 통해 호출해줍니다.

 

4. 마무리

이번 시간에는 블루투스 기능 사용을 위한 권한 설정 및 블루투스 설정에 대해 알아보았습니다. 다음 시간에도 이어서 블루투스 앱을 만들겠습니다.

오늘 알려드린 정보가 많은 도움이 되었길 바랍니다.

728x90
반응형