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

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

Мы работаем в Xamarin (монодроид) для платформы Android.

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

Но это относится к собственным способам достижения этого (см. Ответ kcoppock). Я хотел бы знать, есть ли способ добиться этого с помощью Xamarin. Мы можем подключиться к конечной точке SPP, поскольку это соединение на основе RFCOMM, но нам нужно это и аудио соединение, поэтому мы ищем способ подключения к A2DP.

Обновление 1:

Мы пробовали подключиться, используя метод CreateInsecureRfcommSocketToServiceRecord следующим образом:

mmSocket = device.CreateInsecureRfcommSocketToServiceRecord(0000110A-0000-1000-8000-00805F9B34FB); mmSocket.Connect();

При звонке в Connect мы получаем ошибку:

read failed, socket might closed or timeout, read ret: -1

Трассировка стека начинается с:

Java.IO.IOException at Android.Runtime.JNIEnv.CallVoidMethod (IntPtr jobject, IntPtr jmethod) [0x00062] in /Users/buil…

Обновление 2:

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

Мы видели только один программный способ сделать это: это приложение Google Play, что доказывает, что это возможно.


person Maxim V. Pavlov    schedule 13.02.2014    source источник
comment
Одна из причин может заключаться в том, что другая часть вашей программы держит открытым тот же файл, который соединение (экстрактор) должно было считать?   -  person SeahawksRdaBest    schedule 14.03.2014
comment
В точке подключения у нас есть только SPP-соединение через RFComm, я думаю, но наша основная задача состоит в том, чтобы у нас было устройство Android, подключенное через SSP и A2DP одновременно. Если мы подключаемся к SPP из кода и подключаемся к A2DP вручную через настройки Android, все работает, так что это доказывает, что технически мы можем подключить два профиля одновременно.   -  person Maxim V. Pavlov    schedule 14.03.2014
comment
Это может быть проблема с пропускной способностью. Проверьте скорость передачи вашего конкретного устройства и объем потокового аудио. Очевидно, что если вы приближаетесь к пределу, канал rfcomm выйдет из строя.   -  person SeahawksRdaBest    schedule 14.03.2014


Ответы (3)


Помните, что Xamarin привязывается к нативному API, поэтому не беспокойтесь, что что-то «относится к нативным способам»;) Основываясь на указанном вами ответе, я написал и протестировал приведенный ниже код. Надеюсь, это вам поможет.

class btListener : Java.Lang.Object, IBluetoothProfileServiceListener
{
    public void OnServiceConnected([GeneratedEnum] ProfileType profile, IBluetoothProfile proxy)
    {
        String deviceName = "JABRA WAVE+";

        BluetoothDevice result = null;

        var devices = BluetoothAdapter.DefaultAdapter.BondedDevices;
        if (devices != null)
        {
            foreach (BluetoothDevice device in devices)
            {
                if (deviceName == device.Name)
                {
                    result = device;
                    break;
                }
            }
        }
        var connect = Java.Lang.Class.FromType(typeof(BluetoothA2dp)).GetDeclaredMethod("connect", Java.Lang.Class.FromType(typeof(BluetoothDevice)));
        connect.Invoke((Java.Lang.Object)proxy, result);
    }

    public void OnServiceDisconnected([GeneratedEnum] ProfileType profile)
    {
    }
}

Следующий код, например, Функция OnCreate:

btListener btReceiver = new btListener();
BluetoothAdapter.DefaultAdapter.GetProfileProxy(this, btReceiver, ProfileType.A2dp);

Только посмотрел на дату .. но все равно отправляю ответ - может, еще кому-то поможет

person flota113    schedule 04.04.2016
comment
Любопытно, похоже, что метод connect не предназначен для использования в приложениях. Есть ли другой способ сделать это? - person Tyler Hartwig; 07.04.2020

Вы можете проверить это в блоге. adapter.BondedDevices в этой ссылке вернет список сопряженных устройств.

person Sreeraj    schedule 05.04.2016

Пример программы на Java и ее аналог в примерах Xamarin можно найти по адресу: http://docs.xamarin.com/samples/BluetoothChat/

person Tim    schedule 14.02.2014
comment
Мы сделали это только с SPP. SPP коннектится и работает нормально. Чего мы не можем сделать, так это подключиться через A2DP, но он нам нужен. - person Maxim V. Pavlov; 14.02.2014
comment
Пожалуйста, измените свой вопрос, чтобы добавить дополнительное ограничение. я не уверен, что это значит относительно ваших требований. - person Tim; 14.02.2014
comment
Извини, Тим, мое плохое, я должен был упомянуть, что мы могли подключиться только через SPP и никакой другой профиль. Мы уверены, что устройство поддерживает оба варианта, так как мы можем подключиться вручную. - person Maxim V. Pavlov; 14.02.2014