walking_page.dart 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_activity_recognition/flutter_activity_recognition.dart';
  4. import 'package:geolocator/geolocator.dart';
  5. class WalkingPage extends StatefulWidget {
  6. WalkingPage({Key? key}) : super(key: key);
  7. @override
  8. State<WalkingPage> createState() => _WalkingPageState();
  9. }
  10. class _WalkingPageState extends State<WalkingPage> {
  11. final FlutterActivityRecognition activityRecognition = FlutterActivityRecognition.instance;
  12. final StreamController<Position> _streamController = StreamController.broadcast();
  13. num distance = 0;
  14. Position? lastPosition;
  15. @override
  16. void dispose() {
  17. _streamController.close();
  18. super.dispose();
  19. }
  20. @override
  21. Widget build(BuildContext context) {
  22. Geolocator.getPositionStream(locationSettings: LocationSettings(distanceFilter: 1)).listen((position) {
  23. _streamController.add(position);
  24. print(position);
  25. });
  26. return Scaffold(
  27. body: Center(
  28. child: Column(
  29. mainAxisAlignment: MainAxisAlignment.center,
  30. children: [
  31. FutureBuilder<bool>(
  32. future: isPermissionGrants(),
  33. builder: (context, snapshot) {
  34. if (snapshot.hasData && snapshot.data!) {
  35. return StreamBuilder<Activity>(
  36. stream: activityRecognition.activityStream,
  37. builder: (context, snapshot) {
  38. if (snapshot.hasData) {
  39. return Text("${snapshot.data!.type}, ${snapshot.data!.confidence}");
  40. } else {
  41. return CircularProgressIndicator();
  42. }
  43. },
  44. );
  45. } else {
  46. return CircularProgressIndicator();
  47. }
  48. },
  49. ),
  50. StreamBuilder<Position>(
  51. stream: _streamController.stream,
  52. builder: (context, snapshot) {
  53. if (snapshot.hasData) {
  54. final position = snapshot.data!;
  55. final latitude = position.latitude;
  56. final longitude = position.longitude;
  57. final currentActivity = activityRecognition.activityStream.last;
  58. if (lastPosition != null) {
  59. distance += Geolocator.distanceBetween(
  60. lastPosition!.latitude, lastPosition!.longitude, position.latitude, position.longitude);
  61. }
  62. lastPosition = position;
  63. return Text("${latitude}, ${longitude}, DISTANCE: ${distance.round()}");
  64. } else {
  65. return CircularProgressIndicator();
  66. }
  67. },
  68. ),
  69. ],
  70. ),
  71. ),
  72. );
  73. }
  74. Future<bool> isPermissionGrants() async {
  75. // Check if the user has granted permission. If not, request permission.
  76. PermissionRequestResult reqResult;
  77. reqResult = await activityRecognition.checkPermission();
  78. if (reqResult == PermissionRequestResult.PERMANENTLY_DENIED) {
  79. print('Permission is permanently denied.');
  80. return false;
  81. } else if (reqResult == PermissionRequestResult.DENIED) {
  82. reqResult = await activityRecognition.requestPermission();
  83. if (reqResult != PermissionRequestResult.GRANTED) {
  84. print('Permission is denied.');
  85. return false;
  86. }
  87. }
  88. return true;
  89. }
  90. Future<void> _getPermissions() async {
  91. bool serviceEnabled;
  92. LocationPermission permission;
  93. // Test if location services are enabled.
  94. serviceEnabled = await Geolocator.isLocationServiceEnabled();
  95. if (!serviceEnabled) {
  96. // Location services are not enabled don't continue
  97. // accessing the position and request users of the
  98. // App to enable the location services.
  99. return Future.error('Location services are disabled.');
  100. }
  101. permission = await Geolocator.checkPermission();
  102. if (permission == LocationPermission.denied) {
  103. permission = await Geolocator.requestPermission();
  104. if (permission == LocationPermission.denied) {
  105. // Permissions are denied, next time you could try
  106. // requesting permissions again (this is also where
  107. // Android's shouldShowRequestPermissionRationale
  108. // returned true. According to Android guidelines
  109. // your App should show an explanatory UI now.
  110. return Future.error('Location permissions are denied');
  111. }
  112. }
  113. if (permission == LocationPermission.deniedForever) {
  114. // Permissions are denied forever, handle appropriately.
  115. return Future.error('Location permissions are permanently denied, we cannot request permissions.');
  116. }
  117. }
  118. }