批准 Android 上的后台定位?

Posted

技术标签:

【中文标题】批准 Android 上的后台定位?【英文标题】:Approval for background location on Android? 【发布时间】:2021-06-23 04:06:39 【问题描述】:

我用 Qt 开发了一个 android 应用程序。前段时间,我从 Play 商店收到一封电子邮件“后台位置批准”。我不熟悉Java,我不明白这个问题。 我的应用仅在应用可见(在前台)时才使用 GPS,但在不可见(背景)时不使用。

我的 Manifest.xml 如下所示:

<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="28"/>

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.vending.BILLING"/>

现在我在 Play Store 上找到了

...the ACCESS_BACKGROUND_LOCATION permission only affects an app's access to location when it runs in the background.

对我来说,这意味着因为我不使用 ACCESS_BACKGROUND_LOCATION,所以我的应用仅在 GPS 可见(前景)时才使用它。那么问题是什么?谢谢...

【问题讨论】:

这不是一个简单的问题。 Android 10/11 对位置权限的使用有严格的限制。首先阅读这些文档。 support.google.com/googleplay/android-developer/answer/9799150developer.android.com/training/location/permissions#background你用什么android组件来请求GPS?你如何检查你的应用程序是否在后台?请提供您应用的 GPS 订阅代码。 正如我所提到的,我对 Java 并不熟悉。不幸的是,我对我的应用程序中的“GPS 订阅代码”一无所知。这是一个带有 AR 的相机应用程序,因此它需要非常精确的 gps 位置数据。而且我无法检查我的应用程序是否在后台。为什么这不是由 Android 通过 ACCESS_BACKGROUND_LOCATION 权限自动完成的?谢谢... 这些文档应该可以帮助您获得应用所需的位置权限。您不应使用 ACCESS_BACKGROUND_LOCATION 权限。你在 Qt 中使用任何框架吗?请为您提供 gradle 依赖项和 androidManifest.xml 【参考方案1】:

我有一个非常相似的问题。我仔细检查了我的 AndroidManifest.xml,里面没有 ACCESS_BACKGROUND_LOCATION

我使用 C++ 中的 QGeoPositionInfoSource 来获取定期位置更新。我从未调用过必须修复的 stopUpdates() 函数。它必须在应用程序进入后台时调用,例如:onPause

这是一个非常有用的视频,里面有线索,还有一些其他有用的阅读材料:

https://youtu.be/xTVeFJZQ28c?t=394 https://developer.android.com/training/location/permissions https://youtu.be/xTVeFJZQ28c?t=394 https://developer.android.com/about/versions/oreo/background-location-limits

有一个信号QGuiApplication::applicationStateChanged可用于此,示例代码:

if (const auto *const gui =
        qobject_cast<const QGuiApplication *const>(qApp)) 
  connect(gui, &QGuiApplication::applicationStateChanged, this,
          [&](Qt::ApplicationState state) 
            switch (state) 
            case Qt::ApplicationState::ApplicationActive:
              source->startUpdates();
              break;
            default:
              source->stopUpdates();
            
          );

sourceQGeoPositionInfoSource 的指针。

【讨论】:

以上是关于批准 Android 上的后台定位?的主要内容,如果未能解决你的问题,请参考以下文章

Android 后台持续定位

Android 定位后台服务在其他手机上不起作用

后台地理定位插件不适用于 Android 版本

cordova-ionic 应用程序在后台进行地理定位 - android 和 ios

Android性能优化:定性和定位Android图形性能问题——以后台录屏进程为例

Flutter 后台定位访问