그러냐

[android] 안드로이드 블루투스 연결 - bluetooth connect (내용 추가) 본문

android

[android] 안드로이드 블루투스 연결 - bluetooth connect (내용 추가)

관절분리 2016. 1. 28. 10:43
반응형

출처 참 쉽습니까? | 미소
원문 http://blog.naver.com/oh4zzang/40111958220

★ 안드로이드 블루투스 헤드셋 연결 순서 ★

1. AndroidManifest.xml 파일에 퍼미션 지정

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


2. Get BluetoothAdapter

BluetoothAdapter 클래스의 static api 를 통한 default 객체 얻음

    mBtAdapter = BluetoothAdapter.getDefaultAdapter();


3. Discovery

BluetoothAdapter를 통한 디바이스 검색

    mBtAdapter.startDiscovery();

4. Device Broadadcast   

디바이스 검색을 시작 했다면~

바로 바로 디바이스가 검색 되었다는 브로드캐스트가 마구마구 날라온다..

(내가 회사에서만 테스트 해서 그런가??ㅡㅡㅋ)

해당 액션을 잡아주기 위해 간단하게 onCreate()에 ACTION_FOUND에 대해 Receiver를 등록하자~

 

 protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         
         // Register for broadcasts when a device is discovered
         IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
         this.registerReceiver(mReceiver, filter);
         // Register for broadcasts when discovery has finished
         filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
         this.registerReceiver(mReceiver, filter);
        }

 

 

리시버를 등록하였다면 BroadcastReceiver를 통한 디바이스 검색 성공에 대한 구현해 보자

- sample 코드 : bluetoothchat

 private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                                               

                if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
                    mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress());
                   
                }
            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                setProgressBarIndeterminateVisibility(false);
                setTitle(R.string.select_device);
                if (mNewDevicesArrayAdapter.getCount() == 0) {
                    String noDevices = getText(R.string.none_found).toString();
                    mNewDevicesArrayAdapter.add(noDevices);
                }
            }
        }
    };

5. 디바이스 연결

디바이스 연결전에 디바이스 검색을 중지하자~

안드로이드 dev 사이트에 보면 검색 작업은 무지하게 리소스도 마니 먹고 단말을 느리게 하므로

검색이 성공하거나 끝난경우~ cancelDiscovery() 를 호출하라고 한다~

또한 startDiscovery()가 호출중이지 않아도 cancelDiscovery()를 호출할 수 있다. (당연히 아무일도 않일어 나지만^^)

따라서 블루투스 디바이스 연결전에 무조건 cancelDiscovery()를 호출해도 안전하다~~

    mAdapter.cancelDiscovery();

 

검색된 디바이스의 MAC address를 통한 BluetoothDevice 생성

    BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);


안드로이드 Bluetooth 구조에 따라 Rfcomm Socket 을 생성 
UUID 는 Headset과 모듈통신 가능한 UUID 사용

현재는 headset 연결을 위한 headset service uuid 사용. 하지만 대부분 handfree로 안잡히고 spp 만 연결되는듯 합니다.

대략적인 이유는 A2DP 등 handfree쪽은 이미 안드로이드 core 단에서 dialer 를 위해 해당 프로토콜을 선점하고 있어서 겠지요ㅠㅠ

    private static final UUID MY_UUID = UUID.fromString("00001108-0000-1000-8000-00805F9B34FB");
    mmSocket = device.createRfcommSocketToServiceRecord(MY_UUID);


생성된 Socket을 통한 디바이스 연결

    mmSocket.connect();


 

 

uuid 관련한 사항은 아래 포스팅 참조~~

http://blog.naver.com/oh4zzang/40111957130

 

반응형