我的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
答案 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 :(得分: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)。