web-dev-qa-db-fra.com

Comment coupler un appareil Bluetooth par programmation Android

Je développe une application où je veux connecter un problème principal avec un appareil Bluetooth, c'est que je ne veux pas que l'utilisateur saisisse la broche requise à la place, l'application devrait le faire lui-même ... Je n'ai aucun problème de connexion ... Je veux seulement pour insérer et terminer le processus d'authentification des broches par l'application elle-même.

J'ai trouvé le code suivant, je suis sûr que cela fonctionne, mais je ne sais pas comment ajouter une broche dans ce code ??

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

Est-ce que quelqu'un sait comment saisir le code PIN ci-dessus ou tout code similaire pour résoudre le problème .. Merci

33
Sandip Jadhav

Comment puis-je éviter ou ignorer la notification d'appairage Bluetooth d'Android lorsque je fais un appariement programmatique?

Cela semble vous donner la réponse, avec la broche entrant et tout. Cela implique d'envoyer .setPin () chaque fois que vous recevez le message.

24
Mats Willemsen

Donc, j'avais cette question, si quelqu'un a besoin de la réponse à ce travail dans 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);

Et le code du récepteur.

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

Et dans le fichier manifeste.

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

Et le broadcastReceiver.

 <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

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

J'espère que ça aide

Référence: http://Pastebin.com/N8dR4Aa1

4
Dan Bray

Comment définir le code PIN a été répondu ci-dessus (et cela m'a aidé). Pourtant, je partage mon code simple ci-dessous qui fonctionne avec Android 6:

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

Essaye ça,

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

méthode bluetoothDevice.createBond, que vous pouvez utiliser pour le paring

Pour vérifier l'état d'appariement, vous devez enregistrer le récepteur de diffusion BluetoothDevice.ACTION_BOND_STATE_CHANGED

Dans votre classe de récepteur, vous pouvez vérifier blueToothDevice.getBondState

0
user2851150