Ionic разрешает местоположение все время, уровень API 29

#android #ionic-framework #android-location #ionic-native

#Android #ionic-framework #android-местоположение #ionic-родной

Вопрос:

Я пытаюсь использовать уровень API 29 в своем приложении ionic, и мне требуется, чтобы приложение запрашивало у пользователя местоположение «Разрешить все время». Я добавил все предложенные изменения.

Мой AndroidManifest.xml:

  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION">
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">
 <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION">
 <uses-permission android:name="android.permission.PERMISSION.FOREGROUND_SERVICE">
  

My app.component.ts:

 initializeApp() {
    this.platform.ready().then(() => {
      this.statusBar.styleDefault();
      this.splashScreen.hide();
      this.setProviders();
      this.checkBackgroundPermission();
    });
  }

private async checkBackgroundPermission() {
    try {
      const result = await this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.ACCESS_BACKGROUND_LOCATION);
      if (!result || result.hasPermission === false) {
        this.requestPermissions();
      }
    } catch (error) {
      this.requestPermissions();
    }
  }

 private async requestPermissions() {
    try {
      const data = await this.androidPermissions.requestPermissions([
        this.androidPermissions.PERMISSION.ACCESS_BACKGROUND_LOCATION,
        this.androidPermissions.PERMISSION.ACCESS_COARSE_LOCATION,
        this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION,
        this.androidPermissions.PERMISSION.ACTIVITY_RECOGNITION,
        this.androidPermissions.PERMISSION.FOREGROUND_SERVICE
      ]);
      if (!data.hasPermission) {
        throw new Error('No permission');
      }
    } catch (error) {
      await this.alertService.showAlert(
        'Background location',
        'We need background location access in order to continue.'
      );
      this.signOut();
    }
  
  

Однако, когда я настраиваю уровень Api 29, он не показывает запрос на разрешение местоположения все время.

все время

Но если я использую уровень Api 28, он показывает разрешение, которое мне нужно

Есть предложения, как заставить это работать?

Комментарии:

1. Поскольку я использую ionic-native/background-geolocation , он прерывается, когда пользователь не разрешает местоположение все время.

2. Возникает точно такая же проблема.

3. Есть ли какие-либо успехи в получении запроса «Все время»?

4. Нет, я собираюсь попробовать ответить Дэвиду Баку ниже

Ответ №1:

У меня была точно такая же проблема. У меня сработало следующее.

  1. Используйте AndroidPermissions для запроса следующих разрешений.
     const data = await this.androidPermissions.requestPermissions([
            "android.permission.ACCESS_BACKGROUND_LOCATION",
            "android.permission.ACCESS_COARSE_LOCATION",
            this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION,
    ]);
      

Обратите внимание на строку "android.permission.ACCESS_BACKGROUND_LOCATION" вместо this.androidPermissions.PERMISSION.ACCESS_BACKGROUND_LOCATION , которая фактически не определена во время выполнения. Я предполагаю, что ACCESS_BACKGROUND_LOCATION разрешения не существовало, когда AndroidPermissions был выпущен плагин.

  1. Вызовите requestPermissions метод перед фоновым размещением. Это очень важно.

  2. Добавить <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> к platformsandroidappsrcmainAndroidManifest.xml

Комментарии:

1. Теперь мне нужно получить местоположение в фоновом режиме

Ответ №2:

В месте, куда вы вызываете, проверьте разрешение для ACCESS_BACKGROUND_LOCATION, также проверьте ACCESS_FINE_LOCATION и, если какой-либо из них не найден, вызовите свой метод requestPermissions. Это должно помочь.

Ответ №3:

  1. добавьте это в platformsandroidappsrcmainAndroidManifest.xml
 <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
  
  1. изменение в Geolocation.java файле (плагин геолокации)
  • Удалить :
 String [] permissions = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION }
  
  • замените его на :
 String [] permissions = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,  Manifest.permission.ACCESS_BACKGROUND_LOCATION };