2017-06-20 18 views
0

これについての研究が終わってから、私はこれをやろうとしてきました。私はさらにいくつかの必要な改善を行い、これは私が持っているものです。私は正常にログインすることができましたが、次にやりたいことはFirebaseに記録されたユーザーを表示させることです。それは私が何時間も苦労してきたことです。Xamarin.Droid Facebook認証付きFirebase

私のコードfirebaseAuth.SignInWithCredential(credential).AddOnCompleteListener(this, new IOnCompleteListener<IAuthResult>());からこの行を削除すると、正常にログインできますが、ユーザーはFirebaseに表示されません。

firebaseAuth.SignInWithCredential(credential).AddOnCompleteListener(this, new IOnCompleteListener<IAuthResult>());を含めるとがSystem.NullReferenceExceptionにスローされましたと私は実際にどこからエラーが発生しているのかわかりません。助けてください。

ありがとうございます。

public class LoginActivity : BaseActivity, IFacebookCallback, IAuthStateListener, IOnCompleteListener 

    { 
     private ICallbackManager mCallbackManager; 
     private Firebase.Auth.FirebaseAuth firebaseAuth; 
     private IOnCompleteListener listener; 
     public static FirebaseApp app; 

    private Firebase.Auth.FirebaseAuth.IAuthStateListener firebaseAuthListener; 

    protected override void OnCreate(Bundle savedInstanceState) 
    { 

     base.OnCreate(savedInstanceState); 
     FacebookSdk.SdkInitialize(this.ApplicationContext); 

     LoginButton button = FindViewById<LoginButton>(Resource.Id.login_button); 

     button.SetReadPermissions("email","public_profile"); 

     mCallbackManager = CallbackManagerFactory.Create(); 

     button.RegisterCallback(mCallbackManager, this); 

    } 

    public void handleFacebookAccessToken(AccessToken accessToken) 
    { 
     AuthCredential credential = FacebookAuthProvider.GetCredential(accessToken.Token); 
     firebaseAuth.SignInWithCredential(credential).AddOnCompleteListener(this, new IOnCompleteListener<IAuthResult>()); 

    }                                    


    public void OnAuthStateChanged(Firebase.Auth.FirebaseAuth auth) 
    { 
     FirebaseUser user = firebaseAuth.CurrentUser; 
     if (user != null) 
     { 

      Console.WriteLine("The current user is " + firebaseAuth.CurrentUser); 

     } 

     Console.WriteLine("The current user is " + firebaseAuth.CurrentUser); 

    } 


    public void OnCancel() 
    { 
     throw new NotImplementedException(); 
    } 

    public void OnError(FacebookException p0) 
    { 
     throw new NotImplementedException(); 
    } 

    public void OnSuccess(Java.Lang.Object result) 
    { 
     LoginResult loginResult = result as LoginResult; 
     handleFacebookAccessToken(loginResult.AccessToken); 
     Console.WriteLine("My token is" + loginResult.AccessToken); 

    } 

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) 

    { 
     base.OnActivityResult(requestCode, resultCode, data); 
     mCallbackManager.OnActivityResult(requestCode, (int)resultCode, data); 
    } 


    protected override void OnStart(){ 
     base.OnStart(); 
     // firebaseAuth.AddAuthStateListener(firebaseAuthListener); 
    } 

    protected override void OnStop(){ 
     base.OnStop(); 
     // firebaseAuth.RemoveAuthStateListener(firebaseAuthListener); 
    } 

     private class IOnCompleteListener<T> : IOnCompleteListener 
     { 
      public IntPtr Handle => throw new NotImplementedException(); 

      public void Dispose() 
      { 
       throw new NotImplementedException(); 
      } 

      public void OnComplete(Android.Gms.Tasks.Task task) 
      { 
       if (!task.IsSuccessful) 
       { 

       } 
       else 
       { 


       } 
      } 
     } 
    } 

} 

答えて

1

は、私はあなたのLoginActivityためIOnCompleteListenerを実装しようとしたことを見たが、私は、あなたがAndroid.Gms.Tasks.IOnCompleteListenerを実装しましたことを確認してください、あなたのコード内でpublic void OnComplete(Task task)を見つけられませんでした、あなたはこれを行う場合は、あなたをコードfirebaseAuth.SignInWithCredential(credential).AddOnCompleteListener(this, new IOnCompleteListener<IAuthResult>());firebaseAuth.SignInWithCredential(credential).AddOnCompleteListener(this, this);に変更するだけです。

私のデモされた後、それは私の側で動作します:

[Activity(Label = "Activity3", Exported = true)] 
[IntentFilter(new[] { Intent.ActionView }, 
DataScheme = "@string/fb_login_protocol_scheme"),] 
public class Activity3 : Activity, IFacebookCallback, IOnCompleteListener 
{ 
    private ICallbackManager mCallbackManager; 
    private FirebaseAuth mAuth; 

    protected override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 

     FacebookSdk.SdkInitialize(this.ApplicationContext); 
     // Create your application here 
     SetContentView(Resource.Layout.layout3); 

     FirebaseApp.InitializeApp(this); 
     mAuth = FirebaseAuth.Instance; 

     LoginButton fblogin = FindViewById<LoginButton>(Resource.Id.fblogin); 
     fblogin.SetReadPermissions("email", "public_profile"); 

     mCallbackManager = CallbackManagerFactory.Create(); 
     fblogin.RegisterCallback(mCallbackManager, this); 
    } 

    private void handleFacebookAccessToken(AccessToken accessToken) 
    { 
     AuthCredential credential = FacebookAuthProvider.GetCredential(accessToken.Token); 
     mAuth.SignInWithCredential(credential).AddOnCompleteListener(this, this); 
    } 

    //facebook IFacebookCallback implementation 
    public void OnSuccess(Java.Lang.Object p0) 
    { 
     LoginResult loginResult = p0 as LoginResult; 
     handleFacebookAccessToken(loginResult.AccessToken); 
    } 

    public void OnCancel() 
    { 
    } 

    public void OnError(FacebookException p0) 
    { 
    } 

    //firebase IOnCompleteListener implementation 
    public void OnComplete(Task task) 
    { 
     if (task.IsSuccessful) 
     { 
      FirebaseUser user = mAuth.CurrentUser; 
     } 
     else 
     { 
      Toast.MakeText(this, "Authentication failed.", ToastLength.Short).Show(); 
     } 
    } 

    // acitivity lifecycle 
    protected override void OnStart() 
    { 
     base.OnStart(); 
     FirebaseUser currentUser = mAuth.CurrentUser; 
    } 

    protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data) 
    { 
     base.OnActivityResult(requestCode, resultCode, data); 
     var resultCodeNum = 0; 
     switch (resultCode) 
     { 
      case Result.Ok: 
       resultCodeNum = -1; 
       break; 

      case Result.Canceled: 
       resultCodeNum = 0; 
       break; 

      case Result.FirstUser: 
       resultCodeNum = 1; 
       break; 
     } 
     mCallbackManager.OnActivityResult(requestCode, resultCodeNum, data); 
    } 
} 
+0

がmucccchhhので、ありがとう!あなたはこれに値する – Switz