2016-06-28 11 views
3

Ich habe versucht, den aktuellen Standort des Benutzers mithilfe des folgenden Codes in Shared Code Library zu erhalten.Xamarin Plugin.Geolocator funktioniert nicht

Quelle des Projekts finden Sie hier bei Dropbox link

using System; 
using System.Diagnostics; 
using Plugin.Geolocator; 
using Plugin.Geolocator.Abstractions; 

namespace SampleApp 
{ 
    public class LocationManager 
    { 
     private DateTimeOffset timestamp; 

     private double latitude; 

     private double longitude; 

     IGeolocator locator; 

     public LocationManager() 
     { 
      asyncInitLocation(); 
     } 

     private async void asyncInitLocation() 
     { 
      try 
      { 
       locator = CrossGeolocator.Current; 
       locator.DesiredAccuracy = 50; 

       if (locator.IsGeolocationEnabled) 
       { 
        var position = await locator.GetPositionAsync(timeoutMilliseconds: 20000); 
        timestamp = position.Timestamp; 
        latitude = position.Latitude; 
        longitude = position.Longitude; 
       } 
       else 
       { 
        Debug.WriteLine("Geolocation is disabled!"); 
       } 
      } 
      catch (Exception ex) 
      { 
       Debug.WriteLine("Unable to get location, may need to increase timeout: " + ex); 
      } 
     } 

     public DateTimeOffset getTimestamp() 
     { 
      return this.timestamp; 
     } 

     public double getLatitude() 
     { 
      return this.latitude; 
     } 

     public double getLongitude() 
     { 
      return this.longitude; 
     } 

     public void refresh() 
     { 
      asyncInitLocation(); 
     } 
    } 
} 

Ich bin der unten Fehler. Google hat mir nicht geholfen!

Unable to get location, may need to increase timeout: System.NotImplementedException: This functionality is not implemented in the portable version of this assembly. You should reference the NuGet package from your main application project in order to reference the platform-specific implementation. 
    at Plugin.Geolocator.CrossGeolocator.get_Current() <0x52c7bb60 + 0x0003f> in <filename unknown>:0 
    at SampleApp.LocationManager+<asyncInitLocation>c__async0.MoveNext() <0x52c7ae60 + 0x000bf> in <filename unknown>:0 

Update: packages.config Datei sieht wie folgt aus

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="Microsoft.Bcl" version="1.1.10" targetFramework="portable-net45+win+wp80+MonoTouch10+MonoAndroid10+xamarinmac20+xamarintvos10+xamarinwatchos10+xamarinios10" /> 
    <package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="portable-net45+win+wp80+MonoTouch10+MonoAndroid10+xamarinmac20+xamarintvos10+xamarinwatchos10+xamarinios10" /> 
    <package id="Microsoft.Net.Http" version="2.2.29" targetFramework="portable-net45+win+wp80+MonoTouch10+MonoAndroid10+xamarinmac20+xamarintvos10+xamarinwatchos10+xamarinios10" /> 
    <package id="modernhttpclient" version="2.4.2" targetFramework="portable-net45+win+wp80+MonoTouch10+MonoAndroid10+xamarinmac20+xamarintvos10+xamarinwatchos10+xamarinios10" /> 
    <package id="Newtonsoft.Json" version="8.0.3" targetFramework="portable-net45+win+wp80+MonoTouch10+MonoAndroid10+xamarinmac20+xamarintvos10+xamarinwatchos10+xamarinios10" /> 
    <package id="Xam.Plugin.Geolocator" version="3.0.4" targetFramework="portable-net45+win+wp80+MonoTouch10+MonoAndroid10+xamarinmac20+xamarintvos10+xamarinwatchos10+xamarinios10" /> 
</packages> 

Jetzt habe ich die folgenden Fehlermeldung erhalten:

Unable to get location, may need to increase timeout: System.Threading.Tasks.TaskCanceledException: A task was canceled. 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x0002d] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:179 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 
    at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 
    at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[TResult].GetResult() [0x00000] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:535 
    at Plugin.Geolocator.GeolocatorImplementation+<GetPositionAsync>d__27.MoveNext() [0x00597] in C:\projects\xamarin-plugins\Geolocator\Geolocator\Geolocator.Plugin.Android\GeolocatorImplementation.cs:175 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in /Users/builder/data/lanes/3415/7db2aac3/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/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:176 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 
    at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 
    at System.Runtime.CompilerServices.TaskAwaiter`1[TResult].GetResult() [0x00000] in /Users/builder/data/lanes/3415/7db2aac3/source/mono/external/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:357 
    at BugsAndDrugs.LocationManager+<asyncInitLocation>c__async0.MoveNext() [0x000d4] in /Users/myname/Perforce/depot/test_sandbox/Playground/SampleApp/SampleApp/Manager/LocationManager.cs:32 

bin ich etwas fehlt? Ich habe die Plugins mit nuget zum Projekt hinzugefügt.

+0

@jzeferino die Frage aktualisiert – brainless

+0

@jzeferino Native – brainless

+0

@jzef erino Die Dokumentation besagt, dass die Berechtigungen, die für den Zugriff auf den Standort benötigt werden, vom Plugin selbst hinzugefügt werden! – brainless

Antwort

2

nach dem Problem erneut zu testen, ich habe ein neues Shared Project erstellt und hinzugefügt, um die Geolocator.Plugin auf Android Project.

HINWEIS:

Das Plugin Dokumentation sagt:

Die ACCESS_COARSE_LOCATION & ACCESS_FINE_LOCATION Berechtigungen sind erforderlich, aber die Bibliothek wird dies automatisch für Sie hinzufügen. Außerdem, wenn Ihre Benutzer Marshmallow ausführen, wird das Plugin automatisch für Laufzeitberechtigungen aufgefordert.

Aber ich muss diese Berechtigung manuell auf Android hinzufügen.

Manifest wie folgt aussieht:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="pt.sushiathome.shared_geolocator"> 
    <uses-sdk android:minSdkVersion="15" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <application android:label="shared.geolocator"> 
    </application> 
</manifest> 

MainActivity:

Button button = FindViewById<Button>(Resource.Id.myButton); 

button.Click += async delegate 
{ 
    try 
    { 
     var locator = CrossGeolocator.Current; 
     locator.DesiredAccuracy = 50; 

     if (locator.IsGeolocationEnabled) 
     { 
      var position = await locator.GetPositionAsync(timeoutMilliseconds: 10000); 
      position.ToString(); 
     } 
     else 
     { 
      System.Diagnostics.Debug.WriteLine("Geolocation is disabled!"); 
     } 
    } 
    catch (Exception ex) 
    { 
     System.Diagnostics.Debug.WriteLine("Unable to get location, may need to increase timeout: " + ex); 
    } 
}; 

nur einen Haltepunkt in position.ToString(); platziert und ich die Lage bekam. (Getestet in Emulator und realen Gerät.)

NOTE2:

Versuchen auf dem GPS in Emulator zu wechseln:

enter image description here

3

hatte ich den gleichen Fehler, löste ich mit clean- Lösung und dann Lösung neu erstellen, und stellen Sie sicher, dass Abhängigkeiten zu allen Projekten hinzugefügt werden

Verwandte Themen