[android] Bluetooth 장치가 연결되어 있는지 프로그래밍 방식으로 확인하는 방법은 무엇입니까?

페어링 된 장치 목록을 얻는 방법을 알고 있지만 연결되었는지 어떻게 알 수 있습니까?

내 휴대폰의 블루투스 장치 목록에 나열되고 연결 상태가 표시되므로 가능해야합니다.



답변

AndroidManifest에 블루투스 권한 추가,

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

그런 다음을 듣고 텐트 필터를 사용 ACTION_ACL_CONNECTED, ACTION_ACL_DISCONNECT_REQUESTEDACTION_ACL_DISCONNECTED방송 :

public void onCreate() {
    ...
    IntentFilter filter = new IntentFilter();
    filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
    filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
    filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
    this.registerReceiver(mReceiver, filter);
}

//The BroadcastReceiver that listens for bluetooth broadcasts
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
           ... //Device found
        }
        else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
           ... //Device is now connected
        }
        else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
           ... //Done searching
        }
        else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
           ... //Device is about to disconnect
        }
        else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
           ... //Device has disconnected
        }
    }
};

몇 가지 참고 :

  • 응용 프로그램 시작시 연결된 장치 목록을 검색 할 수있는 방법이 없습니다. Bluetooth API는 QUERY를 허용하지 않고 대신 변경 사항을 수신 할 수 있습니다.
  • 위의 문제를 해결하는 방법은 알려진 / 페어링 된 모든 장치 목록을 검색 한 다음 각 장치에 연결을 시도하는 것입니다 (연결되어 있는지 확인하기 위해).
  • 또는 백그라운드 서비스에서 Bluetooth API를 감시하고 나중에 응용 프로그램에서 사용할 수 있도록 장치 상태를 디스크에 쓸 수 있습니다.


답변

제 사용 사례에서는 블루투스 헤드셋이 VoIP 앱에 연결되어 있는지 확인하고 싶었습니다. 다음 솔루션이 저에게 효과적이었습니다.

public static boolean isBluetoothHeadsetConnected() {
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()
            && mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED;
}

물론 Bluetooth 권한이 필요합니다.

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


답변

그의 답변에 대해 Skylarsutton에게 큰 감사를 표합니다. 나는 그의 답변으로 이것을 게시하고 있지만 나는 코드를 게시하고 있기 때문에 나는 댓글로 답할 수 없다. 나는 이미 그의 대답을 찬성했기 때문에 어떤 점도 찾고 있지 않습니다. 앞으로 지불하십시오.

어떤 이유로 BluetoothAdapter.ACTION_ACL_CONNECTED는 Android Studio에서 확인할 수 없습니다. Android 4.2.2에서 더 이상 사용되지 않았을까요? 다음은 그의 코드를 수정 한 것입니다. 등록 코드는 동일합니다. 수신자 코드가 약간 다릅니다. 앱의 다른 부분이 참조하는 Bluetooth 연결 플래그를 업데이트하는 서비스에서 이것을 사용합니다.

    public void onCreate() {
        //...
        IntentFilter filter = new IntentFilter();
        filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
        filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
        filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
        this.registerReceiver(BTReceiver, filter);
    }

    //The BroadcastReceiver that listens for bluetooth broadcasts
    private final BroadcastReceiver BTReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
            //Do something if connected
            Toast.makeText(getApplicationContext(), "BT Connected", Toast.LENGTH_SHORT).show();
        }
        else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
            //Do something if disconnected
            Toast.makeText(getApplicationContext(), "BT Disconnected", Toast.LENGTH_SHORT).show();
        }
        //else if...
    }
};


답변

는, isConnected의 BluetoothDevice 시스템 API의 기능에 https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothDevice.java

제한된 (페어링 된) 장치가 현재 연결되어 있는지 알고 싶다면 다음 기능이 잘 작동합니다.

public static boolean isConnected(BluetoothDevice device) {
    try {
        Method m = device.getClass().getMethod("isConnected", (Class[]) null);
        boolean connected = (boolean) m.invoke(device, (Object[]) null);
        return connected;
    } catch (Exception e) {
        throw new IllegalStateException(e);
    }
}


답변

이 코드는 헤드셋 프로필 용이며 다른 프로필에서도 작동 할 것입니다. 먼저 프로필 리스너 (Kotlin 코드)를 제공해야합니다.

private val mProfileListener = object : BluetoothProfile.ServiceListener {
    override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
        if (profile == BluetoothProfile.HEADSET)
            mBluetoothHeadset = proxy as BluetoothHeadset
    }

    override fun onServiceDisconnected(profile: Int) {
        if (profile == BluetoothProfile.HEADSET) {
            mBluetoothHeadset = null
        }
    }
}

그런 다음 블루투스를 확인하는 동안 :

mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET)
if (!mBluetoothAdapter.isEnabled) {
    return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
}

onSeviceConnected가 호출 될 때까지 약간의 시간이 걸립니다. 그 후에 다음에서 연결된 헤드셋 장치 목록을 얻을 수 있습니다.

mBluetoothHeadset!!.connectedDevices


답변

BluetoothAdapter.getDefaultAdapter().isEnabled -> 블루투스가 열려있을 때 true를 반환합니다.

val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as
AudioManager

audioManager.isBluetoothScoOn -> 장치가 연결되면 true를 반환합니다.


답변

연결 이벤트를 수신하지 않고 장치의 연결 상태를 가져 오는 방법을 찾고있었습니다. 나를 위해 일한 것은 다음과 같습니다.

BluetoothManager bm = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
List<BluetoothDevice> devices = bm.getConnectedDevices(BluetoothGatt.GATT);
int status = -1;

for (BluetoothDevice device : devices) {
  status = bm.getConnectionState(device, BLuetoothGatt.GATT);
  // compare status to:
  //   BluetoothProfile.STATE_CONNECTED
  //   BluetoothProfile.STATE_CONNECTING
  //   BluetoothProfile.STATE_DISCONNECTED
  //   BluetoothProfile.STATE_DISCONNECTING
}