Android ACTIVITY_RECOGNITION Permission SDK 28, работающий на Android 10/Q (SDK 29)

Мое приложение для Android ориентировано на SDK 28 и подключается к Google Fit для загрузки данных и чтения некоторых других данных. Приложение использует HistoryAPI для чтения данных com.google.step_count.delta.

В этой документации утверждается, что "разрешение com.google.android.gms.permission.ACTIVITY_RECOGNITION преобразуется в заранее предоставленное разрешение времени выполнения", если приложение предназначено для SDK 28, но работает на SDK 29: https://developers.google.com/fit/android/authorization

Я добавил в манифест приложения, как сказано в документации.

Когда это приложение для 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 ответа

Решено: в 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 в своем файле манифеста.

Похоже, документация обновлена: https://developer.android.com/about/versions/10/privacy/changes

Я смог решить эту проблему, используя только разрешение 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).

Не уверен, помогает ли это решить вашу проблему, но помогает нам решить аналогичную проблему. Сначала проверьте, разрешена ли физическая активность для вашего приложения / пользователя - скорее всего, нет. Если вы разрешите - ваш код должен работать без исключения.

Проблема для нас заключалась в том, как определить, что com.google.android.gms.permission.ACTIVITY_RECOGNITION разрешен (работает в target sdk 28 на Android 10) - поскольку call

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

всегда возвращает истину (даже в разрешении отказано)

обходной путь (для вашего целевого приложения sdk 28, работающего на Android 10) заключается в вызове 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. в начале основного действия или любого подходящего действия запустите вышеуказанный вызов, который запросит у пользователя разрешение
Другие вопросы по тегам