4

Ich bin unten Broadcast-Empfänger verwenden, um Bond-Anfrage zu fangen und ohne Benutzer Popup-Anfrage zu verbinden.Android - BLE-Bindung programmatisch funktioniert nicht auf allen CoolPad Note 3

private static BroadcastReceiver pairingBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(intent.getAction())) { 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       int type = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.ERROR); 

       Toast.makeText(context, "broadcast type "+type, Toast.LENGTH_LONG).show(); 

       if (type == BluetoothDevice.PAIRING_VARIANT_PIN) { 
        if(devicePin != null) { 
         CommonStuff.Log("bond pin "+devicePin); 
         Toast.makeText(context, "broadcast bond pin "+devicePin, Toast.LENGTH_LONG).show(); 
         byte[] pin = new byte[10]; 
         try { 
          pin = (byte[]) BluetoothDevice.class.getMethod("convertPinToBytes", String.class) 
            .invoke(BluetoothDevice.class, devicePin); 
         } catch (IllegalAccessException e) { 

         } catch (InvocationTargetException e) { 

         } catch (NoSuchMethodException e) { 

         } 
         /*for (int i=0; i< pin.length; i++) { 
          CommonStuff.Log("byte bond pin "+pin[i]); 
         }*/ 
         device.setPin(pin); 
         /*if(type == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION || type == 1) { 
          device.setPairingConfirmation(true); 
         }*/ 
         abortBroadcast(); 
        } 
       } 
      } else if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction())) { 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.BOND_NONE); 

       if(state == BluetoothDevice.BOND_BONDING) 
        return; 

        if(state == BluetoothDevice.BOND_BONDED) { 
         Toast.makeText(context, "Bond success", Toast.LENGTH_LONG).show(); 
        } else { 
         Toast.makeText(context, "Bond failed", Toast.LENGTH_LONG).show(); 
        } 
      } 
     } 
    }; 

Angenommen, DevicePin wird global initialisiert. Dies funktioniert für die meisten Telefone. Aber in Coolpad Note 3, habe ich BluetoothDevice.EXTRA_PAIRING_VARIANT Wert als 1. Und wenn ich versuche, dieses Gerät mit setPin() ohne Berücksichtigung EXTRA_PAIRING_VARIANT Wert zu verbinden, schlägt die Verbindung fehl.

Hat jemand dieses gleiche Problem konfrontiert? Bitte hilf mir, das zu klären.

Antwort

2

BluetoothDevice.EXTRA_PAIRING_VARIANT Wie 1 bedeutet, kann nur Benutzer den Hauptschlüssel eingeben. Aber programmgesteuert können wir den Hauptschlüssel mit der privaten Methode setpasskey setzen.

unten Code hinzufügen als sonst, wenn Fall für Typen in obigem Code

else if(type == 1) { 
    int pin = Integer.parseInt(devicePin); 
    try { 
     device.getClass().getMethod("setPasskey", int.class) 
       .invoke(device, pin); 
     abortBroadcast(); 
    } catch (IllegalAccessException e) { 

    } catch (InvocationTargetException e) { 

    } catch (NoSuchMethodException e) { 

    } 
} 
Verwandte Themen