Как программно определить, подключено ли устройство Bluetooth? - PullRequest
75 голосов
/ 17 января 2011

Я понимаю, как получить список сопряженных устройств, но как узнать, подключены ли они?

Это должно быть возможно, так как я вижу их в списке устройств Bluetooth моего телефона, и в нем указано состояние их подключения.

Ответы [ 5 ]

132 голосов
/ 17 января 2011

Добавить разрешение Bluetooth для вашего AndroidManifest,

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

Затем используйте фильтры намерений для прослушивания трансляций ACTION_ACL_CONNECTED, ACTION_ACL_DISCONNECT_REQUESTED и ACTION_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 не позволяет вам ЗАПРОСИТЬ, вместо этого он позволяет прослушивать ИЗМЕНЕНИЯ.
  • Обманчивым решением этой проблемы может быть получение списка всех известных / спаренных устройств ... затем попытка подключения к каждому (чтобы определить, подключены ли вы).
  • Кроме того, у вас может быть фоновая служба, которая наблюдает за API-интерфейсом Bluetooth и записывает состояния устройства на диск, чтобы приложение могло использовать его позже.
22 голосов
/ 16 декабря 2016

В моем случае я только хотел посмотреть, подключена ли гарнитура Bluetooth для приложения 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" />

10 голосов
/ 02 августа 2013

Большое спасибо Skylarsutton за его ответ. Я отправляю это как ответ на его, но поскольку я публикую код, я не могу ответить как комментарий. Я уже проголосовал за его ответ, поэтому не ищу никаких пунктов. Просто платите вперед.

По какой-то причине Android Studio не удалось разрешить BluetoothAdapter.ACTION_ACL_CONNECTED. Возможно, это устарело в Android 4.2.2? Вот модификация его кода. Регистрационный код такой же; Код получателя немного отличается. Я использую это в службе, которая обновляет флаг Bluetooth-соединения, на который ссылаются другие части приложения.

    public void onCreate() {
        //...
        IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED);
        IntentFilter filter2 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
        IntentFilter filter3 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED);
        this.registerReceiver(mReceiver, filter1);
        this.registerReceiver(mReceiver, filter2);
        this.registerReceiver(mReceiver, filter3);
    }

    //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...
    }
};
1 голос
/ 11 сентября 2018

Этот код предназначен для профилей гарнитуры, возможно, он будет работать и для других профилей.Сначала вам нужно предоставить прослушиватель профиля (код Котлина):

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
        }
    }
}

Затем при проверке bluetooth:

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

Требуется немного времени, чтобы вызвать onSeviceConnected.После этого вы можете получить список подключенных гарнитур:

mBluetoothHeadset!!.connectedDevices
0 голосов
/ 05 августа 2018

BluetoothAdapter.getDefaultAdapter().isEnabled -> возвращает true, когда Bluetooth открыт

val audioManager = this.getSystemService(Context.AUDIO_SERVICE) как AudioManager

audioManager.isBluetoothScoOn -> возвращает true, когда устройство подключено

...