Ionic 始终允许定位 API 级别 29

Ionic Allow location all the time API level 29

我正在尝试在我的 ionic 应用程序上使用 API 级别 29,并且我要求该应用程序询问用户“始终允许”位置。我已经添加了所有建议的修改。

我的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">

我的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 它显示我需要的权限

有什么建议可以使这项工作有效吗?

在您为 ACCESS_BACKGROUND_LOCATION 调用检查权限的地方,还要检查 ACCESS_FINE_LOCATION,如果没有找到,请调用您的 requestPermissions 方法。这应该有所帮助。

我遇到了完全相同的问题。以下对我有用。

  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" />添加到platforms\android\app\src\main\AndroidManifest。xml

  1. 将此添加到 platforms\android\app\src\main\AndroidManifest.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 };