Сканирование плагина IONIC Capacitor BLE не работает

Я изучаю ionic 5 и хочу создать простое приложение, которое отображает список всех ближайших телефонов с поддержкой Bluetooth. Моя проблема в том, что когда я использую сканирование вызова плагина BLE, мои методы обратного вызова никогда не вызываются. Я тестировал это на подключенном телефоне (Samsung 9), а также сгенерировал app-debug.apk и установил его на телефон.

Вот подробности моего проекта. Я использую Capacitor для собственных приложений.

SDK:  введите здесь описание изображения

tab-1.ts

import { Component, NgZone } from '@angular/core';
import { BLE } from '@ionic-native/ble/ngx';
import { AlertController } from '@ionic/angular';

@Component({
  selector: 'app-tab1',
  templateUrl: 'tab1.page.html',
  styleUrls: ['tab1.page.scss']
})
export class Tab1Page {
text = 'hello';
devices: any[] = [];
constructor(private ble: BLE,
            private ngZone: NgZone,
            public alertController: AlertController) { }
 scan() {
  this.text = 'Loading...';
  console.log('going to this.scan.....');
  this.devices = [];
  this.showAlert('starting scan.....');


  this.ble.scan([], 60).subscribe(devices1=>{
    this.showDeviceList(devices1);
    this.text = devices1;
    this.showAlert('scan finished success');
  },error=> this.showAlert('scan fini with error'), 
  ()=>this.showAlert('scan void finish'));
}

async showDeviceList(devices) {
  const alert = await this.alertController.create({
    header: 'Alert',
    subHeader: 'Subtitle',
    message: 'Going to start scan',
    buttons: ['OK']
  });
  await alert.present();
  console.log('devices are ', devices);
  this.ngZone.run(() => {
    this.devices.push(...devices);
    this.text = 'finished';
  });
}

async showAlert(msg){
  const alert = await this.alertController.create({
    header: 'Alert',
    subHeader: 'Subtitle',
    message: msg,
    buttons: ['OK']
  });
  await alert.present();
}
}

ионная информация:

введите здесь описание изображения

Package.json:

{
  "name": "COVID-TRACKING",
  "version": "0.0.1",
  "author": "Ionic Framework",
  "homepage": "https://ionicframework.com/",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/common": "~8.2.14",
    "@angular/core": "~8.2.14",
    "@angular/forms": "~8.2.14",
    "@angular/platform-browser": "~8.2.14",
    "@angular/platform-browser-dynamic": "~8.2.14",
    "@angular/router": "~8.2.14",
    "@capacitor/android": "^2.0.1",
    "@capacitor/core": "2.0.1",
    "@ionic-native/ble": "^5.23.0",
    "@ionic-native/core": "^5.0.7",
    "@ionic-native/splash-screen": "^5.0.0",
    "@ionic-native/status-bar": "^5.0.0",
    "@ionic/angular": "^5.0.0",
    "cordova-plugin-ble-central": "^1.2.4",
    "core-js": "^2.5.4",
    "rxjs": "~6.5.1",
    "tslib": "^1.9.0",
    "zone.js": "~0.9.1"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.803.20",
    "@angular/cli": "~8.3.23",
    "@angular/compiler": "~8.2.14",
    "@angular/compiler-cli": "~8.2.14",
    "@angular/language-service": "~8.2.14",
    "@capacitor/cli": "2.0.1",
    "@ionic/angular-toolkit": "^2.1.1",
    "@types/jasmine": "~3.3.8",
    "@types/jasminewd2": "~2.0.3",
    "@types/node": "~8.9.4",
    "codelyzer": "^5.0.0",
    "jasmine-core": "~3.4.0",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~4.1.0",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~2.0.1",
    "karma-jasmine-html-reporter": "^1.4.0",
    "protractor": "~5.4.0",
    "ts-node": "~7.0.0",
    "tslint": "~5.15.0",
    "typescript": "~3.4.3"
  },
  "description": "An Ionic project"
}

Команда для установки плагина:

npm install cordova-plugin-ble-central
npm install @ionic-native/ble
ionic cap sync

person Jose Loor    schedule 13.04.2020    source источник
comment
Получаете ли вы от ОС Android запрос на разрешение местоположения? Что показывает adb logcat во время сканирования? Кроме того, вы говорите, что используете Capacitor, но это удобный плагин, который вы используете.   -  person swbradshaw    schedule 14.04.2020
comment
Привет, да, я получил запрос на разрешение местоположения, также я включил Bluetooth и службу определения местоположения вручную. Вы сказали, что это плагин Cordova, могу ли я использовать его с конденсатором? Документы также дают возможность установить с конденсатором.   -  person Jose Loor    schedule 14.04.2020
comment
@JoseLoor - у тебя когда-нибудь получалось с этим? Я ищу похожую вещь. Спасибо!   -  person Chris    schedule 25.06.2020


Ответы (3)


Проблема только в android 10. Для работы bluetooth требуется разрешение на заднее местоположение в android 10. Вам необходимо добавить разрешение фонового определения местоположения в свой AndroidManifest.xml, а также вам необходимо добавить плагин фоновой геолокации в свое приложение, даже если вы не собираетесь его использовать. В вашем app.component сделайте что-то вроде этого

const config: BackgroundGeolocationConfig = {
    desiredAccuracy: 10,
    stationaryRadius: 20,
    distanceFilter: 30,
    debug: true, //  enable this hear sounds for background-geolocation life-cycle.
    stopOnTerminate: false, // enable this to clear background location settings when the app terminates
  };

  this.bgLoc.stop();

После выполнения вышеизложенного будет автоматически запрашиваться разрешение на определение местоположения в фоновом режиме, что позволит Bluetooth работать на android 10. Также убедитесь, что вы добавили разрешение Coarse Location в свой файл androidmanifest.xml.

person Joshua Okpako    schedule 07.08.2020
comment
Да, вы правы, на Android 8.1 сканирование проходит хорошо, но когда я устанавливаю плагин геолокации npmjs.com/package/@ionic-native/background-geolocation У меня есть несколько ошибок из Android Studio, и все они происходят из AndroidManifest.xml. Есть ли у вас какие-нибудь предложения? Заранее спасибо! - person Makc; 14.07.2021

Начиная с android api 29, вместо ACCESS_COARSE_LOCATION используется разрешение ACCESS_FINE_LOCATION. Создатель cordova-plugin-ble-central еще не принял запрос на перенос, который устраняет эту проблему.

Я внес необходимые изменения в свою вилку, и теперь она отлично работает на Android 10, без хака по добавлению фонового местоположения в ваше приложение.

Возможно, вы сможете использовать его, удалив старый:

ionic cordova plugin rm cordova-plugin-ble-central

И добавляем свою вилку:

ionic cordova plugin add git+https://github.com/dslima90/cordova-plugin-ble-central.git
person DSLima90    schedule 29.09.2020

попробовал конденсатор и обнаружил множество проблем, это занимает слишком много времени, поэтому я решил вернуться к кордове вместо конденсатора

person Izumi kana    schedule 20.01.2021