Android ACTIVITY_RECOGNITION 权限 SDK 28 运行 Android 10/Q (SDK 29)

Android ACTIVITY_RECOGNITION Permission SDK 28 running on Android 10/Q (SDK 29)

我的 Android 应用以 SDK 28 为目标并连接到 Google Fit 以上传数据和读取其他一些数据。该应用程序使用 HistoryAPI 读取 com.google.step_count.delta 数据。

此文档声称 "com.google.android.gms.permission.ACTIVITY_RECOGNITION permission is converted into a pre-granted runtime permission" 如果应用程序以 SDK 28 为目标但在 SDK 29 上运行:https://developers.google.com/fit/android/authorization#android_permissions

我已按照文档说明添加到应用的清单中。

当这个 Android 应用程序在设备 运行 Android 10 (SDK 29) 上并且用户第一次连接到 Google Fit 时,我得到一条日志说:

There was a problem subscribing.com.google.android.gms.common.api.ApiException: 10: SecurityException: com.google.step_count.delta requires android.permission.ACTIVITY_RECOGNITION

然而文档声称这将被转换为预先授予的运行时权限。

团队还没有准备好将应用的目标 SDK 迁移到 29,那么我们如何继续获取 com.google.step_count.delta 数据而不出现此错误?

我假设这个日志意味着它实际上没有连接,因为没有日志语句说:

Successfully subscribed to com.google.step_count.delta

不确定它是否对您的问题有帮助,但它可以帮助我们解决类似的问题。 首先检查您的 app/user 是否允许物理 activity - 很可能不允许。 如果您允许 - 您的代码应该 运行 无一例外。

我们的问题是如何检测 com.google.android.gms.permission.ACTIVITY_RECOGNITION 是否被允许(运行 在 Android 10 上的目标 sdk 28 中设置)- 因为调用

PermissionCompat.isPermissionGranted(context,"com.google.android.gms.permission.ACTIVITY_RECOGNITION")

始终returns true(即使权限被拒绝)

解决方法(您的应用程序目标 sdk 28 运行nning on Android 10)是调用 requestPermission(而不是 isPermissionGranted),它不会执行授予权限时的任何内容,如果没有则显示对话框

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        PermissionCompat.requestPermission(activity, "com.google.android.gms.permission.ACTIVITY_RECOGNITION", requestCode)
}

如果您运行正在使用 activity 不可用的后台代码,您有两个选择:

  1. 迁移到目标 SDK 29(并在清单中使用 android.permission.ACTIVITY_RECOGNITION 和 checks/request)- 我们对其进行了测试并且有效
  2. 在 main activity 或任何合适的 activity 运行 上面的调用将请求用户许可

已解决:在应用程序中 Api 28 级 +

<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>

应用程序应检查是否已授予权限:

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.ACTIVITY_RECOGNITION)
          != PackageManager.PERMISSION_GRANTED) {
      // Permission is not granted
}

请求权限:

ActivityCompat.requestPermissions(thisActivity,
                  arrayOf(Manifest.permission.ACTIVITY_RECOGNITION),
                  MY_PERMISSIONS_REQUEST_ACTIVITY_RECOGNITION);

了解有关请求 Android 运行时权限的更多信息。

如果您的应用面向 SDK 级别 28 或以下,则必须在其清单文件中指定 com.google.android.gms.permission.ACTIVITY_RECOGNITION 权限。

看起来文档已更新:https://developer.android.com/about/versions/10/privacy/changes#physical-activity-recognition

我只能通过 使用清单 (com.google.android.gms.permission.ACTIVITY_RECOGNITION) 中的 API 28 权限来解决这个问题。

如果应用程序安装在设备 运行 Android 10 (API 29) 上,系统似乎会正确地自动授予权限 android.permission.ACTIVITY_RECOGNITION。

因为用户可以在设置中更改此设置(设置 > 应用程序和通知 > 权限管理器 > 物理 Activity > 指定应用程序 > 拒绝),我能够检查 android.permission.ACTIVITY_RECOGNITION 权限,如果应用安装在设备 运行 Android 10 (API 29).