ios health connect added
parent
bfeb3dce4e
commit
a395d9b93a
@ -0,0 +1,164 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
import 'dart:io';
|
||||||
|
import 'package:async/src/result/result.dart';
|
||||||
|
import 'package:health/health.dart';
|
||||||
|
import 'package:hmg_patient_app_new/features/smartwatch_health_data/watch_connectors/watch_helper.dart' show WatchHelper;
|
||||||
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
|
||||||
|
import '../model/Vitals.dart';
|
||||||
|
|
||||||
|
class HealthConnectHelper extends WatchHelper {
|
||||||
|
final Health health = Health();
|
||||||
|
|
||||||
|
final List<HealthDataType> _healthPermissions = [
|
||||||
|
HealthDataType.HEART_RATE,
|
||||||
|
HealthDataType.STEPS,
|
||||||
|
HealthDataType.BLOOD_OXYGEN,
|
||||||
|
HealthDataType.BODY_TEMPERATURE,
|
||||||
|
HealthDataType.DISTANCE_WALKING_RUNNING,
|
||||||
|
HealthDataType.TOTAL_CALORIES_BURNED
|
||||||
|
];
|
||||||
|
|
||||||
|
Map<String , List<Vitals>> mappedData = {};
|
||||||
|
|
||||||
|
@override
|
||||||
|
FutureOr<void> getHeartRate() async {
|
||||||
|
try {
|
||||||
|
final types = [HealthDataType.HEART_RATE];
|
||||||
|
final endDate = DateTime.now();
|
||||||
|
final startDate = endDate.subtract(Duration(days: 365));
|
||||||
|
final data = await getData(startDate, endDate, types);
|
||||||
|
addDataToMap("heartRate",data );
|
||||||
|
} catch (e) {
|
||||||
|
print('Error getting heart rate: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
FutureOr<void> getSleep() async {
|
||||||
|
try {
|
||||||
|
final types = [HealthDataType.SLEEP_IN_BED];
|
||||||
|
final endDate = DateTime.now();
|
||||||
|
final startDate = endDate.subtract(Duration(days: 365));
|
||||||
|
final data = await getData(startDate, endDate, types);
|
||||||
|
addDataToMap("sleep",data );
|
||||||
|
} catch (e) {
|
||||||
|
print('Error getting sleep data: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
FutureOr<void> getSteps() async {
|
||||||
|
try {
|
||||||
|
final types = [HealthDataType.STEPS];
|
||||||
|
final endDate = DateTime.now();
|
||||||
|
final startDate = endDate.subtract(Duration(days: 365));
|
||||||
|
final data = await getData(startDate, endDate, types);
|
||||||
|
addDataToMap("steps",data );
|
||||||
|
print('Steps Data: $data');
|
||||||
|
} catch (e) {
|
||||||
|
print('Error getting steps: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> getActivity() async {
|
||||||
|
try {
|
||||||
|
final types = [HealthDataType.ACTIVE_ENERGY_BURNED];
|
||||||
|
final endDate = DateTime.now();
|
||||||
|
final startDate = endDate.subtract(Duration(days: 365));
|
||||||
|
final data = await getData(startDate, endDate, types);
|
||||||
|
addDataToMap("activity",data );
|
||||||
|
print('Activity Data: $data');
|
||||||
|
} catch (e) {
|
||||||
|
print('Error getting activity: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<dynamic> retrieveData() async {
|
||||||
|
return mappedData;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<dynamic> getBloodOxygen() async {
|
||||||
|
try {
|
||||||
|
final types = [HealthDataType.BLOOD_OXYGEN];
|
||||||
|
final endDate = DateTime.now();
|
||||||
|
final startDate = endDate.subtract(Duration(days: 365));
|
||||||
|
final data = await getData(startDate, endDate, types);
|
||||||
|
addDataToMap("bloodOxygen",data );
|
||||||
|
} catch (e) {
|
||||||
|
print('Error getting blood oxygen: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<dynamic> getBodyTemperature() async {
|
||||||
|
try {
|
||||||
|
final types = [HealthDataType.BODY_TEMPERATURE];
|
||||||
|
final endDate = DateTime.now();
|
||||||
|
final startDate = endDate.subtract(Duration(days: 365));
|
||||||
|
final data = await getData(startDate, endDate, types);
|
||||||
|
addDataToMap("bodyTemperature",data );
|
||||||
|
} catch (e) {
|
||||||
|
print('Error getting body temp erature: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
FutureOr<void> getDistance() async {
|
||||||
|
try {
|
||||||
|
final types = [HealthDataType.DISTANCE_WALKING_RUNNING];
|
||||||
|
final endDate = DateTime.now();
|
||||||
|
final startDate = endDate.subtract(Duration(days: 365));
|
||||||
|
final data = await getData(startDate, endDate, types);
|
||||||
|
addDataToMap("distance",data );
|
||||||
|
} catch (e) {
|
||||||
|
print('Error getting distance: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Result<bool>> initDevice() async {
|
||||||
|
try {
|
||||||
|
final types = _healthPermissions;
|
||||||
|
final granted = await health.requestAuthorization(types);
|
||||||
|
await Permission.activityRecognition.request();
|
||||||
|
await Permission.location.request();
|
||||||
|
// request access to read historic data
|
||||||
|
await Health().requestHealthDataHistoryAuthorization();
|
||||||
|
// await authorize();
|
||||||
|
return Result.value(granted);
|
||||||
|
} catch (e) {
|
||||||
|
print('Authorization error: $e');
|
||||||
|
return Result.error(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getData(startTime, endTime,type) async {
|
||||||
|
return await health.getHealthIntervalDataFromTypes(
|
||||||
|
startDate: startTime,
|
||||||
|
endDate: endTime,
|
||||||
|
types: [type],
|
||||||
|
interval: 86400,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void addDataToMap(String s, data) {
|
||||||
|
mappedData[s] = [];
|
||||||
|
for (var point in data) {
|
||||||
|
if (point.value is NumericHealthValue) {
|
||||||
|
final numericValue = (point.value as NumericHealthValue).numericValue;
|
||||||
|
point.value = NumericHealthValue(
|
||||||
|
numericValue: numericValue * 100,
|
||||||
|
);
|
||||||
|
Vitals vitals = Vitals(
|
||||||
|
value: (point.value as NumericHealthValue).numericValue.toStringAsFixed(2),
|
||||||
|
timestamp: point.dateFrom.toString()
|
||||||
|
);
|
||||||
|
mappedData[s]?.add(vitals);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue