2016-06-28 15 views
3

共有コードライブラリで次のコードを使用して、ユーザーの現在の場所を取得しようとしました。プロジェクトのXamarin Plugin.Geolocator not working

ソースは、私は以下のエラーを取得しています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(); 
     } 
    } 
} 

でここに提供されています。 Googleは私を助けなかった!

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 

を私は何かが足りないのですか?私は、プロジェクトにナゲットを使用してプラグインを追加しました。

+0

@jzeferinoが質問を更新しました – brainless

+0

@jzeferinoネイティブ – brainless

+0

@jzef erinoドキュメントには、場所へのアクセスに必要な権限がプラグイン自体によって追加されることが記載されています。 – brainless

答えて

2

問題を再テストした後、新しいShared Projectを作成し、Geolocator.PluginAndroid Projectに追加しました。

プラグインのドキュメントは言う:

ACCESS_COARSE_LOCATION & ACCESS_FINE_LOCATION権限が必要 ですが、ライブラリは自動的にあなたのためにこれを追加します。 さらに、ユーザーがMarshmallowを実行している場合、プラグインは に自動的に実行時アクセス許可を要求します。

しかし、この許可を手動でAndroidに追加する必要があります。マニフェストがどのように見える

<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をオンにしてください:

enter image description here

3

私は無害で解決、同じエラーが発生しましたソリューションを再構築し、すべてのプロジェクトに依存関係が追加されていることを確認してください。