2015-08-06 4 views
5

Я пишу приложение для Android, в котором я хотел бы программно связать себя с обычным устройством BLE. У меня есть ручная привязка, в которой пользователь вводит PIN-код, используя стандартный диалог Bluetooth Bluetooth, но я не смог найти какую-либо информацию о том, как автоматически связывать устройство BLE программно, без вмешательства пользователя. Это возможно? Если да, то какой процесс?Программная привязка к устройству BLE на Android

ответ

-1

Все, что вы можете сделать, чтобы избежать взаимодействия с пользователем, - это принудительное соединение Just Works. Чтобы сделать это, запрограммируйте периферийное устройство для приема сопряжения с возможностью ввода-вывода NoInputNoOutput.

2

Я смог выполнить эту работу САМОЕ ВРЕМЯ, зарегистрировав BroadcastReceiver для получения намерения BluetoothDevice.ACTION_BOND_STATE_CHANGED, а затем вызывая BluetoothDevice.setPin после получения сообщения BluetoothDevice.BOND_BONDING. Как и в случае с большинством вещей BLE в Android, это, похоже, действует несколько иначе, в зависимости от устройства и версии Android. К сожалению, я не могу заставить Android отказаться от намерения Bluetooth, поэтому экран ввода PIN-кода все еще появляется на секунду, пока соединение не будет завершено.

private final BroadcastReceiver mReceiver = new BroadcastReceiver() 
    { 
     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
      final String action = intent.getAction(); 
      Logger("Broadcast Receiver:" + action); 

      if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) 
      { 
       final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR); 

       if(state == BluetoothDevice.BOND_BONDING) 
       { 
        Logger("Bonding..."); 
        if (mDevice != null) { 
         mDevice.setPin(BONDING_CODE.getBytes()); 
         Logger("Setting bonding code = " + BONDING_CODE); 
        } 
       } 
       else if(state == BluetoothDevice.BOND_BONDED) 
       { 
        Logger("Bonded!!!"); 
        mOwner.unregisterReceiver(mReceiver); 
       } 
       else if(state == BluetoothDevice.BOND_NONE) 
       { 
        Logger("Not Bonded"); 
       } 
      } 
     } 
    }; 
+0

Оказывается, вы не хотите 'ACTION_BOND_STATE_CHANGE'. См. [Мой другой ответ] (http://stackoverflow.com/a/38241240/265521). – Timmmm

1

мне удалось это сделать - см мой ответ here.

TL: DR: забудьте о ACTION_BOND_STATE_CHANGED; вам это не нужно. Вместо этого прослушивайте ACTION_PAIRING_REQUEST и установите приоритет высокий. В приемнике вещания, когда вы получите ACTION_PAIRING_REQUEST, позвоните setPin() с вашим PIN-кодом, а затем abortBroadcast(), чтобы предотвратить уведомление системы.

Смежные вопросы