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

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

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

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

4 ответа

Хорошо, так как это сводило меня с ума, я немного покопался в исходном коде и нашел 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);

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

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

startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));

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

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. Я надеюсь, что это сработает.

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

После сопряжения устройства у приложения не возникает проблем с программным соединением двух устройств.

Другие вопросы по тегам