Я получаю статус разрешения 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)
}
}
Это предполагаемое поведение, поскольку разрешения Health Connect соответствуют стандартной модели разрешений в Android 14+. Вы можете увидеть ссылку на это поведение в документации для разработчиков Android здесь: https://developer.android.com/training/permissions/requesting#remove-access
Поэтому я думаю, нам нужно разобраться с этим отдельно, если нам нужно изменить какой-то пользовательский интерфейс в соответствии с разрешением. Спасибо!