Xamarin Android模拟位置仅在应用程序处于前台时发布

时间:2018-07-22 16:44:34

标签: android xamarin service

我刚开始一个简单的GPS Mock Position应用程序。似乎可以成功发送模拟位置(使用GPS状态应用程序指示我发送的坐标)。但是,一旦我将应用程序切换到另一个应用程序,就好像不再将模拟位置发送到android设备。即当我从应用程序切换到GPS状态页面时,可以看到发送的坐标,但是上次修复的时间戳未更新,并且说GPS处于不活动状态。一旦切换回我的应用程序,位置将再次更新。 在调试模式下,我始终可以看到应用程序的日志输出,而与后台或后台无关。 为了发送该位置,我尝试了几件事。当前状态是服务:

using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Locations;
using System.Threading;
using System.Threading.Tasks;

namespace Android_Test
{
    [Service]
    public class SetLocation : Service
    {
        public override IBinder OnBind(Intent intent)
        {
            return null;
        }

        [return: GeneratedEnum]
        public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
        {
            Console.WriteLine("SERVICE START");
            var cts = new CancellationToken();
            Task.Run(async () =>
            {
                await SendPosition();
            }, cts);
            return StartCommandResult.Sticky;
        }

        private async Task SendPosition()
        {
            while (true)
            {
                try
                {
                    Console.WriteLine("Send Position ");
                    var locationManager = (LocationManager)GetSystemService(LocationService);
                    locationManager.AddTestProvider(LocationManager.GpsProvider, false, false, false, false, false, false, false, Power.Low, Android.Hardware.SensorStatus.AccuracyHigh);
                    locationManager.SetTestProviderEnabled(LocationManager.GpsProvider, true);

                    var location = new Location(LocationManager.GpsProvider);
                    location.Latitude = 10;
                    location.Longitude = 11;

                    location.Accuracy = 2;
                    location.Time = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalMilliseconds;
                    location.ElapsedRealtimeNanos = Android.OS.SystemClock.CurrentThreadTimeMillis();
                    location.Speed = 0.0f;
                    location.Altitude = 1.0;
                    location.Bearing = 0.0f;

                    locationManager = (LocationManager)GetSystemService(LocationService);
                    locationManager.SetTestProviderLocation(LocationManager.GpsProvider, location);

                }
                catch (Exception ex)
                {
                    Console.WriteLine("ERROR Sending position:" + ex.Message);
                }
                await Task.Delay(1000);
            }
        }
    }
}

从MainActivity调用哪个

 [Activity(Label = "Android_Test", MainLauncher = true)]
    public class MainActivity : Activity
    {            
        string logtag = "MainActivity";

        protected override void OnCreate(Bundle savedInstanceState)
        {                
            base.OnCreate(savedInstanceState);
            Log.Info(logtag, "#### INIT Android TEST APP ####");                
            SetContentView(Resource.Layout.Main);                
            var intent = new Intent(this, typeof(SetLocation));
            StartService(intent);
        }
}

那我想念的是什么?

0 个答案:

没有答案