Ionic 始终允许定位 API 级别 29

Tur*_*Aza 4 android android-location ionic-framework ionic-native

我正在尝试在我的离子应用程序上使用 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">
Run Code Online (Sandbox Code Playgroud)

我的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();
    }
  
Run Code Online (Sandbox Code Playgroud)

但是,当我以 Api 级别 29 为目标时,它不会始终显示允许位置的请求。

每时每刻

但如果我使用 Api 级别 28,它会显示我需要的权限

有什么建议可以让这项工作成功吗?

小智 7

我有完全相同的问题。以下内容对我有用。

  1. 使用 AndroidPermissions 请求以下权限。
    const data = await this.androidPermissions.requestPermissions([
            "android.permission.ACCESS_BACKGROUND_LOCATION",
            "android.permission.ACCESS_COARSE_LOCATION",
            this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION,
    ]);
    
    Run Code Online (Sandbox Code Playgroud)

请注意字符串"android.permission.ACCESS_BACKGROUND_LOCATION",而不是this.androidPermissions.PERMISSION.ACCESS_BACKGROUND_LOCATION,它实际上在运行时未定义。我的猜测是,该插件发布ACCESS_BACKGROUND_LOCATION时该权限不存在。AndroidPermissions

  1. 在Background Location之前调用该requestPermissions方法。这个非常重要。

  2. 添加<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />到platforms\android\app\src\main\AndroidManifest.xml