Xamarin表格地理位置任务取消了异常

时间:2016-09-26 13:11:19

标签: xamarin xamarin.android xamarin.forms

我正在使用带有andorid,UWP和Windows 8项目的Xamarin表单应用程序。我正在使用由Jamesmontemagno创建的Geolocation插件来获取当前的设备位置。它在Windows 8和UWP中工作正常,但每当我试图对Android设备运行它时,我一直得到任务取消异常。我已根据建议检查了所有必需的权限,但仍然没有运气。我访问位置的代码位于

之下
  protected override void OnAppearing()
        {
            var locator = CrossGeolocator.Current;
            locator.DesiredAccuracy = 100; //100 is new default
            if (locator.IsGeolocationAvailable && locator.IsGeolocationEnabled)
            {
                try
                {
                    var position = locator.GetPositionAsync(timeoutMilliseconds: 60000).Result;
                    //var pp = helper.Setting.Location;
                    var Latitude = position.Latitude;
                    var Longitude = position.Longitude;
                }
                catch(Exception ex)
                {
                    var exc = ex;
                }
            }
        }

下面是我的Android清单设置的图片 enter image description here

4 个答案:

答案 0 :(得分:3)

尝试使用await中使用的try { var locator = CrossGeolocator.Current; locator.DesiredAccuracy = 50; var position = await locator.GetPositionAsync (timeoutMilliseconds: 10000); Console.WriteLine ("Position Status: {0}", position.Timestamp); Console.WriteLine ("Position Latitude: {0}", position.Latitude); Console.WriteLine ("Position Longitude: {0}", position.Longitude); } catch(Exception ex) { Debug.WriteLine("Unable to get location, may need to increase timeout: " + ex); } 关键字:

TaskCancellationException

这应该注意没有竞争条件,因此 ///sample Data { "_id" : "CUST1234", "Phone Number" : "9585290750", "First Name" : "jeff", "Last Name" : "ayan", "Email ID" : "", "createddate" : 1462559400000.0, "services" : [ { "type" : "Enquiry", "timeSpent" : "0:00", "trxID" : "TRXE20160881", "CustomerQuery" : "Enquiry about travell agent numbers in basaveshwara nagara", "ServiceProvided" : "provided info through whatsapp", "Category" : "Tours/Travels", "callTime" : "2016-05-06T18:30:00.000Z", "ActualAmount" : 0, "FinalAmount" : 0, "DiscountRuppes" : 0, "DiscountPerctange" : 0 }, { "type" : "Enquiry", "timeSpent" : "0:00", "trxID" : "TRXE20160882", "CustomerQuery" : "Enquiry about Electric bill payment of house", "ServiceProvided" : "Service provided", "Category" : "Utility Services", "callTime" : "2016-05-10T18:30:00.000Z", "ActualAmount" : 0, "FinalAmount" : 0, "DiscountRuppes" : 0, "DiscountPerctange" : 0 }, { "type" : "Enquiry", "timeSpent" : "0:00", "trxID" : "TRXE20160883", "CustomerQuery" : "Enquiry about KPSC office number", "ServiceProvided" : "provided info through whatsapp", "Category" : "Govt Offices/Enquiries", "callTime" : "2016-05-13T18:30:00.000Z", "ActualAmount" : 0, "FinalAmount" : 0, "DiscountRuppes" : 0, "DiscountPerctange" : 0 }, { "type" : "Enquiry", "timeSpent" : "0:00", "trxID" : "TRXE20160884", "CustomerQuery" : "Enquiry about Sagara appolo hospital contact number", "ServiceProvided" : "provided the information through call", "Category" : "Hospitals/Equipments", "callTime" : "2016-05-14T18:30:00.000Z", "ActualAmount" : 0, "FinalAmount" : 0, "DiscountRuppes" : 0, "DiscountPerctange" : 0 }, ] }

答案 1 :(得分:3)

对于其他任何即使使用await即时停用的人,仅限Android,即使设备的Google地图应用正常,您可能会遇到this bug发生在某些Android设备上,但其中有相当一部分。

这个问题是谷歌从未修复过的问题。解决方案以及Google地图应用正常运行的一个可能原因是使用Google Play服务'融合地点提供商。

目前Geolocator插件只使用常规的Android位置提供程序,但James已经提到他希望在某些时候使用Fused提供程序。我自己还没试过融合的提供者。

答案 2 :(得分:1)

感谢@Radinator,下面是工作解决方案。

protected async override void OnAppearing()
        {
            var locator = CrossGeolocator.Current;
            locator.DesiredAccuracy = 100; //100 is new default
            if (locator.IsGeolocationAvailable && locator.IsGeolocationEnabled)
            {
                try
                {
                    await SetLocation();
                }
                catch (Exception ex)
                {
                    var exc = ex;
                }
            }
        }

        private async Task SetLocation()
        {
            var locator = CrossGeolocator.Current;
            locator.DesiredAccuracy = 100; //100 is new default
            if (locator.IsGeolocationAvailable && locator.IsGeolocationEnabled)
            {
                try
                {
                    var position = await locator.GetPositionAsync(timeoutMilliseconds: 60000);

                    var Latitude = position.Latitude;
                    var Longitude = position.Longitude;
                }
                catch (Exception ex)
                {
                    //log ex;
                    throw ex;
                }
            }
        }

答案 3 :(得分:0)

面对'任务被杀' v3.0.4的问题。以下对我有用:

  1. 卸载应用
  2. 将Geolocator更新为预发布4.0