2016-01-05 3 views
3

Я пытаюсь получить доступ к текущему местоположению своего устройства в приложении форм Xamarin. Я использую плагин Geolocation, созданный Джеймсом Монтеманьо. Я добавил ссылку в мой проект pcl и платформы, но каждый раз, когда мое приложение попадает в жирную строку кода, я получаю System.Threading.Tasks.TaskCanceledException: A task was canceled.. Я также добавил все необходимые настройки в манифесте android.Xam.Geolocation.Plugin не работает на моем приложении Android

var locator = CrossGeolocator.Current; 

locator.DesiredAccuracy = 100; 

вар позиция = ждут locator.GetPositionAsync (timeoutMilliseconds: 10000);

Вот StackTrace

System.Threading.Tasks.TaskCanceledException: Задача была отменена.
на System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task задача) [0x0002d] в /Users/строитель/данных/полос/2512/d3008455/источник/моно/внешний/referencesource/mscorlib /system/runtime/compilerservices/TaskAwaiter.cs:193 на System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task задачи) [0x0002e] в /Users/строитель/данные/полосах/2512 /d3008455/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:170 в System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (задача System.Threading.Tasks.Task) [0x0000b] в /Пользователи/строитель/данные/l Anes/2512/d3008455/источник/моно/внешний/referencesource/mscorlib/система/времени выполнения/compilerservices/TaskAwaiter.cs: 142 на System.Runtime.CompilerServices.ConfiguredTaskAwaitable 1+ConfiguredTaskAwaiter[TResult].GetResult () [0x00000] in /Users/builder/data/lanes/2512/d3008455/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:580 at Plugin.Geolocator.GeolocatorImplementation+<GetPositionAsync>d__27.MoveNext () [0x00597] in G:\GitHub\Xamarin.Plugins\Geolocator\Geolocator\Geolocator.Plugin.Android\GeolocatorImplementation.cs:195 at --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in /Users/builder/data/lanes/2512/d3008455/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00027] in /Users/builder/data/lanes/2512/d3008455/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:190 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/2512/d3008455/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:170 at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/2512/d3008455/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:142 at System.Runtime.CompilerServices.TaskAwaiter 1 [TResult] .GetResult() [0x00000] в /Users/builder/data/lanes/2512/d3008455/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:372 в NetJetApp.Views.Home + d__52.MoveNext() [ 0x0003e] в c: \ svn \ Netjet \ trunk \ NetJetXamarin \ NetJet \ NetJetApp \ NetJetApp \ Views \ Home.cs: 552 at --- Конец трассировки стека из предыдущего места, где исключение было thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] в /Users/builder/data/lanes/2512/d3008455/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System. Threading.Tasks.Task task) [0x00027] в /Users/builder/data/lanes/2512/d3008455/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:190 at Система .Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача System.Threading.Tasks.Task) [0x0002e] в /Пользователи/builder/data/lanes/2512/d3008455/source/mono/external/sourcesource/mscorlib/system/runtime /compilerservices/TaskAwaiter.cs:170 в System.Runtime.CompilerServices.TaskAwaiter.Va lidateEnd (задача System.Threading.Tasks.Task) [0x0000b] в /Users/builder/data/lanes/2512/d3008455/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs: 142 в System.Runtime.CompilerServices.TaskAwaiter`1 [TResult] .GetResult() [0x00000] в /Пользователи/строитель/данные/полосы/2512/d3008455/источник/моно/внешний источник/источник/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs: 372 at NetJetApp.Views.Home + d__49.MoveNext() [0x00111] в C: \ SVN \ NetJet \ ствол \ NetJetXamarin \ NetJet \ NetJetApp \ NetJetAp на System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] в /Users/строитель/данные/lanes/2512/d3008455p \ Views \ Home.cs: 532 at --- Конец трассировки стека из предыдущего места, где было выбрано исключение ---/source/mono/external/sourcesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs: 143 на System.Runtime.CompilerServices.AsyncMethodBuilderCore.m__0 (System.Object состояние) [0x00000] в /Users/строитель/данных/полос/2512/d3008455/источник/моно/внешний/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs: 994 на Android.App.SyncContext + c__AnonStorey0. <> m__0() [0x00000] в /Users/builder/data/lanes/2512/d3008455/source/monodroid/src/Mono.Android/src/Android.App/SyncContext.cs:18 на Java.Lang. Thread + RunnableImplementor.Run() [0x0000b] в /Users/builder/data/lanes/2512/d3008455/source/monodroid/src/Mono.Android/src/Java.Lang/Thread.cs:36 на Java. Lang.IRunnableInvoker.n_Run (IntPtr jnienv, IntPtr native__this) [0x00009] в /Users/builder/data/lanes/2512/d3008455/source/monodroid/src/Mono.Android/platforms/android-23/src/generated /Java.Lang.IRunnable.cs:71 в точке (оберточной динамического-метода) System.Object: 089044c0-4139-4792-8365-3f98e93136b3 (IntPtr, IntPtr)

+0

Пару вещей, чтобы попробовать, даже если только исключить их. Вы пробовали меньшую 'DesiredAccuracy'? Наши приложения используют 50. Сначала проверяет ли код 'locator.IsGeolocationEnabled'? –

+0

Я пробовал 50, но я не нахожу победы, нет, я не сделал чек, где я должен это делать – sipho

+0

Я пойду дальше и отправлю ответ с кодом, который мы используем. –

ответ

0

В моем тестировании существует определенная корреляция между истечением тайм-аута GetPositionAsync и исключением TaskCanceledException, поэтому большее значение может уменьшить вероятность этого исключения. Я определенно хочу поблагодарить вас за ваш вопрос, потому что это заставило меня более внимательно изучить этот код в наших рамках.

Конечно, код приложения должен обрабатывать реальность того, что устройство не сможет предоставить позицию в разумные сроки по любому ряду причин.

Чтобы помочь с сбоем, приведенный ниже код представлен в проекте Xamarin.Forms PCL, который используется в проектах Xamarin.Android и Xamarin.iOS, приложения которых находятся в магазинах приложений.

Не существует существенных различий между этим и тем, что вы разместили, кроме проверки на IsGeolocationEnabled и обработки исключений, но с этой обработкой исключений и операциями отладки, надеюсь, он предотвращает крах приложения и помогает вам продвигаться дальше.

public static async Task<Position> GetCurrentLocation() 
{ 
    // Capture the current location. 
    Position position = null; 
    try 
    { 
     var locator = CrossGeolocator.Current; 
     locator.DesiredAccuracy = 50; 

     // Get the current device position. Leave it null if geo-location is disabled, 
     // return position (0, 0) if unable to acquire. 
     if (locator.IsGeolocationEnabled) 
     { 
      // Allow ten seconds for geo-location determination.      
      position = await locator.GetPositionAsync(10000); 
     } 
     else 
     { 
      Debug.WriteLine("Location could not be acquired, geolocator is disabled."); 
     } 
    } 
    catch (Exception le) 
    { 
     // TODO: Log this error. 
     Debug.WriteLine("Location could not be acquired."); 
     Debug.WriteLine(le.Message); 
     Debug.WriteLine(le.StackTrace); 
     position = new Position() { Latitude = 0, Longitude = 0 }; 
    } 

    return position; 
} 
0

У меня была такая же проблема с использованием общей библиотеки Xamarin.Forms. Я решил это на iOS, но я все еще работаю над версией Android.

Примечание: Необходимо включить пакет Xam.Plugin.Geolocator во всех проектах

Я надеюсь, что этот код может помочь вам


В общей библиотеке у меня есть следующий :

  • app.xaml
  • App.xaml.cs
  • MyAppPage.xaml
  • MyAppPage.xaml.CS

В библиотеке IOS я изменил только

  • AppDelegate.cs

Файл Содержание:

  • Изменения в App.xaml.cs

    public App(IGeolocator geolocator) 
    { 
        InitializeComponent(); 
        MainPage = new MySpeedPage(geolocator); 
    } 
    
  • MyAppPage.xaml.cs

    public partial class MyAppPage : ContentPage 
    { 
        readonly IGeolocator geolocator; 
    
        public MyAppPage(IGeolocator geolocator) 
        { 
         InitializeComponent(); 
         this.geolocator = geolocator; 
         this.geolocator.DesiredAccuracy = 50; 
         this.geolocator.PositionChanged += new EventHandler<PositionEventArgs>(OnGeolocatorPositionChanged); 
        } 
    
        void OnGeolocatorPositionChanged(object sender, PositionEventArgs e) 
        { 
         LabLatitude.Text = String.Format("Lat: {0:F4}", e.Position.Latitude); 
         LabLongitude.Text = String.Format("Lon: {0:F4}", e.Position.Longitude); 
        } 
    
        void OnBtnStartClicked(object sender, EventArgs args) 
        { 
         BtnStart.IsEnabled = false; 
         BtnStop.IsEnabled = true; 
         geolocator.StartListeningAsync(2500, 10.0f, true); 
        } 
    
        void OnBtnStopClicked(object sender, EventArgs args) 
        { 
         BtnStart.IsEnabled = true; 
         BtnStop.IsEnabled = false; 
         geolocator.StopListeningAsync(); 
        } 
    
    } 
    
  • Изменения в "AppDelegate.cs"

    public override bool FinishedLaunching(UIApplication app, NSDictionary options) 
    { 
        global::Xamarin.Forms.Forms.Init(); 
    
        var MyApp = new App(CrossGeolocator.Current); 
        LoadApplication(MyApp); 
    
        return base.FinishedLaunching(app, options); 
    } 
    
Смежные вопросы