我尝试使用共享代码库中的以下代码获取用户的当前位置。
此项目的来源位于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();
}
}
}
我收到以下错误。谷歌没有帮助我!
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
更新: packages.config文件如下所示
<?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>
现在我收到以下错误消息:
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
我错过了什么吗?我已经使用nuget将插件添加到项目中。
答案 0 :(得分:3)
我遇到了同样的错误,我用clean-solution解决了然后重建解决方案,并确保将依赖关系添加到所有proyects
答案 1 :(得分:2)
重新测试您的问题后,我创建了一个新的Shared Project
并在Geolocator.Plugin
上添加了Android Project
。
注意:
插件文档说:
ACCESS_COARSE_LOCATION&amp; ACCESS_FINE_LOCATION权限是 必需,但库会自动为您添加。 此外,如果您的用户正在运行Marshmallow,插件将会 自动提示他们获取运行时权限。
但我必须在Android上手动添加此权限。
Manifest看起来像:
<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);
}
};
刚刚在position.ToString();
放置一个断点,我找到了位置。 (在模拟器和真实设备中测试过。)
<强>注2:强>
尝试在模拟器中打开GPS: