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

Kar*_*ton 9 android android-permissions google-fit-sdk google-fit 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/授权#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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Successfully subscribed to com.google.step_count.delta
Run Code Online (Sandbox Code Playgroud)

小智 7

已解决:在 App Api 级别 28 +

<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
Run Code Online (Sandbox Code Playgroud)

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

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

请求权限:

ActivityCompat.requestPermissions(thisActivity,
                  arrayOf(Manifest.permission.ACTIVITY_RECOGNITION),
                  MY_PERMISSIONS_REQUEST_ACTIVITY_RECOGNITION);
Run Code Online (Sandbox Code Playgroud)

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

如果您的应用以 SDK 级别 28 或更低为目标,则它必须在其清单文件中指定 com.google.android.gms.permission.ACTIVITY_RECOGNITION 权限。

  • 虽然这个答案适用于针对 API 29 及更高版本进行编译的 Android 应用程序,但这并不能解决主要问题的问题(使用运行 API 29 的设备,但运行针对 API 28 编译的应用程序) (2认同)
  • ACTIVITY_RECOGNITION 权限没有显示在列表中,也没有被我识别。我需要为此包含任何 gradle 依赖项吗?我在我的 AndroidManifest 中包含了 `&lt;uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" /&gt; &lt;uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/&gt;` 。 (2认同)

Kar*_*ton 5

Looks like the documentation was updated: https://developer.android.com/about/versions/10/privacy/changes#physical-activity-recognition

I was able to solve this by only using the API 28 permission in the manifest (com.google.android.gms.permission.ACTIVITY_RECOGNITION).

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

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