navigator.bluetooth не работает в машинописи

Я пытаюсь сделать вызов API Chrome Bluetooth, и я не получаю успеха через машинописный текст. Я уже пробовал применить файл в html() но тоже безрезультатно. Но если вы скопируете код и вставите его в консоль браузера, код работает отлично :(

Ошибка в консоли (если запустить код в Ts):

DOMException: Must be handling a user gesture to show a permission request.

// Машинопись/ТС:

requestBluetooth() {
    (window.navigator as any).bluetooth.requestDevice({ filters: [{ services: [this.PRINT_SERVICE_CODE] }] })
      .then(device => {
        return device.gatt.connect();
      })
      .then(server => {
        return server.getPrimaryService(this.PRINT_SERVICE_CODE);
      })
      .then(service => {
        return service.getCharacteristic('00002af1-0000-1000-8000-00805f9b34fb');
      })
      .then((characteristic) => {
        this.sendTextData(characteristic);
      })
      .catch(error => console.log(error));
  }

sendTextData(characteristic) {
    // Get the bytes for the text
    const encoder = new TextEncoder('UTF-8');
    const text = encoder.encode('TESTETSETS' + '\u000A\u000D');
    return characteristic.writeValue(text)
      .then(() => console.log('Write done.'));
  }

// Работа в браузере консоли:

const PRINT_SERVICE_CODE = '000018f0-0000-1000-8000-00805f9b34fb';

const sendTextData = (function (characteristic) {
  const encoder = new TextEncoder('UTF-8');
  const text = encoder.encode('TESTETSETS' + '\u000A\u000D');
  return characteristic.writeValue(text)
    .then(() => console.log('Write done.'));
})

const request = (function () {
  navigator.bluetooth.requestDevice({ filters: [{ services: [PRINT_SERVICE_CODE] }] })
  .then(device => {
    return device.gatt.connect();
  })
  .then(server => {
    return server.getPrimaryService(PRINT_SERVICE_CODE);
  })
  .then(service => {
    return service.getCharacteristic('00002af1-0000-1000-8000-00805f9b34fb');
  })
  .then((characteristic) => {
    this.sendTextData(characteristic);
  })
  .catch(error => console.log(error));
})

request();

// Информация о проекте:

Угловой интерфейс командной строки: 6.0.8

Узел: 8.11.3

ОС: линукс х64

Угловой: 6.0.9


person João Eudes Lima    schedule 18.07.2018    source источник


Ответы (1)


Вызывается ли requestBluetooth() в обработчике событий для пользовательского жеста (например, нажатия кнопки)? Я не могу найти его в данный момент, но я вспоминаю аналогичный вопрос, связанный с Angular, где некоторые виды обработчиков кликов не сохраняли токен жеста пользователя.

person Reilly Grant    schedule 18.07.2018
comment
Да, мне удалось решить проблему, когда я вызывал функцию одним нажатием кнопки, прежде чем я делал тестовый вызов в жизненном цикле angular, поэтому он не работал. После большой головной боли мне все равно удалось решить эту проблему, спасибо! - person João Eudes Lima; 18.07.2018