it-swarm.com.de

So programmieren Sie ein Bluetooth-Gerät unter Android programmatisch

Für meine Anwendung versuche ich, ein Bluetooth-Gerät programmatisch zu koppeln. Ich kann den Verbindungsdialog für das Gerät anzeigen, das ich verbinden möchte, und ich kann einen PIN-Code eingeben. Wenn ich "Pair" drücke, wird der Dialog entfernt und nichts passiert.

Ich muss nur Geräte mit Android 2.0 und neuer unterstützen.

Derzeit verwende ich den folgenden Code, um den Pairing-Vorgang zu starten:


public void pairDevice(BluetoothDevice device) {
        String ACTION_PAIRING_REQUEST = "Android.bluetooth.device.action.PAIRING_REQUEST";
        Intent intent = new Intent(ACTION_PAIRING_REQUEST);
        String EXTRA_DEVICE = "Android.bluetooth.device.extra.DEVICE";
        intent.putExtra(EXTRA_DEVICE, device);
        String EXTRA_PAIRING_VARIANT = "Android.bluetooth.device.extra.PAIRING_VARIANT";
        int PAIRING_VARIANT_PIN = 0;
        intent.putExtra(EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PIN);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

Bevor ich eine Pairing-Anfrage starte, stoppe ich die Suche nach neuen Geräten.

Meine Anwendung verfügt über die folgenden Bluetooth-Berechtigungen:

  • Android.permission.BLUETOOTH_ADMIN
  • Android.permission.BLUETOOTH
17
FireFly

Es ist mir gelungen, über eine App, die als Dienst fungiert und die das Vorhandensein eines bestimmten Gerätetyps und einer geänderten Version der Einstellungs-App überprüft, automatisch einen Pairing-Vorgang für Geräte mit Tastaturfunktion anzufordern.

Ich muss sagen, dass ich auf einem benutzerdefinierten Gerät gearbeitet habe, auf dem Android 4.0.3 ohne externe Steuerelemente ausgeführt wurde (keine Zurück/Startseite/Bestätigungstasten): Das Pairing eines Controllers beim Booten wurde ohne Interaktion abgeschlossen, bis PIN Anfrage war obligatorisch.

Zuerst habe ich einen Dienst erstellt, der beim Booten eine Aktivität startet (mit Android.intent.action.BOOT_COMPLETED und Android.permission.RECEIVE_BOOT_COMPLETED)), der regelmäßig das Vorhandensein eines Geräts der Klasse 1344 (eine Tastatur, die einzige Möglichkeit, Daten auf Anfrage einzugeben) auf dem onReceive-Rückruf überprüft :

public void onReceive(Context context, Intent intent) 
...
    BluetoothDevice dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
...
if(dev.getBluetoothClass().getDeviceClass() == 1344){...}

Nach dem Filtern wähle ich die erste verfügbare Tastatur und übergebe die BT-Adresse an die Einstellungen-App:

Intent btSettingsIntent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
btSettingsIntent.putExtra("btcontroller", dev.getAddress());
startActivityForResult(btSettingsIntent, 1);

Der schwierige Teil war die Suche nach der besten Position, um den Pairing-Prozess aufzurufen. Verwenden Sie nur die

intent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PIN);

führte mich zu einem Pärdendialog, der mich nach dem Schließen mit dem gekoppelten Gerät zurückließ, aber unbrauchbar wurde.

Ich grabe mich in die Klassen von com.Android.settings.Bluetooth ein und fand meinen Weg durch die

createDevicePreference(CachedBluetoothDevice cachedDevice) 

in der DeviceListPreferenceFragment.

Von dort aus habe ich meine zuvor ausgewählte BT-Adresse mit den verfügbaren verglichen und nach erfolgreicher Übereinstimmung einen Anruf getätigt

cachedDevice.startPairing();

Ich weiß, es ist schwierig und erfordert Zugriff auf den Quellcode Android, aber in einer benutzerdefinierten Umgebung funktioniert es.

Ich hoffe das könnte hilfreich sein.

10
DvD

Es ist meine Antwort:

in onCreate () schreibe dies:

    registerReceiver(incomingPairRequestReceiver, new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST));

erstellen Sie dann eine Variable

private final BroadcastReceiver incomingPairRequestReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action)) {
            BluetoothDevice dev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            //pair from device: dev.getName()
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
                dev.setPairingConfirmation(true);
                //successfull pairing
            } else {
                //impossible to automatically perform pairing,
                //your Android version is below KitKat
            }
        }
    }
};
4
Nikytee

Leider denke ich, dass das Beste, was Sie erhalten werden, das Öffnen von Einstellungen/Drahtlos & Netzwerke/Bluetooth-Einstellungen für den Benutzer wie folgt ist:

    Intent intent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
    startActivityForResult(intent, REQUEST_PAIR_DEVICE);
4
sky-dev

Mit Reflektion können Sie die Methode createBond aus der BluetoothDevice-Klasse aufrufen.

Siehe diesen Beitrag: Wie kann man ein gekoppeltes Bluetooth-Gerät programmgesteuert auf Android lösen oder löschen?

Es gibt auch eine Lösung für Unpaare.

3
Derzu

Reflexion ist DODGY, verschiedene Hersteller können diese zugrundeliegenden Methoden nach Belieben ändern! Ich habe hier auf unseren 10 Geräten viele verschiedene Apps getestet, und diese Reflexionsmethode funktioniert nur bei etwa 75% der Geräte. Wenn Sie möchten, dass eine App, die für alle Benutzer geeignet ist, sehr vorsichtig ist, verwenden Sie Reflection. Testen Sie Ihre App mit Cloud-Tests auf über 100 Geräten und überprüfen Sie die Fehlerrate.

In diesem Fall ist eine Überlegung seit API 19 (KitKat 4.4) nicht erforderlich.

BluetoothDevice hat die neue Methode CreateBond.

 private void pairDevice(BluetoothDevice device) {

            device.createBond();
    }

developer.Android.com/reference/Android/bluetooth/BluetoothDevice.html

2
aiden_fry

Möglicherweise müssen SieActivityForResult anstelle von nur StartActivity starten?

Eine weitere Option besteht darin, das BluetoothChat-Anwendungsbeispiel anzusehen und eine RFComm-Verbindungsbuchse zu starten. Sobald Sie die Steckdose starten, wird automatisch eine Verbindungsanfrage angezeigt, ohne dass eine separate Absicht für das Pairing gesendet werden muss. Auf diese Weise müssen Sie kein Pairing durchführen.

http://developer.Android.com/resources/samples/BluetoothChat/index.html

0
Rahul Choudhary

Ich verwende diese Klasse, um eine Verbindung zwischen meinem Client-Smartphone und dem Servergerät herzustellen:

private class ConnectThread extends Thread
{
    private final BluetoothSocket mmSocket;

    private final UUID WELL_KNOWN_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");

    public ConnectThread(BluetoothDevice device)
    {
        // Use a temporary object that is later assigned to mmSocket,because
        // mmSocket is final
        BluetoothSocket tmp = null;

        // Get a BluetoothSocket to connect with the given BluetoothDevice
        try
        {
            tmp = device.createRfcommSocketToServiceRecord(WELL_KNOWN_UUID);
            //This is the trick
            Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
            tmp = (BluetoothSocket) m.invoke(device, 1);
        } catch (Exception e)
        {
            e.printStackTrace();
        }

        mmSocket = tmp;
    }

    public void run()
    {
        DebugLog.i(TAG, "Trying to connect...");
        // Cancel discovery because it will slow down the connection
        mBluetoothAdapter.cancelDiscovery();

        try
        {
            // Connect the device through the socket. This will block
            // until it succeeds or throws an exception
            mmSocket.connect();
            DebugLog.i(TAG, "Connection stablished");
        } catch (IOException connectException)
        {
            // Unable to connect; close the socket and get out
            DebugLog.e(TAG, "Fail to connect!", connectException);
            try
            {
                mmSocket.close();
            } catch (IOException closeException)
            {
                DebugLog.e(TAG, "Fail to close connection", closeException);
            }
            return;
        }
    }

    /** Will cancel an in-progress connection, and close the socket */
    public void cancel()
    {
        try
        {
            mmSocket.close();
        } catch (IOException e)
        {
        }
    }
}

Rufen Sie zunächst das BluetoothDevice -Objekt auf, zu dem Sie eine Verbindung herstellen möchten (koppelte Geräte auflisten oder Geräte ermitteln). Dann mach:

ConnectThread ct = new ConnectThread(device);
ct.start();

Da connect () ein blockierender Aufruf ist, sollte diese Verbindungsprozedur immer in einem vom Hauptaktivitätsthread getrennten Thread ausgeführt werden. Siehe Android-Entwickler für detailliertere Informationen.

0
DragonT