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

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

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

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

Ответы [ 4 ]

47 голосов
/ 23 августа 2013

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

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

4 голосов
/ 29 августа 2011

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

startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
3 голосов
/ 10 сентября 2012

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

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

0 голосов
/ 02 марта 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...