안드로이드의 블루투스 통신 예제입니다.

안드로이드의 블루투스 레퍼런스를 참고하고 싶으시다면 다음 링크로 들어가시면 됩니다.


레퍼런스 참고 -> 블루투스 API


1. 블루투스 통신 예제


> 예제 사용법 보기(클릭)


이 예제를 활용하여 수정한다면 블루투스 통신을 자유자재로 사용할 수 있다.

이제부터 이 예제를 활용하여 블루투스 통신을 하는 예제를 만들어 보겠다.


2. 새 프로젝트 생성


액티비티에 버튼을 생성하여, 버튼을 눌렀을 경우 블루투스 연결을 할 수 있도록 만들어볼 예정이다.


메인화면 레이아웃은 다음과 같이 버튼과 현재 상황을 알려주는 TextView로 만들었다.

main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/btn_connect"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="연결" />


    <TextView
        android:id="@+id/txt_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_connect"
        android:text="" />

</RelativeLayout>



기본 세팅이 끝났으니 이제부터 블루투스 통신에 관련된 코드를 작성해보겠다.


3. 권한 등록


제대로된 코딩을 시작하기 전에 권한등록(permission 등록)을 먼저 하도록 하자

블루투스 기능을 사용하기 위해서는 'BLUETOOTH'와 'BLUETOOTH_ADMIN'의 권한을 등록해줘야 한다.


BLUETOOTH : 커넥션 요구, 커넥션 수락, 데이터 전송 등의 블루투스 통신을 하기 위해 필요한 권한

BLUETOOTH_ADMIN : 디바이스 검색 시작, 블루투스 설정을 조작하기 위해 필요

(BLUETOOTH_ADMIN 권한을 사용하려면 BLUETOOTH 권한도 꼭 있어야 한다.)


Manifest 파일에 블루투스 권한 등록


AndroidManifest.xml

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


4. 새 Class 파일 생성


MainActivity에는 Button과 TextView만 배치해놓고 BluetoothService라는 Class를 만들도록 한다.

BluetoothService라는 Class에서 블루투스와 관련된 모든 작업을 처리할 예정이다. 

작업이 처리되는 과정은 핸들러를 통해서 MainActivity에 전달되어 상태값을 전달받아 TextView에 보여주거나 버튼의 상태를 변경해 주도록 할 것이다.


BluetoothService 생성자는 메인이 되는 MainActivity로 부터 Activity와 Handler 값을 받는다.


BluetoothService.java

public class BluetoothService {
	// Debugging
	private static final String TAG = "BluetoothService";
	
	private BluetoothAdapter btAdapter;
	
	private Activity mActivity;
	private Handler mHandler;
	
	// Constructors
	public BluetoothService(Activity ac, Handler h) {
		mActivity = ac;
		mHandler = h;
		
		// BluetoothAdapter 얻기
		btAdapter = BluetoothAdapter.getDefaultAdapter();
	}

MainActivity.java

private BluetoothService btService = null;

private final Handler mHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
		}
		
	};

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.main);
		
		// BluetoothService 클래스 생성
		if(btService == null) {
			btService = new BluetoothService(this, mHandler);
		}
	}


5. 블루투스 활성화


블루투스를 활성화 하기 위해 BluetoothAdapter클래스를 사용해서 다음 두 단계의 작업을 순서대로 진행한다.


① 블루투스 지원 확인

② 블루투스 활성화


① 블루투스 지원 확인

블루투스 통신을 사용하기 전에 디바이스가 블루투스를 지원하는지 확인할 필요가 있다. 디바이스가 블루투스를 지원하는지 확인해보도록 하자


BluetoothService.java

public boolean getDeviceState() {
		Log.d(TAG, "Check the Bluetooth support");
		
		if(btAdapter == null) {
			Log.d(TAG, "Bluetooth is not available");
			
			return false;
			
		} else {
			Log.d(TAG, "Bluetooth is available");
			
			return true;
		}
	}

getDeviceState() 라는 메소드를 만들어서 기기의 블루투스 지원여부를 확인 한다.

BluetoothAdapter가 null일 경우 블루투스 통신을 지원하지 않는 기기이다. (하지만 이러한 기기는 요즘 없을듯..?)


② 블루투스 활성화

getDeviceState()가 true를 반환할 경우 블루투스 활성화를 요청하도록 해보자.

블루투스 활성화 요청을 위해서 enableBluetooth()라는 메소드를 만들었다. 


BluetoothService.java

public void enableBluetooth() {
		Log.i(TAG, "Check the enabled Bluetooth");
		
		
		if(btAdapter.isEnabled()) {		
			// 기기의 블루투스 상태가 On인 경우
			Log.d(TAG, "Bluetooth Enable Now");
			
			// Next Step
		} else {		
			// 기기의 블루투스 상태가 Off인 경우
			Log.d(TAG, "Bluetooth Enable Request");
			
			Intent i = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
			mActivity.startActivityForResult(i, REQUEST_ENABLE_BT);
		}
	}

기기의 블루투스 상태가 On일 경우 다음 단계를 실행하면 되고, 

기기의 블루투스 상태가 Off일 경우 블루투스 활성화를 요청하는 알림창을 띄운다.


알림창에서 확인/취소를 선택할 경우 결과는 MainActivityonActivityResult()메소드로 들어온다. 

그 전에 startActivityForResult의 개념에 대해서 알고 있어야 이해하기 편한데, 이 것은 구글링을 통해서 알아보는것을 추천한다.


알림창의 확인/취소 결과는 MainActivity에 onActivityResult()메소드로 전달되는데 소스를 보면 다음과 같다.


MainActivity.java

public void onActivityResult(int requestCode, int resultCode, Intent data) {
        
        switch (requestCode) {          
        case REQUEST_ENABLE_BT:
            // When the request to enable Bluetooth returns
            if (resultCode == Activity.RESULT_OK) {
                // 확인 눌렀을 때
                //Next Step
            } else {
                // 취소 눌렀을 때
                Log.d(TAG, "Bluetooth is not enabled");
            }
            break;
        }
}


이제 MainActivity에서 버튼을 클릭했을 때 블루투스 활성화를 위한 이벤트 처리만 해주면 된다.


MainActivity.java

@Override
	public void onClick(View v) {
		if(btService.getDeviceState()) {
			// 블루투스가 지원 가능한 기기일 때
			btService.enableBluetooth();
		} else {
			finish();
		}
	}

여기까지 블루투스를 활성화 하는 방법에 대해서 알아보았다.

블루투스가 활성화 되었을 때(resultCode가 Activity.RESULT_OK일때) 기기 검색을 통해 페어링을 시켜주면 되는데, 이 부분은 다음장에 포스팅 하도록 하겠다.


전체 소스는 다음과 같고, 프로젝트를 첨부파일로 올린다.


EX_Bluetooth(1).zip



MainActivity.java

public class MainActivity extends Activity implements OnClickListener {
	// Debugging
	private static final String TAG = "Main";
	
	// Intent request code
	private static final int REQUEST_CONNECT_DEVICE = 1;
	private static final int REQUEST_ENABLE_BT = 2;
	
	// Layout
	private Button btn_Connect;
	private TextView txt_Result;
	
	private BluetoothService btService = null;
	
	
	private final Handler mHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
		}
		
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.e(TAG, "onCreate");
		
		setContentView(R.layout.main);
		
		/** Main Layout **/
		btn_Connect = (Button) findViewById(R.id.btn_connect);
		txt_Result = (TextView) findViewById(R.id.txt_result);
		
		btn_Connect.setOnClickListener(this);
		
		// BluetoothService 클래스 생성
		if(btService == null) {
			btService = new BluetoothService(this, mHandler);
		}
	}

	@Override
	public void onClick(View v) {
		if(btService.getDeviceState()) {
			// 블루투스가 지원 가능한 기기일 때
			btService.enableBluetooth();
		} else {
			finish();
		}
	}
	
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d(TAG, "onActivityResult " + resultCode);
        
        switch (requestCode) {

        case REQUEST_ENABLE_BT:
            // When the request to enable Bluetooth returns
            if (resultCode == Activity.RESULT_OK) {
            	
            } else {

                Log.d(TAG, "Bluetooth is not enabled");
            }
            break;
        }
	}

}


BluetoothService.java

public class BluetoothService {
	// Debugging
	private static final String TAG = "BluetoothService";
	
	// Intent request code
	private static final int REQUEST_CONNECT_DEVICE = 1;
	private static final int REQUEST_ENABLE_BT = 2;
	
	private BluetoothAdapter btAdapter;
	
	private Activity mActivity;
	private Handler mHandler;
	
	// Constructors
	public BluetoothService(Activity ac, Handler h) {
		mActivity = ac;
		mHandler = h;
		
		// BluetoothAdapter 얻기
		btAdapter = BluetoothAdapter.getDefaultAdapter();
	}
	
	/**
	 * Check the Bluetooth support
	 * @return boolean
	 */
	public boolean getDeviceState() {
		Log.i(TAG, "Check the Bluetooth support");
		
		if(btAdapter == null) {
			Log.d(TAG, "Bluetooth is not available");
			
			return false;
			
		} else {
			Log.d(TAG, "Bluetooth is available");
			
			return true;
		}
	}
	
	/**
	 * Check the enabled Bluetooth
	 */
	public void enableBluetooth() {
		Log.i(TAG, "Check the enabled Bluetooth");
		
		
		if(btAdapter.isEnabled()) {		
			// 기기의 블루투스 상태가 On인 경우
			Log.d(TAG, "Bluetooth Enable Now");
			
			// Next Step
		} else {		
			// 기기의 블루투스 상태가 Off인 경우
			Log.d(TAG, "Bluetooth Enable Request");
			
			Intent i = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
			mActivity.startActivityForResult(i, REQUEST_ENABLE_BT);
		}
	}
	
}


다음 글 : 블루투스 기기 검색하기 글 보기



  1. 이전 댓글 더보기
  2. 오류 2014.07.11 15:45 신고

    btn_Connect = (Button) findViewById(R.id.btn_connect);
    txt_Result = (TextView) findViewById(R.id.txt_result);
    여기가 이렇게오류는데 왜 그럴까요 ㅠ,ㅠbtn.connect랑txt_result쪽이 오류가많이나네요
    임포트종류도 많이나와서 어떤걸할지 ㅠ,???

  3. 오류 2014.07.11 15:45 신고

    btn_Connect = (Button) findViewById(R.id.btn_connect);
    txt_Result = (TextView) findViewById(R.id.txt_result);
    여기가 이렇게오류는데 왜 그럴까요 ㅠ,ㅠbtn.connect랑txt_result쪽이 오류가많이나네요
    임포트종류도 많이나와서 어떤걸할지 ㅠ,???

  4. 오류 2014.07.11 15:54 신고

    create field 만들라 그러고 그러는데 어떻게하죵

    • 영상털이범 2014.07.14 08:54 신고

      .. 그 부분은 xml파일이랑 id값을 맞춰주어야 하는 부분인데
      이건 너무 기본적인 부분이라서 제가 직접 설명을 해드리기보다
      책을펴고 기본부터 공부를 하시고 프로젝트를 진행하시는게 맞다고 생각이 듭니다.

  5. 오류 2014.07.14 13:57 신고

    답변 감사드려요 이번에 공부좀 많이 하고 싶어서 그런데 책 추천좀 해주실수 있을까요???

    • 영상털이범 2014.07.14 14:47 신고

      시중에 안드로이드 책이 많이 있기때문에 서점에가서 한번씩 보시고 쉽게 재밌게 나온 책으로 공부하시는 것도 추천하고
      가장 기본적인 책으로는 '안드로이드 프로그래밍 1,2' 를 보시는 것을 추천해 드립니다. 두껍고 총 2권으로 되어있는데 왠만한 내용은 다 들어있기때문에 처음부터 책을 본다는 생각말고 중간에 필요한 내용을 찾아보는 사전처럼 사용하시면 좋을것 같습니다.

  6. 2014.07.31 20:27

    비밀댓글입니다

    • 영상털이범 2014.08.03 19:12 신고

      메일주소는
      dsnight@nate.com 입니다.
      제가 업무상 여유가 될 때 확인하고 도움드리도록 하겠습니다.

  7. 꿈나무 2014.08.01 15:45 신고

    블루투스 플젝을 처음하는데 포스팅이 완전탄탄해서 많은 도움이됐습니다!!

    다름이아니라 블루투스 on/off시에 enableBluetooth()메소드에서 처리를하는데

    이메소드에서 블루투스를 on을했을때 다른기기가 검색할수있는 방법을 찾고있습니다

    현재 BluetoothChat플젝에있는 ensureDiscoverable() 메소드를 참조하고있는데

    블루투스 on/off를 선택하는창 뒤에 미리 떠있더라구요 on/off선택후 기기검색허용 창이 뜨게하고싶은데

    방법이없을까요? 답변부탁드립니다!

    언제나 감사합니다^^

    • 영상털이범 2014.08.03 19:13 신고

      onActivityResult 메소드를 알아보시면
      블루투스 on/off 에서 확인을 클릭했을 경우
      받아오는 이벤트가 있습니다.
      그 부분을 찾아서 on(확인)을 클릭했을 경우
      그 다음동작에 기기검색 메소드를 실행하면 될 것 같습니다.

  8. 꿈나무 2014.08.06 16:53 신고

    지난번 답변 감사했습니다!

    이번엔 Fragment를 이용해서 블루투스를 만드려고하는데

    FragmentActivity에서 다른 Fragment로 이동후 그화면에서

    Fragment-enableBluetooth()메소드를 이용해서 기기활성화는 되는데

    scanDevice()메소드에서 Intent가 말썽입니다.

    Intent() 안에 Activity만 들어가지는지 빨간줄이 없어지질 않아서

    DeviceListActivity를 Fragment클래스로 부르는법 질문드립니다..ㅠ

    여름인데 건강 조심하세요! 감사합니다.

    • 영상털이범 2014.08.06 21:12 신고

      Activity를 상속받은 클래스에서 Intent가 가능할 것 입니다.
      Fragment 클래스로 Context를 넘겨주던지
      핸들러를 사용하여 처리하면 될 것? 같습니다. 지금 떠오르는 생각으로는..
      저 방법이 안되고 정 안되신다면 다시한번 댓글 주시면 적극적으로 해결해 드리겠습니다!

  9. 꿈나무 2014.08.08 10:27 신고

    잘해결했습니다ㅋ바보같이
    <activity
    android:name=".DeviceListActivity"
    android:theme="@android:style/Theme.DeviceDefault.Dialog"/>
    이구문을 빼놓고 구동시키니까 오류가 났었네요..

    다이어로그창이 따로 안뜨고 Activity안에서 검색레이아웃이 뜨게 만드는법 헤딩해보려고 합니다ㅎㅎ

    답글 감사합니다!^^

    • 영상털이범 2014.08.08 16:30 신고

      그 부분은
      android:theme="@android:style/Theme.DeviceDefault.Dialog"
      부분만 지워주시면 다이어로그창이 따로 안뜨고
      하나의 액티비티로 뜨게 됩니다.
      그냥 DeviceListActivity를 통쨰로 옴겨오던지 수정하시면 금방 끝날거 같습니다.

  10. wonmi 2014.08.20 15:42 신고

    이클립스 샘플파일에서 BlueToothChat이 안열립니다........finish버튼이 활성화가 안되요
    (A project with that name already exists in the workspace)라고 메세지가 뜨네요
    도와주세요 ㅠㅠ

    • 영상털이범 2014.08.20 17:23 신고

      이클립스에 같은 이름의 프로젝트가 존재해서 그렇습니다.
      BlueToothChat 이라는 같은 이름의 프로젝트가 존재하기 때문에 안열리는듯 합니다.
      원래 있던 프로젝트의 이름을 변경후에 시도해주세요.

  11. 꿈나무 2014.08.28 16:23 신고

    여름 마지막 더위에 잘지내시는지 모르겠네요ㅋ
    요즘 비콘으로 연동하는법을 찾고있는데 온갖단어로 구글링을 해도 안나오네요..ㅠㅠ
    비콘연동 해보셨는지 궁금합니다!!
    항상 감사합니다!

  12. 사과는금 2014.11.09 22:47 신고

    안드로이드 BluetoothChat 예제 를 해서
    run 해봐도 블루투스 이용 가능 하지 않다고 뜨고
    님이 올려주신 걸로 실행해보아도 이용 가능 하지 않다고 뜨고
    제가 소스보고 따라해봐도 그대론데 어떻게 해야 되나요?ㅠㅠㅠ

  13. 앱을 만들기 시간한 강군 2015.02.25 19:17 신고

    안녕하세요 안드로이드 개발자 강군입니다.
    제가 안드로이드스튜디오로 앱을 개발 중입니다.

    // BluetoothService 클래스 생성
    if(btService == null) {
    btService = new BluetoothService(this, mHandler);
    }
    이부분에 btService = new BluetoothService(this, mHandler); 에러가 발행합니다.
    에러 발생 이유를 보르겠습니다. 블루투스서비스소켓에 대한 안내글이 나오는데 이해가 잘 안되네요.

    추가로 질문이 하나 더있는데
    안드로이드 4.3미만의 버전에서는 블루투스를 이용한 통신을 하려고 합니다.
    4.3이상의 버전과 API가 다르다고 제가 들은거 같은데 위에 작성된 앱은 어떤 버전에서 사용되는 것인가요?
    Bluetooth 4.0 버전, 4.0미만 버전에 대한 통신을 하나의 앱에서 하려고 합니다.
    어떻게 작성해야 할까요?

  14. 2016.04.15 14:15 신고

    포스팅 잘봤습니다~
    따라하고 있는데,
    REQUEST_ENABLE_BT가 빨간 글씨로 뜨는데
    어떻게 해결할 수 있을까요?

  15. 2017.02.13 16:14

    비밀댓글입니다

  16. 끼룩 2017.02.13 17:00 신고

    감사합니다!!!

  17. what 2017.02.23 09:54 신고

    Buetooth 안드로이드 간에 채팅 소스 혹시 올려주실수 있나요?ㅠㅠ

  18. question 2017.03.06 11:13 신고

    이거 연결이 되면 무슨 알람같은게 뜨나요??? 연결 하기 해서 장치 선택했는데 아무 알람이 안떠서.. 된건지 안된건지..

  19. 하정 2017.03.20 00:12 신고

    Error:(21, 28) No resource found that matches the given name (at 'paddingBottom' with value '@dimen/activity_vertical_margin').
    Error:(22, 26) No resource found that matches the given name (at 'paddingLeft' with value '@dimen/activity_horizontal_margin').
    Error:(23, 27) No resource found that matches the given name (at 'paddingRight' with value '@dimen/activity_horizontal_margin').
    Error:(24, 25) No resource found that matches the given name (at 'paddingTop' with value '@dimen/activity_vertical_margin').
    C:\Users\Moi13\AndroidStudioProjects\BluetoothChat2\Application\build\intermediates\res\merged\debug\menu\main.xml
    Error:(21, 28) No resource found that matches the given name (at 'paddingBottom' with value '@dimen/activity_vertical_margin').
    Error:(22, 26) No resource found that matches the given name (at 'paddingLeft' with value '@dimen/activity_horizontal_margin').
    Error:(23, 27) No resource found that matches the given name (at 'paddingRight' with value '@dimen/activity_horizontal_margin').
    Error:(24, 25) No resource found that matches the given name (at 'paddingTop' with value '@dimen/activity_vertical_margin').


    안드로이드 스튜디오의 위 에러는 대체 어떻게 해결해야 할까요 ㅠㅠㅠ

  20. 촠봌 2018.05.26 23:43 신고

    감사합니다.
    덕분에 안되는 부분 해결했어요!!!!!!!!!!!

  21. 화랑 2018.08.06 15:06 신고

    WARNING: Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.

    샘플 프로젝트를 임포트하는 과정에서 위와 같은 에러 일때 전부 implementation으로 바꿔 주었는데 HC-06모듈과 연결이 안되는데 따로 더 수정해야하는것이 있을까요/????

+ Recent posts