19

Wir benötigen unsere Anwendung, um automatisch eine Verbindung zu einem gekoppelten Bluetooth-Gerät herstellen zu können, wenn eine Anwendung über A2DP oder Hands Free Profile gestartet wird.Verbinden mit einem gekoppelten Bluetooth-Gerät von Xamarin auf Android

Wir arbeiten in Xamarin (Monodroid), für Android-Plattform.

Ich habe diese Frage Stackoverflow gefunden: Programmatically connect to paired Bluetooth device

Aber es bezieht sich auf native Wege, dies zu erreichen ist (Antwort von kcoppock sehen). Ich würde gerne wissen, ob es einen Weg gibt, dies über Xamarin zu erreichen. Wir können eine Verbindung zum SPP-Endpunkt herstellen, da es sich um eine RFCOMM-basierte Verbindung handelt, aber wir benötigen diese und die Audioverbindung. Daher suchen wir nach einer Möglichkeit, eine Verbindung mit A2DP herzustellen.

Update 1:

Wir haben versucht, wie dies mit CreateInsecureRfcommSocketToServiceRecord Methode zu verbinden:

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

Nach einem Aufruf in Verbindung, wir werden einen Fehler erhalten:

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

Stapel Trace begi ns mit:

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

Update 2:

By the way, whene wir versuchen, über den native Java-Test-App mit the approach by kcoppock, der Verbindungscode zu verbinden scheint, ohne einen Fehler zu arbeiten, obwohl Das Gerät wird nicht als A2DP-Headset angeschlossen.

Die einzige Programmierweise, die wir gesehen haben, um es zu tun war this Google Play app, was beweist, dass es möglich ist.

+0

Einer der Gründe könnte sein, dass ein anderer Teil Ihres Programms die gleiche Datei offen hält, die die Verbindung (Extraktor) lesen sollte? – SeahawksRdaBest

+0

An der Verbindungsstelle haben wir nur eine SPP-Verbindung über RFComm, aber unsere Hauptaufgabe ist, dass wir das Android-Gerät gleichzeitig über SSP und A2DP verbunden haben.Wenn wir eine Verbindung zu SPP über Code herstellen und manuell über Android-Einstellungen mit A2DP verbinden, funktioniert alles, was beweist, dass wir technisch gesehen zwei Profile gleichzeitig verbinden können. –

+0

Dies könnte ein Bandbreitenproblem sein. Überprüfen Sie die Baudrate Ihres bestimmten Geräts und wie viel Sie Audio streamen. Offensichtlich wird der rfcomm-Kanal fehlschlagen, wenn Sie sich dem Limit nähern. – SeahawksRdaBest

Antwort

-1

Es ist eine native Java-Beispielprogramm und seine analogen in den Xamarin Beispiele an: http://docs.xamarin.com/samples/BluetoothChat/

+0

Das haben wir nur mit SPP gemacht. SPP verbindet und funktioniert gut. Was wir nicht tun können, ist über A2DP zu verbinden, aber wir brauchen das. –

+0

Bitte ändern Sie Ihre Frage, um die zusätzliche Einschränkung hinzuzufügen. Ich bin mir nicht sicher, was das im Verhältnis zu Ihren Anforderungen bedeutet. – Tim

+0

Sorry, Tim, mein Schlechter, ich hätte erwähnen sollen, dass wir nur über SPP und kein anderes Profil verbinden konnten. Wir sind uns sicher, dass das Gerät beides unterstützt, da wir uns manuell verbinden können. –

1

Denken Sie daran, dass Xamarin an native api bindet also keine Sorge, dass etwas „bezieht sich auf einheimische Arten“;) auf die Basierend anwser Sie haben den Code unten geschrieben und getestet. Ich hoffe es hilft dir.

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) 
    { 
    } 
} 

Der folgende Code in z.B. OnCreate Funktion:

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

nur am Tag sah .. aber ich bin sowieso Antwort veröffentlichen - vielleicht ist es noch jemand

0

zu helfen, gehen Sie können die blog post überprüfen. adapter.BondedDevices Die Eigenschaft in diesem Link gibt eine Liste gekoppelter Geräte zurück.