Программно подключаться к сопряженному устройству Bluetooth

Есть ли способ, с помощью Android SDK, программно подключиться к уже сопряженному Bluetooth-устройству?

Другими словами: я могу войти в Настройки → Беспроводные сети → Настройки Bluetooth и коснуться устройства (в списке "Сопряжен, но не подключен" ), после чего он будет подключаться. Я хотел бы иметь возможность делать это программно, но не вижу способа сделать это.

Я вижу параметры для создания сокета RFCOMM, а для устройства SPP я предполагаю, что будет делать и часть соединения, но для устройства A2DP, где фактическая передача данных будет обрабатываться ОС а не моим приложением, я думаю, что это не применимо?

Ответ 1

Хорошо, так как это сводило меня с ума, я немного поработал в исходном коде, и я нашел 100% -ный (по крайней мере, на моем Nexus 4, Android 4.3) решение для подключения к парному A2DP-устройству (например, в качестве гарнитуры или аудиоустройства Bluetooth). Я опубликовал полностью рабочий образец проекта (легко созданный с помощью Android Studio), который вы можете найти здесь, в Github.

По существу, вам нужно сделать следующее:

  • Получить экземпляр BluetoothAdapter
  • Используя этот экземпляр, получите прокси профиля для A2DP:

adapter.getProfileProxy (context, listener, BluetoothProfile.A2DP);

где listener - это ServiceListener, который получит BluetoothProfile в своем обратном вызове onServiceConnected() (который может быть передан экземпляру BluetoothA2dp)

  • Использовать отражение для получения метода connect(BluetoothDevice) для прокси-сервера:

Method connect = BluetoothA2dp.class.getDeclaredMethod("connect", BluetoothDevice.class);

  • Найдите BluetoothDevice:

String deviceName = "My_Device_Name";

BluetoothDevice result = null;

Set<BluetoothDevice> devices = adapter.getBondedDevices();
if (devices != null) {
    for (BluetoothDevice device : devices) {
        if (deviceName.equals(device.getName())) {
            result = device;
            break;
        }
    }
}

  • И вызовите метод connect():

connect.invoke(proxy, result);

Который, по крайней мере для меня, вызвал немедленное соединение устройства.

Ответ 2

Лучший способ найти мою проблему - выяснить, что я могу создать кнопку, которая отображает экран настроек Bluetooth. Я не понимал, что вы могли бы это сделать, или я бы с самого начала.

startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));

Ответ 3

если устройство уже сопряжено, вы можете использовать

if(device.getBondState()==device.BOND_BONDED){

        Log.d(TAG,device.getName());
        //BluetoothSocket mSocket=null;
        try {


            mSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            Log.d(TAG,"socket not created");
            e1.printStackTrace();
        }
        try{

            mSocket.connect();

        }
        catch(IOException e){
            try {

                mSocket.close();
                Log.d(TAG,"Cannot connect");
            } catch (IOException e1) {
                Log.d(TAG,"Socket not closed");
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }


        }

для использования MY_UUID

private static final UUID MY_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");

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

Ответ 4

Я использовал код здесь как отправную точку для этой функции в своем приложении: http://developer.android.com/guide/topics/wireless/bluetooth.html#ConnectingDevices

Как только устройство сопряжено, приложение не имеет проблем с подключением обоих устройств вместе.