Сопряжение Bluetooth с BLE не работает в Android

Я пытался связать свой Android с устройством BLE. Проблема в том, что когда я вызываю запрос на сопряжение, появляется диалоговое окно. Но когда я ввел свой пароль, он не спаривается или onActivityResult не вызывается. Так что же делать для успешного сопряжения?

   private void startBluetoothPairing(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);
    ((Activity) appContext).startActivityForResult(intent,1);
   }

OnActivityResult не вызывается.

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.v("TAG","Bluetooth Device!!");
    if (requestCode == 1) {
        if (resultCode == Activity.RESULT_OK) {
            BluetoothDevice bluetoothDevice = data.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            Parcel parcel = Parcel.obtain();
            data.getParcelableExtra(BluetoothDevice.EXTRA_PAIRING_KEY).writeToParcel(parcel, 0);
            byte[] bytes = parcel.marshall();
            parcel.recycle();
            bluetoothDevice.setPin(bytes);
            bluetoothDevice.createBond();
        }
    }
}

Задача решена :Обновленный код:

Зарегистрировал BroadCasterReciever во время запуска приложения

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

Реализация широковещательного приемника.

    private  String BLE_PIN= "000012";
    private BroadcastReceiver broadCastReceiver = new BroadcastReceiver() {
            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);

                }
           }
      };

И я позвонил устройство.createBond() после обнаружения устройства.

2
0
861
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот то, что я использовал, и это сработало для меня хорошо.

Сопряжение с устройством

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
                    BluetoothActivity.this.registerReceiver(mReceiver, filter);
                    device.createBond();

BroadcastReceiver, чтобы проверить, сопряжено ли устройство

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                String name = device.getName();
                String address = device.getAddress();
                if (device.getBondState() == BluetoothDevice.BOND_BONDED) {
                    //Device Paired
                }
            }
        }
    };

Отменить регистрацию приемника в onDestroy

BluetoothActivity.this.unregisterReceiver(mReceiver);

Это сопряжение с ключом доступа?

mahbubcseju 12.06.2019 08:01

@mahbubcseju Да

Arun 12.06.2019 08:09

Но при использовании вашего метода диалоговое окно для ввода пароля не появляется. Мне нужно сопряжение с ключом доступа. Автоматический способ не нужен.

mahbubcseju 12.06.2019 08:19

@mahbubcseju Я только что проверил, и у меня это работает. Диалоговое окно отображается для устройств, использующих стандартный пароль (0000 или 1234). Иногда вместо диалогового окна отображается уведомление (для сопряжения между устройствами). Он не запрашивал пароль, когда я пытался соединиться с наушниками Bluetooth, но они были сопряжены. Может быть, ваше устройство BLE более новое и может подключаться без пароля?

Arun 12.06.2019 08:42

Другие вопросы по теме