Отслеживать движение пользователей и обновлять наложение Polyline, используя фоновый сервис Android? - PullRequest
0 голосов
/ 30 мая 2018

Я работаю над созданием приложения для отслеживания фитнеса.В настоящее время мое приложение будет отслеживать движение пользователей и отображать наложение ломаной линии на фрагменте карт Google именно так, как я этого хочу.Единственная проблема заключается в том, что он делает это только тогда, когда приложение открыто (то есть не работает в фоновом режиме или когда телефон заблокирован).Я понял, что я хочу бороться с этим путем использования сервиса, чтобы продолжать отслеживать мое местоположение в фоновом режиме.Я очень новичок в разработке приложений для Android и у меня есть несколько вопросов.Смогу ли я обновить полилинию в фоновом режиме, чтобы при повторном открытии приложения маршрут их тренировки был обновлен?Как именно я могу превратить мою текущую активность Android, которая отслеживает движение пользователей, в службу, которая отслеживает его, даже когда телефон заблокирован?Ниже приведена активность, которая отслеживает все движения пользователей.

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Android.App;
using Android.Content;
using Android.Gms.Maps;
using Android.Gms.Maps.Model;
using Android.Locations;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Plugin.CurrentActivity;
using Plugin.Geolocator;
using Plugin.Geolocator.Abstractions;

namespace TriTrack
{
    [Activity(Label = "MapsActivity")]
    public class MapsActivity : Activity, IOnMapReadyCallback
    {
        GoogleMap daMap;
        Position position;
        IGeolocator locator = CrossGeolocator.Current;
        double lat;
        double _long;
        TextView latlonglist;
        PolylineOptions polyline = new PolylineOptions().InvokeWidth(20).InvokeColor(Color.Red.ToArgb());

        MarkerOptions start = new MarkerOptions();
        bool WorkoutInProgress = false;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            CrossCurrentActivity.Current.Activity = this;
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.Map);
            MapFragment mapFragment = (MapFragment)FragmentManager.FindFragmentById(Resource.Id.the_fucking_map);
            mapFragment.GetMapAsync(this);
            Button switchB = FindViewById<Button>(Resource.Id.switch_button);
            latlonglist = FindViewById<TextView>(Resource.Id.LATLONG);
            getPos();

            switchB.Click += delegate
            {
                if(WorkoutInProgress == false){
                    WorkoutInProgress = true;
                    start.SetPosition(new LatLng(position.Latitude, position.Longitude));
                    start.SetTitle("Start");
                    daMap.AddMarker(start);
                    polyline.Add(new LatLng(position.Latitude, position.Longitude));
                    StartListening();
                    LatLng latlng = new LatLng(position.Latitude, position.Longitude);  
                    CameraUpdate camera = CameraUpdateFactory.NewLatLngZoom(latlng, 15);  
                    daMap.MoveCamera(camera);
                    switchB.Text = "WORKOUT IN PROGRESS";
                }
                else{
                    WorkoutInProgress = false;
                    StopListening();
                    Android.App.AlertDialog.Builder diaglog = new AlertDialog.Builder(this);
                    AlertDialog alert = diaglog.Create();
                    alert.SetTitle("Good Work");
                    alert.SetMessage("Your workout is complete, would you like to record it?");
                    alert.SetButton("Yes", (c, ev) => {
                        alert.Dismiss(); //TODO: save polyine data to new table in the database.
                    });
                    alert.SetButton2("No", (c, ev) =>{
                        alert.Dismiss(); 
                    });
                    alert.Show();

                }



            };

        }

        void Locator_PositionChanged(object sender, PositionEventArgs e)
        {
            position = e.Position;
            string latstring = position.Latitude.ToString();
            string longstring = position.Latitude.ToString();
            latlonglist.Text += (latstring + "," + longstring + "\n");
            DrawMarker();
            //FindViewById<Button>(Resource.Id.switch_button).Text = position.Latitude.ToString();
        }


        public void DrawMarker(){
            lat = position.Latitude;
            _long = position.Longitude;
            polyline.Add(new LatLng(lat, _long));
            //polyline.Add(new LatLng(40.739487, -96.65715119999999)); THIS IS FOR DEBUGGING
            daMap.AddPolyline(polyline);
        }


        public void OnMapReady(GoogleMap googleMap)
        { 
            daMap = googleMap;
            daMap.MapType = GoogleMap.MapTypeHybrid;
            getPos();
        }
        public async void getPos(){
            position = await locator.GetPositionAsync();

        }
        public async void StartListening(){
            await locator.StartListeningAsync(new TimeSpan(0, 0, 0, 3), 0.0, true, new Plugin.Geolocator.Abstractions.ListenerSettings
            {
                ActivityType = Plugin.Geolocator.Abstractions.ActivityType.Fitness,
                AllowBackgroundUpdates = true
            });
            locator.PositionChanged += Locator_PositionChanged;
        }

        public async void StopListening(){
            await locator.StopListeningAsync();
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...