web-dev-qa-db-fra.com

Jumelage Bluetooth Android sans utilisateur Entrez le code PIN et la confirmation à l'aide de l'API Android

Je suis débutant en programmation Android car je n'ai commencé que depuis 3 mois. Je fais un projet qui connecte l'application Android à Arduino en utilisant Bluetooth. J'ai déjà un code pour l'application Android (bluetooth.adapter, sockets, .etc.). Le code de connexion fonctionne déjà. L’un des objectifs est que l’application Android saisisse automatiquement le mot de passe lors du couplage avec le périphérique Bluetooth sans demander à l’utilisateur de saisir le code PIN. 

Les anciens messages sur ce forum ne aident pas beaucoup. (Beaucoup ont suggéré d'utiliser le mode non sécurisé, mais j'ai besoin du mode sécurisé. Dans mon cas également, arduino est le serveur, tandis que l'application pour téléphone portable est le client. La méthode serveur createInsecureRfcommSocketToServiceRecord () ne fonctionne pas pour moi.)

J'ai cherché et trouvé ceci dans le site de développement Android à propos de la classe bluetoothdevice:

setPairingConfirmation (confirmation booléenne) Confirmer la clé de passe pour l'appariement PAIRING_VARIANT_PASSKEY_CONFIRMATION.

PAIRING_VARIANT_PIN = "L'utilisateur sera invité à entrer un code PIN ou une application devra saisir un code PIN pour l'utilisateur".

PAIRING_VARIANT_PASSKEY_CONFIRMATION = "L'utilisateur sera invité à confirmer la clé d'accès affichée à l'écran ou une application confirmera la clé d'accès pour l'utilisateur"

Semble utiliser le code, l’application sera celle qui permettra de saisir le mot de passe et de confirmer Le mot de passe, ce qui en fera une fonctionnalité de "connexion automatique", mais le site Android ne donne pas d’exemple de code sur la façon de l’utiliser. Certains d'entre vous ont-ils un exemple de code pour utiliser ce processus ou un processus associé? J'apprécie ton aide!

7
ian

Tout d'abord, cette solution est conçue pour les versions plus récentes de l'API (15 ou ultérieur?)

J'ai trouvé la réponse écrite dans un autre post (voir la réponse de Roldofo dans Ici ). Voici ma réponse réorganisée avec un code détaillé.

En un mot, vous devez configurer un récepteur de radiodiffusion pour intercepter ACTION_PAIRING_REQUEST, puis transmettre par programme le PIN et confirmer. 

Enregistrer un récepteur de diffusion: 

    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
    getActivity().registerReceiver(mPairingRequestReceiver, filter);

La définition du destinataire:

private final BroadcastReceiver mPairingRequestReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) {
            try {
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    int pin=intent.getIntExtra("Android.bluetooth.device.extra.PAIRING_KEY", 1234);
                    //the pin in case you need to accept for an specific pin
                    Log.d(TAG, "Start Auto Pairing. PIN = " + intent.getIntExtra("Android.bluetooth.device.extra.PAIRING_KEY",1234));
                    byte[] pinBytes;
                    pinBytes = (""+pin).getBytes("UTF-8");
                    device.setPin(pinBytes);
                    //setPairing confirmation if neeeded
                    device.setPairingConfirmation(true);
            } catch (Exception e) {
                Log.e(TAG, "Error occurs when trying to auto pair");
                e.printStackTrace();
            }
        }
    }
};

Ensuite, lors de votre activité ou de votre fragment (où que vous souhaitiez initier le couplage), vous pouvez appeler la méthode pairDevice () définie suivante pour appeler une tentative de couplage (qui générera un ACTION_PAIRING_REQUEST).

private void pairDevice(BluetoothDevice device) {
    try {
        Log.d(TAG, "Start Pairing... with: " + device.getName());
        device.createBond();
        Log.d(TAG, "Pairing finished.");
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
    }
}
10
ian

J'ai également fait face au même problème et après toutes les recherches, j'ai trouvé la solution ci-dessous. 

(testé et fonctionnel !!!)

Je suis fondamentalement à la recherche d’un périphérique Bluetooth particulier (je connais l’adresse MAC) et j’ai le coupler une fois qu’il a été trouvé. La première chose à faire est de créer une demande de paire en utilisant le récepteur Boradcast et de gérer la demande comme indiqué ci-dessous.

IntentFilter intentFilter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
                intentFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
                registerReceiver(broadCastReceiver,intentFilter);

Vous devez écrire le broadcastReceiver et le manipuler comme ci-dessous.

String BLE_PIN = "1234"
private BroadcastReceiver broadCastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if(BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action))
        {
            BluetoothDevice bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            bluetoothDevice.setPin(BLE_PIN.getBytes());
            Log.e(TAG,"Auto-entering pin: " + BLE_PIN);
            bluetoothDevice.createBond();
            Log.e(TAG,"pin entered and request sent...");
        }
    }
};

Voila! Vous devriez pouvoir coupler un appareil Bluetooth sans TOUT INTERVENTION MANUELLE.

J'espère que cela vous aidera :-) Merci de bien vouloir répondre si cela fonctionne pour vous.

1
Varun A M