Ionic 始终允许定位 API 级别 29

Posted

技术标签:

【中文标题】Ionic 始终允许定位 API 级别 29【英文标题】:Ionic Allow location all the time API level 29 【发布时间】:2020-12-19 21:50:19 【问题描述】:

我正在尝试在我的 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 Level 29 为目标时,它不会一直显示允许位置的请求。

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

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

【问题讨论】:

因为我使用的是ionic-native/background-geolocation,所以当用户一直不允许定位时它会中断。 遇到完全相同的问题。 能否获得“所有时间”的提示? 不,我要试试下面的 David Buck 回答 【参考方案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,它在运行时实际上是未定义的。我的猜测是AndroidPermissions 插件发布时ACCESS_BACKGROUND_LOCATION 权限不存在。

    在后台定位之前调用requestPermissions 方法。这很重要。

    &lt;uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /&gt; 添加到platforms\android\app\src\main\AndroidManifest.xml

【讨论】:

现在我需要在后台获取位置【参考方案2】:

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

【讨论】:

【参考方案3】:
    将此添加到platforms\android\app\src\main\AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    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 ;

【讨论】:

以上是关于Ionic 始终允许定位 API 级别 29的主要内容,如果未能解决你的问题,请参考以下文章

ionic 调用百度地图API,并定位当前位置示例

我想将我的应用程序目标sdk版本29降级到28,google play控制台可以允许吗?

ionic 使用百度地图API, 定位用户当前所在的城市示例

Android PlayStore警告您的应用目前的目标是API级别25

如何定位多个 API 级别?

ionic cordova 引用百度地图以及利用手机GPS定位