Android 는 어떻게 블 루 투 스 짝 짓 기 연결 기능 을 실현 합 니까?

본문 적용 범위
안 드 로 이 드 블 루 투 스 부분 은 매우 복잡 하고 명사 와 기능 도 많이 관련된다.본 고 에서 소개 한 짝 짓 기 연결 방법 은 일반적인 블 루 투 스 이어폰,음향 등에 적용 되 며 블 루 투 스 BLE 을 연결 하거나 블 루 투 스 로 Socket 통신 을 하려 는 것 이 아니다.
먼저 몇 가지 명칭 을 소개 합 니 다.
Profile:
4.567917.블 루 투 스 의 중요 한 특성 중 하 나 는 모든 블 루 투 스 제품 이 모든 블 루 투 스 규범 을 실현 할 필요 가 없다 는 것 이다.블 루 투 스 장치 간 의 호환성 을 쉽게 유지 하기 위해 블 루 투 스 규범 에서 Profile 을 정의 했다.Profile 은 장치 가 연결 이나 응용 을 어떻게 실현 하 는 지 정의 합 니 다.Profile 을 연결 층 이나 응용 층 협 으로 이해 할 수 있 습 니 다.우리 제목 에서 말 하 는 연결 은 사실 각종 Profile 을 연결 하 는 것 이다.아래 에 소 개 된 몇 가 지 는 모두 Android 가 실현 한 Profile 이다A2dp:
4.567917 은 블 루 투 스 스테레오 를 나타 내 는데 블 루 투 스 이어폰 으로 노래 를 듣 는 것 과 관련 이 있 고 다른 Avrcp 오디 오/비디오 원 격 제어 프로필 도 있 습 니 다.노래 를 들 을 때 멈 추고 위아래 노래 를 선택 하 는 데 사 용 됩 니 다Handset、Handfree:
4.567917.전화 와 관련 하여 블 루 투 스 가 전 화 를 받 고 끊 습 니 다기타:
4.567917.btservice 블 루 투 스 기본 작업 에 관 한 디 렉 터 리 는 모든 것 을 시작 합 니 다.hdp 블 루 투 스 의 의료 분야 에 대한 응용;hid:인간 과 컴퓨터 의 인 터 랙 션 인터페이스,블 루 투 스 마우스 키보드 같은 것 이 바로 이것 입 니 다.pbap:전화번호 부 접근 프로 토 콜(전화번호 부 액세스 프로 파일)..준비 하 다.
AndroidManifest.xml 에 필요 한 권한 추가

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
블 루 투 스 를 켜다

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (!mBluetoothAdapter.isEnabled()) {
   Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
   startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
}
등록 방송
블 루 투 스 의 검색,짝 짓 기,연결 상태의 변 화 는 모두 시스템 이 방송 을 통 해 보 내 는 것 이기 때문에 이 방송 들 을 등록 하여 상태의 변 화 를 가 져 와 야 한다.

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
intentFilter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
intentFilter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
registerReceiver(mReceiver, intentFilter);
수색 하 다.
짝 을 이 룬 장 치 를 가 져 옵 니 다.이전에 짝 짓 기 에 성공 한 장치 에 대해 시스템 은 그 정 보 를 로 컬 에 저장 할 것 이다.다시 검색 을 호출 할 때 시스템 은 이 장 치 를 다시 발견 하지 못 할 것 이다.

Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
검색 장치

mBluetoothAdapter.startDiscovery();
시스템 이 새로운 블 루 투 스 장 치 를 발견 하면 방송 을 통 해 이 장치 의 정 보 를 보 낼 것 이다.그래서 저희 가 액 션 을 캡 처 해서 Bluetooth Device.ACTIONFOUND 의 Intent,그리고 장치 정 보 를 얻 습 니 다.

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
짝 을 짓다
중점 이 왔 습 니 다.일련의 준비 작업 을 했 습 니 다.BluetoothDevice 를 받 으 면 바로 연결 을 시작 할 것 입 니 다.하지만 구덩이 가 있 는 곳 도 여기에 있다.우선 블 루 투 스 장 비 는 성공 적 으로 맞 춘 다음 에 서로 다른 Profile 을 연결 해 야 한다.만약 에 직접 연결 하 는 기종 도 연결 할 수 있 지만 대부분 반응 이 없다.그 다음 에 Android 4.4 API 19 이상 이 짝 짓 기 인 터 페 이 스 를 열 었 고 이전 시스템 에 대해 우 리 는 반사 적 인 방식 으로 인 터 페 이 스 를 얻 을 수 밖 에 없 었 다.
짝 을 짓다

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    //Android 4.4 API 19      Bond  
    device.createBond();
} else {
    //API 19        Bond  
    try {
        device.getClass().getMethod("connect").invoke(device);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
짝 짓 기 성공 하면 라디오 블 루 투 스 장치.ACTIONBOND_STATE_CHANGED

//        
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);
//              
if (item != null && bondState == BluetoothDevice.BOND_BONDED) {
    connectDevice(item);
}
짝 짓 기 상태

    public static final int BOND_NONE = 10;
    public static final int BOND_BONDING = 11;
    public static final int BOND_BONDED = 12;
잇닿다
짝 짓 기(바 인 딩)와 연결 은 두 가지 서로 다른 과정 이다.짝 짓 기 는 두 장치 가 상대방 의 존 재 를 발견 하고 상대방 의 이름,주소 등 정 보 를 얻 을 수 있 으 며 연결 을 만 들 수 있 는 능력 이 있다 는 것 을 말한다.연결 이란 두 장치 가 하나의 RFCOMM 채널 을 공유 하여 데이터 교환 을 할 수 있 는 능력 을 말한다.연결 이 되 어 있 는 지 확인 해 야 연결 을 시작 할 수 있 습 니 다.연결 은 이 블 루 투 스 장치 가 지원 하 는 Profile 을 연결 하 는 것 입 니 다.
블 루 투 스 연결 을 설정 하 는 과정 을 살 펴 볼 수 있 습 니 다.먼저 짝 짓 기 를 시작 하고 짝 짓 기 에 성공 한 후에 야 지원 하 는 Profile 을 연결 하 는 것 입 니 다.이 단계 도 비교적 구덩이 가 있 는 곳 으로 인터넷 에 서 는 이 부분 에 대한 상세 한 설명 이 없다.나 도 Setting 의 소스 코드 에서 한참 을 뒤 져 서 야 이 논 리 를 찾 았 다.그러나 시스템 응용 은 직접 연결 방법 을 호출 할 수 있 지만 개방 적 이지 않다.
우선 우 리 는 Profile 을 미리 가 져 와 야 한다.여기 서 A2dp 를 예 로 들 면 다른 원 리 는 같다.

        mBluetoothAdapter.getProfileProxy(this, new BluetoothProfile.ServiceListener() {
            @Override
            public void onServiceConnected(int profile, BluetoothProfile proxy) {
                if (mA2dpService == null) {
                    mA2dpService = (BluetoothA2dp) proxy;
                }
            }

            @Override
            public void onServiceDisconnected(int profile) {
            }
        }, BluetoothProfile.A2DP);
우리 가 짝 짓 기 에 성공 한 방송 을 받 거나 장치 가 짝 짓 기 에 성공 했다 는 것 을 확인 한 후에 우 리 는 Profile 의 connect 방법 으로 연결 해 야 한다.하지만 이 방법 은 구 글 이@hide 에 게 주 었 습 니 다.위 처럼 반사 로...

    try {
        mA2dpService.getClass().getMethod("connect", BluetoothDevice.class)
                .invoke(mA2dpService, item.getDevice());
    } catch (Exception e) {
        e.printStackTrace();
    }
연결 성공 시스템 은 라디오 BluetoothA2dp.ACTION 을 보 냅 니 다.CONNECTION_STATE_CHANGED

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
int profileState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, BluetoothProfile.STATE_DISCONNECTED);
연 결 된 몇 가지 상태

    /** The profile is in disconnected state */
    public static final int STATE_DISCONNECTED  = 0;
    /** The profile is in connecting state */
    public static final int STATE_CONNECTING    = 1;
    /** The profile is in connected state */
    public static final int STATE_CONNECTED     = 2;
    /** The profile is in disconnecting state */
    public static final int STATE_DISCONNECTING = 3;
울퉁불퉁 하 다
하하,연결 되면 끝 날 것 같 아?!이 안에 또 몇 개의 구덩이 가 있 으 니 내 가 너 에 게 말 해 줄 게.
Profile 을 닫 는 것 을 잊 지 마 세 요.우 리 는 연결 을 위해 프로필 을 가 져 왔 잖 아 요.연결 이 끝 난 후에 반드시 그 를 닫 아야 해 요.계속 닫 지 않 으 면 오류 가 발생 할 수 있어 요.

mBluetoothAdapter.closeProfileProxy(BluetoothProfile.A2DP, mA2dpService);
mA2dpService = null;
블 루 투 스 연결 이 성공 하면 시스템 은 휴대 전화 상태 가 바 뀌 었 다 는 것 을 알 리 고 가로 세로 화면 을 전환 한 것 처럼 이 Activity 의 생명 주 기 를 다시 호출 해 야 한다.당시 에 나 는 내 가 연결 에 성공 하면 나의 인터페이스 가 초기 상태 로 반 짝 이 는 것 을 발견 했다.한참 동안 궁 금 했 습 니 다.그리고 저 는 반사 연결 로 프로그램 이 이상 하 게 재 개 된 줄 알 았 습 니 다.몇 번 더 듬 어 보 니 안 드 로 이 드:configChanges 를 설정 하지 않 았 기 때 문 입 니 다.

android:configChanges="keyboard|keyboardHidden|navigation"
사실 앞의 두 가지 속성 은 저도 생각 했 습 니 다.유독 마지막 으로 공식 문서 에 쓴 This should never normally happen.저 는 순진 하 게 믿 고 시도 하지 않 았 습 니 다.마지막 으로 정말 방법 이 없 었 다.모든 속성 을 적어 놓 고 하나씩 줄 였 는데 결국 이 세 가지 가 하나 도 없어 서 는 안 된다 는 것 을 발견 했다.
값.
설명 하 다.
"keyboard"
키보드 유형 에 변화 가 생 겼 다.예 를 들 어 사용자 가 외부 키 보드 를 삽입 했다.
"keyboardHidden"
키보드 무장 애 기능 에 변화 가 생 겼 다.예 를 들 어 사용자 가 하드웨어 키 보드 를 보 여 주 었 다.
"navigation"
내 비게 이 션 유형(궤적 구/방향 키)이 바 뀌 었 습 니 다.(이런 상황 은 통상 영원히 발생 하지 않 는 다.)
이상 은 안 드 로 이 드 가 블 루 투 스 연결 기능 을 어떻게 실현 하 는 지 에 대한 상세 한 내용 입 니 다.안 드 로 이 드 블 루 투 스 연결 기능 에 관 한 자 료 는 다른 관련 글 에 주목 하 세 요!

좋은 웹페이지 즐겨찾기