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

时间:2019-09-19 19:09:03

标签: android android-permissions google-fit google-fit-sdk android-10.0

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

本文档声称,如果该应用程序定位于SDK 28但运行在SDK 29上,则将“ com.google.android.gms.permission.ACTIVITY_RECOGNITION权限转换为预先授予的运行时权限”: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

3 个答案:

答案 0 :(得分:1)

不确定是否对您的问题有帮助,但对类似问题也有帮助。 首先检查您的应用/用户是否允许进行体育锻炼-很有可能是不允许的。 如果您允许-您的代码应无例外运行。

我们要解决的问题是如何检测com.google.android.gms.permission.ACTIVITY_RECOGNITION(在Android 10的目标sdk 28中运行)-自通话以来

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

总是返回true(即使权限被拒绝)

解决方法(对于在Android 10上运行的应用程序目标sdk 28, )是调用requestPermission(而不是isPermissionGranted),该请求在授予权限时不执行任何操作,否则显示对话框

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

如果您正在运行没有活动的后台代码,则有两个选择:

  1. 迁移到目标SDK 29(并在清单和检查/请求中使用android.permission.ACTIVITY_RECOGNITION)-我们对其进行了测试并有效
  2. 在主要活动或任何合适的活动开始时,运行上面的呼叫,该呼叫将要求用户许可

答案 1 :(得分:1)

已解决:在App 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权限。

答案 2 :(得分:0)

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

使用清单中的API 28权限(com.google.android.gms.permission.ACTIVITY_RECOGNITION),我只能解决此问题。

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

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