Подтвердить что ты не робот

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

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

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

Я нашел этот вопрос stackoverflow: Программно подключиться к сопряженному устройству 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, которое доказывает, что это возможно.

4b9b3361

Ответ 1

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

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);

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

Ответ 2

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