it-swarm.com.de

So koppeln Sie ein Bluetooth-Gerät programmgesteuert Android

Ich entwickle eine Anwendung, bei der ich eine Verbindung zu einem Bluetooth-Gerät herstellen möchte. Das Hauptproblem ist, dass der Benutzer die erforderliche PIN nicht eingeben muss. Die Anwendung sollte dies selbst tun. Ich habe kein verbindungsbezogenes Problem PIN-Authentifizierungsprozess durch die Anwendung selbst einfügen und abschließen.

Ich habe folgenden Code gefunden. Ich bin mir sicher, dass er funktioniert, aber nicht sicher, wie ich die PIN in diesen Code einfügen soll.

private void pairDevice(BluetoothDevice device) {
        try {
            Log.d("pairDevice()", "Start Pairing...");
            Method m = device.getClass().getMethod("createBond", (Class[]) null);
            m.invoke(device, (Object[]) null);
            Log.d("pairDevice()", "Pairing finished.");
        } catch (Exception e) {
            Log.e("pairDevice()", e.getMessage());
        }
    }

Weiß jemand, wie man die PIN in den obigen Code oder einen ähnlichen Code eingibt, um das Problem zu lösen? Danke

33
Sandip Jadhav

Wie kann ich die Bluetooth-Pairing-Benachrichtigung von Android vermeiden oder schließen, wenn ich ein programmgesteuertes Pairing durchführe?

Dies scheint Ihnen die Antwort zu geben, mit der PIN-Eingabe und allem. Es beinhaltet das Senden von .setPin (), wann immer Sie die Nachricht erhalten.

24
Mats Willemsen

Also, ich hatte diese Frage, wenn jemand die Antwort auf diese Frage benötigt, in Android 4.4.2.

 IntentFilter filter = new IntentFilter(
                "Android.bluetooth.device.action.PAIRING_REQUEST");


        /*
         * Registering a new BTBroadcast receiver from the Main Activity context
         * with pairing request event
         */
        registerReceiver(
                new PairingRequest(), filter);

Und der Code für den Empfänger.

  public static class PairingRequest extends BroadcastReceiver {
        public PairingRequest() {
            super();
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("Android.bluetooth.device.action.PAIRING_REQUEST")) {
                try {
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    int pin=intent.getIntExtra("Android.bluetooth.device.extra.PAIRING_KEY", 0);
                    //the pin in case you need to accept for an specific pin
                    Log.d("PIN", " " + intent.getIntExtra("Android.bluetooth.device.extra.PAIRING_KEY",0));
                    //maybe you look for a name or address
                    Log.d("Bonded", device.getName());
                    byte[] pinBytes;
                    pinBytes = (""+pin).getBytes("UTF-8");
                    device.setPin(pinBytes);
                    //setPairing confirmation if neeeded
                    device.setPairingConfirmation(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

Und in der Manifestdatei.

<uses-permission Android:name="Android.permission.BLUETOOTH" />
<uses-permission Android:name="Android.permission.BLUETOOTH_ADMIN" />

Und der Rundfunkempfänger.

 <receiver Android:name=".MainActivity$PairingRequest">
                <intent-filter>
                    <action Android:name="Android.bluetooth.device.action.PAIRING_REQUEST" />
                    <action Android:name="Android.bluetooth.device.action.PAIRING_CANCEL" />
                </intent-filter>
</receiver>
8
Rodolfo Abarca

Versuchen Sie diesen Code:

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

Intent intent = new Intent(BluetoothDevice.ACTION_PAIRING_REQUEST);
intent.putExtra(EXTRA_DEVICE, device);
int PAIRING_VARIANT_PIN = 272;
intent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, PAIRING_VARIANT_PIN);
sendBroadcast(intent);

Intent intent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
startActivityForResult(intent, REQUEST_PAIR_DEVICE);

Ich hoffe das hilft

Referenz: http://Pastebin.com/N8dR4Aa1

4
Dan Bray

Wie man den PIN-Code einstellt, wurde oben beantwortet (und das hat mir geholfen). Trotzdem teile ich meinen einfachen Code, der mit Android 6) funktioniert:

BluetoothAdapter mBTA = BluetoothAdapter.getDefaultAdapter();
if (mBTA.isDiscovering()) mBTA.cancelDiscovery();
mBTA.startDiscovery();
...

/** In a broadcast receiver: */

if (BluetoothDevice.ACTION_FOUND.equals(action)) { // One device found.

    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    Log.d(TAG, "Start Pairing... with: " + device.getName());
    device.createBond();
}

// If you want to auto-input the pin#:
else if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action)){

                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    device.setPin("1234".getBytes());
}
2
Bruno L.
    BluetoothSocket bluetoothSocket = null;
    try {
        bluetoothSocket = device.createRfcommSocketToServiceRecord(UUID.fromString(UUID_DIVING));
    } catch (IOException e) {
        Log.i("Bluetooth", "IOException = " + e.getMessage());
        e.printStackTrace();
    }

    try {
        byte[] pin = (byte[]) BluetoothDevice.class.getMethod("convertPinToBytes", String.class).invoke(BluetoothDevice.class, "0000");
        Method m = device.getClass().getMethod("setPin", byte[].class);
        m.invoke(device, (Object) pin);
        device.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(device, true);
    } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
        Log.i("Bluetooth", "IOException = " + e.getMessage());
        e.printStackTrace();
    }

    try {
        if (bluetoothSocket != null) {
            bluetoothSocket.connect();
            Log.i("Bluetooth", "bluetoothSocket.connect() ");
            InputStream inputStream = bluetoothSocket.getInputStream();
            OutputStream outputStream = bluetoothSocket.getOutputStream();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

Versuche dies,

BluetoothDevice device = intent.getParcelableExtra("Android.bluetooth.device.extra.DEVICE");
device.getClass().getMethod("setPairingConfirmation", boolean.class).invoke(device, true);
device.getClass().getMethod("cancelPairingUserInput", boolean.class).invoke(device);
1
No_Rulz

die Methode bluetoothDevice.createBond können Sie zum Paring verwenden

Um den Paring-Status zu überprüfen, müssen Sie den Rundfunkempfänger BluetoothDevice.ACTION_BOND_STATE_CHANGED registrieren

In Ihrer Empfängerklasse können Sie blueToothDevice.getBondState überprüfen

0
user2851150