it-swarm.com.de

Programmgesteuert mit einem gekoppelten Bluetooth-Gerät verbinden

Gibt es eine Möglichkeit, mithilfe des Android SDK eine programmgesteuerte Verbindung zu einem bereits gekoppelten Bluetooth-Gerät herzustellen?

Mit anderen Worten: Ich kann in Einstellungen -> Drahtlos und Netzwerke -> Bluetooth-Einstellungen gehen und auf das Gerät tippen (aufgeführt als "Gepaart, aber nicht verbunden"). Dann wird eine Verbindung hergestellt. Ich möchte dies gerne programmgesteuert machen, sehe aber keine Möglichkeit, dies zu tun.

Ich sehe die Optionen zum Erstellen eines RFCOMM-Sockets, und für ein SPP-Gerät gehe ich davon aus, dass dies auch den Verbindungsteil übernimmt, aber für ein A2DP-Gerät, bei dem die eigentliche Datenübertragung vom Betriebssystem und nicht von verwaltet wird meine app finde ich nicht anwendbar?

44
rmc47

Okay, da mich das verrückt gemacht hat, habe ich mich ein bisschen mit dem Quellcode beschäftigt und eine 100% zuverlässige (zumindest auf meinem Nexus 4, Android 4.3) Lösung gefunden, um eine Verbindung zu einem gepaarten A2DP herzustellen Gerät (z. B. ein Headset oder ein Bluetooth-Audiogerät). Ich habe ein voll funktionsfähiges Beispielprojekt veröffentlicht (einfach mit Android Studio zu erstellen), das Sie hier auf Github finden .

Im Wesentlichen müssen Sie Folgendes tun:

  • Instanz von BluetoothAdapter abrufen
  • Erhalten Sie mit dieser Instanz einen Profil-Proxy für A2DP:

adapter.getProfileProxy (context, listener, BluetoothProfile.A2DP);

wobei listener eine ServiceListener ist, die in ihrem onServiceConnected()-Rückruf eine BluetoothProfile -Instanz erhält (die in eine BluetoothA2dp -Instanz umgewandelt werden kann)

  • Verwenden Sie Reflection, um die Methode connect(BluetoothDevice) auf dem Proxy abzurufen:

Method connect = BluetoothA2dp.class.getDeclaredMethod("connect", BluetoothDevice.class);

  • Finden Sie Ihr 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;
        }
    }
}

  • Und rufen Sie die Methode connect() auf:

connect.invoke(proxy, result);

Was zumindest für mich einen sofortigen Anschluss des Gerätes bewirkte.

44
kcoppock

der beste Weg, mein Problem zu lösen, bestand darin, herauszufinden, dass ich eine Schaltfläche erstellen kann, die den Bildschirm Bluetooth-Einstellungen anzeigt. Ich wusste nicht, dass Sie das tun könnten, oder ich hätte es von Anfang an getan. 

startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
6
Belboz

wenn das Gerät bereits gekoppelt ist, können Sie verwenden 

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


        }

für die MY_UUID verwenden

private static final UUID MY_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");

das obige Code-Snippet dient nur dazu, Ihr Gerät an ein A2DP-unterstütztes Gerät anzuschließen. Ich hoffe, es wird funktionieren.

3
nam_ph

Ich habe den Code hier als Ausgangspunkt für diese Funktionalität in meiner App verwendet: http://developer.Android.com/guide/topics/wireless/bluetooth.html#ConnectingDevices

Sobald das Gerät gekoppelt ist, hat die App keine Probleme, die beiden Geräte programmgesteuert miteinander zu verbinden.

0
Marc Bernstein