2016-12-02 10 views
2

私のアプリケーションの実行時にアクセス許可をリクエストしようとしています。私はポータブルクラスとAndroidの間で話すためにサービスプロバイダを使います。クラス内でAndroidのアクセス許可を要求しています(Xamarin)

私はPCLでボタンを押すにこのコードを呼び出すことによって開始します。しかし、私はCheckSelfPermissionRequestPermissions上の2つのエラーを取得

public class AndroidLocationHelper : ILocationHelper, ILocationListener 
    { 

     readonly string[] PermissionsLocation = 
     { 
      Manifest.Permission.AccessCoarseLocation 
     }; 
     const int RequestLocationId = 0; 

public void GetLocation(SearchViewModel viewModel) 
     { 
      try 
      { 
       const string permission = Manifest.Permission.AccessCoarseLocation; 
       if (((int)Build.VERSION.SdkInt < 23) || (CheckSelfPermission(permission) == Permission.Granted)) 
       { 
       } 
       else 
        RequestPermissions(PermissionsLocation, RequestLocationId); 
      } 
      catch (Exception ex) 
      { 
       Debug.WriteLine("Error while getting Location service"); 
       Debug.WriteLine(ex.Message); 
       Messaging.AlertUser("There was an error with determining your location"); 
      } 
     } 

using (new Busy(this)) 
       { 
        var locationHelper = scope.Resolve<ILocationHelper>(); 
        locationHelper.GetLocation(this); 
       } 

これは私のAndroidのレベルのサービスを呼び出します。これらの2つの方法はアクティビティでのみ使用できます。コードはMainActivityで正常に動作します。しかし、ユーザーがボタンを押したときのアクセス許可は、OnCreateまたはOnResumeなどではなく、尋ねたいと思います。

ありがとうございました。

答えて

1

あなたはこのように、アプリケーション・コンテキストを渡し、ContextCompat.CheckSelfPermissionで試すことができます。

ContextCompat.CheckSelfPermission(Android.App.Application.Context, permission)

更新

を活動の参照が必要ですActivityCompat.RequestPermissionsの場合は、あなたはを追跡することができます現在のアクティビティ"CurrentActivityPlugin"と呼ばれる非常に便利なライブラリがあります。 https://github.com/jamesmontemagno/CurrentActivityPlugin

+0

それはCheckSelfPermission' 'で働いていたように見えますが、' RequestPermissions'が必要です'ActivityCompat.RequestPermissions(これは、PermissionsLocation、RequestLocationId)のようなものです。 '。 「this」のために何を渡すべきかについてのアイデア。 –

+0

現在の活動を追跡できます。私はこの便利なライブラリを使用しています:https://github.com/jamesmontemagno/CurrentActivityPlugin –

+0

ハ、私がデバイスレベルでこれをやっている理由は、その余分なPCLのnugetパッケージを使用しないようにすることです。 –

1

ラファエルが解決策を思いついたが、別のオプションが見つかったが、ちょうどMessagingCenterを使っている。 MainActivityOnCreateにすべてのロケーションコードを実行する受信者を追加すると、すべてのアクティビティメソッドにアクセスできるようになります(MainActivityに位置情報サービスに関するチュートリアルがあります)。次に、サービス(クラス)内にSendを追加します。あなたのAndroidプロジェクトで

1

、あなたがこれを使用すると、後でXamarin.Forms PCLプロジェクトでそれを呼び出すように依存関係サービスを使用することができます。

var thisActivity = Forms.Context as Activity; 
ActivityCompat.RequestPermissions(thisActivity, new string[] { 
Manifest.Permission.AccessFineLocation }, 1); 
ActivityCompat.RequestPermissions(thisActivity, 
new String[] { Manifest.Permission.AccessFineLocation }, 
1); 
関連する問題