본문 바로가기
Android

[깡샘의 안드로이드 프로그래밍] 정리 29 - 블루투스

by 들풀민들레 2018. 1. 6.

 

 

본 글은 [깡샘의 안드로이드 프로그래밍 - 루비페이퍼] 의 내용을 발췌한 것입니다.
좀더 자세한 내용은 책을 통해 확인해 주세요.

 

 

 

 

 

 

 

27장. 스마트폰 기능 활용

 

27.3.1. 블루투스 제어

 

블루투스 지원 여부 확인 

 

블루투스와 관련된 작업은 퍼미션이 필요합니다.

 

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

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

 

두 개의 퍼미션을 선언할 수 있는데, android.permission.BLUETOOTH는 페어링 된 기기와 데이터를 송수신할 때 필요하며, android.permission.BLUETOOTH_ADMIN은 환경설정에서 해주어야 하는 블루투스 관련 작업을 앱에서 수행할 때 필요합니다.

블루투스와 관련된 모든 작업에 가장 먼저 수행해야 하는 부분은 앱이 동작하는 스마트폰이 블루투스를 지원하는지를 알아보는 작업입니다. 물론, 거의 모든 스마트폰이 블루투스를 지원하지만, 특정 스마트폰 에서 지원하지 않을 수도 있으므로 블루투스 지원 여부를 판단해야 합니다.

 

BluetoothAdapter ap = BluetoothAdapter.getDefaultAdapter();

if (ap == null)

showToast("bluetooth 를 지원하지 않습니다.");

else

showToast("bluetooth 를 지원합니다.");

 

블루투스와 관련된 모든 작업은 BluetoothAdapter.getDefaultAdapter ( ) 함수를 이용하여 BluetoothAdapter 클래스를 얻는 작업부터 시작합니다. 만약 null을 반환하면 스마트폰에서 블루투스 를 지원하지 않는 것입니다.

 

블루투스 활성 상태 변경 

 

사용자가 스마트폰의 환경설정에서 블루투스를 활성화하거나 비활성화할 수 있습니다. 하지만 이 작업은 앱에서도 할 수 있습니다.

 

BluetoothAdapter ap1 = BluetoothAdapter.getDefaultAdapter();

if (!ap1.isEnabled()) {

Intent bIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(bIntent, 5);

}

 

블루투스가 활성 상태인지는 BluetoothAdapter의 isEnabled ( ) 함수로 판단할 수 있습니다. 만약 현재 사용자 스마트폰의 블루투스

가 활성 상태가 아니라면 활성 상태로 변경할 수 있는데, 위의 코드 처럼 간단하게 인텐트 발생만으로 활성 상태로 만들 수 있습니다.

액션 문자열을 BluetoothAdapter.ACTION_REQUEST_ENABLE로 지정하여 인텐트를 발생시키면 사용자에게 블루투스 활성 여부를

묻는 다이얼로그가 뜹니다.

 

 

물론 스마트폰에 따라 위의 다이얼로그가 보이지 않고 활성 상태가 될 수도 있습니다. 그런데 위의 다이얼로그에서 사용자가 거부한 건지 허용한 건지를 판단해야 합니다. 이는 startActivityForResult ( ) 함수의 결과로 호출되는 onActivityResult ( ) 함수에서 판단할 수 있습니다.

 

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

switch (requestCode) {

case 5:

// bluetooth 활성화

if (resultCode == RESULT_OK)

showToast("bluetooth 가 활성화 되었습니다.");

else if (resultCode == RESULT_CANCELED)

showToast("bluetooth 가 활성화 되지 못하였습니다.");

}

}

 

onActivityResult ( ) 함수의 resultCode 값이 RESULT_OK이면 블루투스 활성화를 허용한 것이며, RESULT_CANCELED이면 거부한 것입니다. 그런데 이처럼 인텐트를 이용하는 방법은 사용자 화면에 다이얼로그가 보이고, 이 다이얼로그에서 사용자가 허용해야만 블루투스가 활성화합니다. 하지만 블루투스를 활성화하는 다른 방법이 하나 더 있습니다.

 

BluetoothAdapter ap1 = BluetoothAdapter.getDefaultAdapter();

if (!ap1.isEnabled()) {

ap1.enable();

}else {

ap1.disable();

}

 

BluetoothAdapter의 enable( ), disable ( ) 함수를 호출하면 사용자 확인 없이 바로 블루투스가 활성 화하거나 비활성화합니다.

 

기기 검색 허용

 

 자신의 스마트폰을 다른 기기(대부분 다른 스마트폰)에서 검색되게 하려면 블루투스 검색을 허용해 주 어야 합니다. 검색이 허용된 스마트폰은 다른 기기에서 검색해서 인지할 수 있습니다.

 

Intent dIntent = new Intent( BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

dIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 100);

startActivity(dIntent);

 

간단하게 BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE 액션 문자열로 인텐트를 발생하는 것만으로 검색을 허용할 수 있습니다. 기기 검색 허용 시 허용 시간을 지정할 수 있는데, 인텐트의 Extra 데이터에 BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION을 키값으로 하여 검색 허용 시간을 담아줍니다. 위의 예는 100으로 지정하였으므로 100초 동안 기기 검색을 허용합니다. 앱이 설정할 수 있는 최대 기간은 3,600초이며 값이 0이면 기기가 항상 검색 가능합니다. 0 미만 또는 3,600을 초과한 값은 자동으로 120초로 설정됩니다.

 

페어링 기기 검색

 

특정 기기와 데이터 통신을 하려면 해당 기기와 페어링(pairing) 되어야 하는데, 먼저 페어링 된 기기 목록을 가져와야 합니다.

 

BluetoothAdapter ap2 = BluetoothAdapter.getDefaultAdapter();

Set<BluetoothDevice> devices = ap2.getBondedDevices();

if (devices.size() > 0) {

Iterator<BluetoothDevice> iter = devices.iterator();

while (iter.hasNext()) {

BluetoothDevice d = iter.next();

deviceArray[i] = d.getName();

Log.d("kkang", "device info:" + d.getName() + "-" + d.getAddress());

}

}

 

BluetoothAdapter.getDefaultAdapter ( ) 함수로 페어링 된 기기 목록을 얻으며 페어링 된 기기 정보가 BluetoothDevice 객체로 전달됩니다. BluetoothDevice 객체의 getName( ), getAddress ( ) 함수를 이용하여 기기의 이름과 MAC 주소를 얻을 수 있습니다. 이 BluetoothDevice 정보를 이용하여 서로 연결할 수 있습니다.

 

그런데 위의 코드는 앱에서 필요한 순간 페어링 된 기기 목록을 얻는 것이고, 때로는 사용자가 환경설정 에서 특정 기기와 페어링 하는 순간을 감지해야 할 때도 있습니다. 예로 들면 우리가 만드는 앱이 음악 재생 앱이라면 사용자가 스피커와 페어링 하는 순간을 감지해서 앱을 실행할 수 있습니다. 이처럼 앱에서 페어링 되는 순간을 감지하려면 브로드캐스트 리시버를 이용합니다.

 

<receiver

android:name=".BluetoothReceiver">

<intent-filter>

<action android:name="android.bluetooth.device.action.FOUND"></action>

</intent-filter>

</receiver>

 

브로드캐스트 리시버를 android.bluetooth.device.action.FOUND 액션 문자열로 등록하면 페어링 되는 순간 자동으로 실행됩니다. 이 브로드캐스트 리시버에서 현재 페어링 된 기기 정보를 추출하면 됩니다.

 

@Override

public void onReceive(Context context, Intent intent) {

BluetoothDevice device=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

}