2016-12-26 2 views
0

私は最近Xamarin.formsで6.0にsdkレベルを更新しました。 Xamlを使用してページにマップを配置しました。マップを表示するには、6.0に更新された権限が必要です。今私の問題は、アプリがそれを表示しようとする前に地図を表示する許可を要求する方法を理解できないことです。その結果、私は処理されない例外が発生します。Xamlで設定したマップを表示する前に、場所の許可をリクエストする方法。 Xamarin.Forms

public MapPage() 
     { 
      Init(); 
      InitializeComponent(); 


      azureService = AzureService.defaultManager; 

     } 
     private async Task Init() 
     { 
      await RequestLocationPermission(); 
     } 
     protected async override void OnAppearing() 
     { 
      base.OnAppearing(); 

      MyMap.MoveToRegion(
       MapSpan.FromCenterAndRadius(
        new Position(0, 0), 
        Distance.FromMiles(10.0))); 

     } 

private async Task RequestLocationPermission() 
     { 
      try 
      { 
       var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Location); 
       if (status != PermissionStatus.Granted) 
       { 
        if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Location)) 
        { 
         await DisplayAlert("Need location", "Gunna need that location", "OK"); 
        } 

        var results = await CrossPermissions.Current.RequestPermissionsAsync(new[] { Permission.Location }); 
        status = results[Permission.Location]; 
       } 

       if (status == PermissionStatus.Granted) 
       { 
             } 
       else if (status != PermissionStatus.Unknown) 
       { 
        await DisplayAlert("Location Denied", "Can not continue, try again.", "OK"); 
       } 
      } 
      catch (Exception ex) 
      { 

      } 
     } 

マップがXamlに設定されている場合、どのように表示する前に許可を要求できますか?

答えて

1

コンストラクターの設定方法は、別のスレッドで実行されるタスクで許可要求を開始することです。これは、ユーザーが許可を与える前にInitializeComponent()がおそらく実行されることを意味します。問題は、コンストラクタを非同期メソッドにすることができないため、これを回避する簡単な方法がないことです。

InitializeComponent()をコンストラクタから "if(status == PermissionStatus.Granted)"ブロックに移動することができます。あなたはOnAppearing()それはおそらく、InitializeComponentの前に呼び出されるよう()に何をすべきか注意する必要があります。このアプローチでは

if (status == PermissionStatus.Granted) 
{ 
    Device.BeginInvokeOnMainThread(() => 
    { 
     InitializeComponent() 
    }); 
} 

:それはおそらく、次のようになります。その時点でいずれのUIコンポーネントにもアクセスしようとすると失敗します。

しかし、私はこれを処理するより良い方法は、あなたの許可要求コードを1レベル上に移動することだと思います。つまり、このページをインスタンス化しているクラスに配置します。次に、アクセスが許可されている場合はこのページを表示し、アクセスが拒否された場合はマップを持たない別のページを表示することができます。より良いユーザーエクスペリエンスを実現します。

+0

ありがとうございました。おそらく、C#で地図を作成する必要があります。そうでなければ、私はApp.cs.に許可を求めなければならないでしょう。地図ページは、メインページであるタブ付きページにあります。許可が拒否された場合、私は何かに渡すことができないようです。 – xerotolerant

+0

ねえ。ついにこのソリューションを試してみると、うまく動作しません。権限プラグインが機能していません。私はそれについて[ここ](http://stackoverflow.com/questions/41473975/xamarin-forms-android-permission-prompt-not-displaying)に関する質問を投稿できますか? – xerotolerant

+0

@xerotolerant提案した解決策で問題を解決できなかった場合は、これが受け入れられる回答ではありません。 – Demitrian

関連する問題