본문 바로가기
Mobile Programming/Android

[Kotlin] 블루투스 On/Off 제어하기

by 푸고배 2020. 12. 21.

Toggle Button을 통해서 블루투스 기능을 On/Off 해보자.

1. Bluetooth 권한 등록 

어플리케이션에서 블루투스 기능을 사용하려면 두 개의 권한을 선언해야 한다.

BLUETOOTH는 연결 요청, 연결 수락 및 데이터 전송과 같은 블루투스 통신을 수행하는데 필요하다.

ACCESS_FINE_LOCATION은 블루투스 스캔을 사용하여 사용자 위치에 대한 정보를 수집할 수 있다. 이 정보는 사용자 본인의 기기에서 가져올 수도 있고, 상점 및 교통 시설과 같은 위치에서 사용 중인 블루투스 비콘에서 가져올 수도 있다.

 

앱에서 기기 검색을 시작하거나 블루투스 설정을 조작하려면 BLUETOOTH 권한 외에 BLUETOOTH_ADMIN 권한도 선언해야한다. 대부분 애플리케이션은 로컬 블루투스 기기를 검색하는 기능에만 이 권한이 필요하다. 어플리케이션이 사용자 요청 시 블루투스 설정을 수정하는 '파워 관리자'가 아닌 경우 이 권한이 부여하는 다른 기능을 사용해서는 안된다.

 

★ 참고 : 어플리케이션이 Android9 (API 레벨 28) 이하를 대상으로 하는 경우 ACCESS_FINE_LOCATION 권한 대신 ACCESS_COARSE_LOCATION 권한을 선언할 수 있다.

 

어플리케이션 Manifest.xml 파일에 블루투스 권한을 다음과 같이 선언한다.

    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- If your app targets Android 9 or lower, you can declare
       ACCESS_COARSE_LOCATION instead. -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

 

2. layout xml 수정

activity_main.xml에 다음과 같이 Bluetooth 기능을 On/Off 할 수 있는 Toggle Button을 추가한다.

 

    <ToggleButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/ble_on_off_btn"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

3. Kotline code 수정

먼저 bluetooth defaultAdapter를 전역변수에 저장한다.

Bluetooth가 켜져있으면 어플 실행 시 Toggle Button의 텍스트가 On으로, Bluetooth가 꺼져있으면 어플 실행 시 Toggle Button의 텍스트가 Off로 표시된다. Toggle Button을 누르면 전역변수에 저장된 bluetoothAdapter를 통해, 현재 기기가 Bluetooth 기능을 지원하는지 확인 후, 지원하면 Toggle 버튼의 상태에 따라서 Bluetooth를 On/Off 한다.

package com.example.bluetoothapp

import android.bluetooth.BluetoothAdapter
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.ToggleButton

class MainActivity : AppCompatActivity() {
    private val REQUEST_ENABLE_BT=1
    private var bluetoothAdapter: BluetoothAdapter? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val bleOnOffBtn:ToggleButton = findViewById(R.id.ble_on_off_btn)
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()

        if(bluetoothAdapter!=null){
            // Device doesn't support Bluetooth
            if(bluetoothAdapter?.isEnabled==false){
                bleOnOffBtn.isChecked = true
            } else{
                bleOnOffBtn.isChecked = false
            }
        }

        bleOnOffBtn.setOnCheckedChangeListener { _, isChecked ->
            bluetoothOnOff()
        }

    }
    fun bluetoothOnOff(){
        if (bluetoothAdapter == null) {
            // Device doesn't support Bluetooth
            Log.d("bluetoothAdapter","Device doesn't support Bluetooth")
        }else{
            if (bluetoothAdapter?.isEnabled == false) { // 블루투스 꺼져 있으면 블루투스 활성화
                val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
            } else{ // 블루투스 켜져있으면 블루투스 비활성화
                bluetoothAdapter?.disable()
            }
        }
    }
}
반응형

댓글