Health Connect revokeAllPermissions() не меняет состояние разрешений в Health Connect для данного сеанса приложения

Я получаю статус разрешения true даже после вызова revokePermissions().
Когда я проверил настройку Health Connect после вызова revokeAllPermissions() и пока мое приложение работало в фоновом режиме, это показало, что приложению все еще разрешены разрешения Health Connect. Но при следующей перезагрузке приложения отображается, что приложение было отключено от Health Connect.

Видел ту же проблему в Health Connects Пример приложения

У меня есть функция на стороне Flutter, которая выглядит следующим образом:

void revoke() {
          revokePermission();
          checkForPermissions();
          Get.back();
}

Это вызывает две собственные функции Android:
revokePermissions() и checkForPermissions() соответственно.

Их соответствующие реализации следующие:

private fun revokePermissions() {
        scope.launch {
            if (healthConnectAvailable && !::healthConnectClient.isInitialized) {
                healthConnectClient = HealthConnectClient.getOrCreate(context!!)
            }
            healthConnectClient.permissionController.revokeAllPermissions()
        }

    }

и

private fun checkForPermissions(call: MethodCall, result: Result) {
        val args = call.arguments as HashMap<*, *>
        val types =
            (args["types"] as? ArrayList<*>)?.filterIsInstance<String>()!!
        val permissions =
            (args["permissions"] as? ArrayList<*>)?.filterIsInstance<Int>()!!

        var permList = mutableListOf<String>()
        for ((i, typeKey) in types.withIndex()) {
            val access = permissions[i]!!
            val dataType = MapToHCType[typeKey]!!
            if (access == 0) {
                permList.add(
                    HealthPermission.getReadPermission(dataType),
                )
            } else {
                permList.addAll(
                    listOf(
                        HealthPermission.getReadPermission(dataType),
                        HealthPermission.getWritePermission(dataType),
                    )
                )
            }
            // Workout also needs distance and total energy burned too
            if (typeKey == WORKOUT) {
                if (access == 0) {
                    permList.addAll(
                        listOf(
                            HealthPermission.getReadPermission(DistanceRecord::class),
                            HealthPermission.getReadPermission(
                                TotalCaloriesBurnedRecord::class
                            ),
                        )
                    )
                } else {
                    permList.addAll(
                        listOf(
                            HealthPermission.getReadPermission(DistanceRecord::class),
                            HealthPermission.getReadPermission(
                                TotalCaloriesBurnedRecord::class
                            ),
                            HealthPermission.getWritePermission(DistanceRecord::class),
                            HealthPermission.getWritePermission(
                                TotalCaloriesBurnedRecord::class
                            ),
                        )
                    )
                }
            }
        }
        scope.launch {
            if (healthConnectAvailable && !::healthConnectClient.isInitialized) {
                healthConnectClient = HealthConnectClient.getOrCreate(context!!)
            }
            var temp =
                healthConnectClient.permissionController.getGrantedPermissions()
                    .containsAll(permList)
            print(temp)
            result.success(temp)
        }
    }
1
0
422
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это предполагаемое поведение, поскольку разрешения Health Connect соответствуют стандартной модели разрешений в Android 14+. Вы можете увидеть ссылку на это поведение в документации для разработчиков Android здесь: https://developer.android.com/training/permissions/requesting#remove-access

Поэтому я думаю, нам нужно разобраться с этим отдельно, если нам нужно изменить какой-то пользовательский интерфейс в соответствии с разрешением. Спасибо!

Madhav Sunil 01.04.2024 06:18

Другие вопросы по теме