【问题标题】:App not sending location from Foreground service on Android 10应用程序未从 Android 10 上的前台服务发送位置
【发布时间】:2020-05-06 19:12:48
【问题描述】:

我的应用程序以 API 28 为目标。我有一个前台服务发送位置更新。

当满足以下条件时,应用停止发送位置:

  • 在 Android 10 上运行
  • 应用在后台
  • 位置权限被选为“仅在使用应用时允许”

运行中

adb shell dumpsys 包 packageName

我看到了

android.permission.ACCESS_BACKGROUND_LOCATION:grant=false

从文档看来,“android.permission.ACCESS_BACKGROUND_LOCATION”权限是向后兼容的。

我该如何解决这个问题?有没有办法禁用三态权限请求?

【问题讨论】:

  • 清单中的<service> 上是否有android:foregroundServiceType="location"developer.android.com/about/versions/10/privacy/…
  • 我看到一个 lint 错误 unknow attribute android:foregroundServiceType 并且应用程序崩溃
  • 关于 Lint 投诉,您的 compileSdkVersion 应设置为 29。就崩溃而言,请检查 Logcat。您可能需要查看 the background location documentation 以了解如何在 Android 10 上最好地处理此问题。
  • 如果您的应用以 API28 为目标,您必须选择“始终允许”才能在后台接收位置更新。然后将授予 ACCESS_BACKGROUND_LOCATION。而且,如果你只想要两个状态,那么你需要将目标 SDK 更改为 29,在 Manifest 中启用 foregroundService=location 并省略 ACCESS_BACKGROUND_LOCATION。
  • @CommonsWare 谢谢你解决了这个问题

标签: android android-location android-10.0


【解决方案1】:

https://developer.android.com/about/versions/10/privacy/changes#app-access-device-location

除非满足以下条件之一,否则应用会被视为在后台访问位置:

  • 属于该应用的 Activity 可见。
  • 应用正在运行已声明前台服务类型位置的前台服务。

您正在使用前台服务来获取位置更新,但(我假设)您没有告诉操作系统,因此它认为您正在后台访问该位置。您需要做的就是声明您的前台服务处理位置。

<service android:name="com.example.MyForegroundService"
         android:foregroundServiceType="location"/>

现在,当您的服务正在运行时,操作系统会将您的应用视为在前台,以便审核位置访问 - 而您不需要 ACCESS_BACKGROUND_LOCATION

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2014-02-26
    • 2011-12-07
    相关资源
    最近更新 更多