C# Windows Phone 8.1在锁定屏幕后录制GPS

C# Windows Phone 8.1在锁定屏幕后录制GPS,c#,timer,gps,windows-phone-8.1,lockscreen,C#,Timer,Gps,Windows Phone 8.1,Lockscreen,首先,我想指出,我正在创建的应用程序是一个Windows Phone 8.1 RT Store应用程序(不是Silverlight应用程序) 我目前正在创建一个应用程序,作为我大学最后一年项目的一部分,作为团队的一部分。我遇到的问题是,对于应用程序的一部分,我需要能够在地图上记录一个区域。也就是说,用户在特定区域走动,我们存储该区域以供应用程序的其他部分使用 我目前能够使用GPS记录位置,并能够在地图上准确显示。导致我出现问题的地方是,需要解锁屏幕并打开屏幕才能工作。一旦手机锁定,应用程序(显然

首先,我想指出,我正在创建的应用程序是一个Windows Phone 8.1 RT Store应用程序(不是Silverlight应用程序)

我目前正在创建一个应用程序,作为我大学最后一年项目的一部分,作为团队的一部分。我遇到的问题是,对于应用程序的一部分,我需要能够在地图上记录一个区域。也就是说,用户在特定区域走动,我们存储该区域以供应用程序的其他部分使用

我目前能够使用GPS记录位置,并能够在地图上准确显示。导致我出现问题的地方是,需要解锁屏幕并打开屏幕才能工作。一旦手机锁定,应用程序(显然)就会暂停,我无法记录位置

我一直在网上查看,发现以前允许应用程序在锁屏后运行的方法已被Windows Phone 8.1删除,所以我想问你的问题是,有人找到了其他方法吗

这是我目前拥有的代码。。我使用调度计时器每20秒记录一次GPS,然后将该位置添加到我拥有的列表中

代码:


按下按钮时会调用
getLoc
,我还有另一个按钮可以停止
dispatchTimer
。需要计时器,但当前设置的时间范围用于测试目的。

当应用程序挂起时,所有时间也将停止,并且应用程序根本没有获得任何CPU时间,这意味着没有代码可以执行

如果要在手机锁定时进行处理,必须执行后台任务:

在Windows Phone 8.1中,有一个新的地理围栏API,允许您定义感兴趣的区域,当手机进入或离开这些区域时,将调用后台任务

此外,您还可以使后台任务由计时器调用(每15分钟一次),然后记录当前位置


最后,您可以使用诺基亚传感器核心SDK:。它可能会提供您想要的功能,但它只能在Lumia手机上使用。

听起来您只是想防止应用程序运行时出现锁屏。下面是另一篇文章,告诉您如何做到这一点(查看8.1 RT应用程序的一些条目):

如果你真的想让它在不是前台应用程序的情况下收集信息,处理这个问题的一种方法是执行Jogy said并创建一个在计时器上运行的后台任务。但你不可能每20秒做一次,除非你有一部SensorCore手机,否则每15分钟做一次就可以了。如果您购买的SensorCore手机(最新的诺基亚/微软手机)固件更新最新(请与运营商联系,确保您拥有诺基亚最新发布的固件),即使在后台,您也可以每30秒获得一次更新


SensorCore还将存储最近10天的信息,以便应用程序第一次启动时就有历史记录。但请注意,您并不是每30秒请求一次更新,如果其他人请求更新(例如,驾驶应用程序或其他应用程序),您会得到更新,它只允许您访问某些应用程序请求的位置。请参阅SDK文档

提供的诺基亚链接现已失效。
    public void getLoc()
    {


        Debug.WriteLine("Start");
        startButtonEnabled = false;
        stopButtonEnabled = true;


        FindGPS();


        dispatcherTimer.Tick += FindGPS_Event;
        dispatcherTimer.Interval = new TimeSpan(0, 0, 20);
        dispatcherTimer.Start();
    }


    private void FindGPS_Event(object sender, object o)
    {
        FindGPS();
    }
    private async Task FindGPS()
    {
        Debug.WriteLine("Find GPS");
        try
        {
            Geoposition position = await geolocator.GetGeopositionAsync();
            location.Longitude = position.Coordinate.Point.Position.Longitude;
            location.Latitude = position.Coordinate.Point.Position.Latitude;
            location.Accuracy = position.Coordinate.Accuracy;
            location.GeoLocation =
                new Geopoint(new BasicGeoposition() {Latitude = location.Latitude, Longitude = location.Longitude});
            zoomLevel = 18;
        }
        catch (UnauthorizedAccessException)
        {
            Debug.WriteLine("No Data");
        }
        catch (TaskCanceledException)
        {
            Debug.WriteLine("Cancelled");
        }
        finally
        {
            Pushpin icon = new Pushpin()
            {
                Point =
                    new Geopoint(new BasicGeoposition()
                    {
                        Latitude = location.Latitude,
                        Longitude = location.Longitude
                    }),
                Name = "Location"
            };
            location.IconOnMap.Add(icon);
        }
    }