6

मैं अपने एंड्रॉइड एप्लिकेशन को फेसबुक लॉगिन करने के लिए फायरबेस दस्तावेज़ का उपयोग कर रहा हूं। मैं Google और ट्विटर का उपयोग कर उपयोगकर्ताओं को लॉगिन करने में सफलतापूर्वक सक्षम हूं। लेकिन जब मैं फेसबुक के साथ लॉगिन पर क्लिक करता हूं, तो बटन लॉगआउट बटन में बदल रहा है। दरअसल इसे लॉग इन सफलता गतिविधि पर रीडायरेक्ट करना चाहिए, क्योंकि मैंने FirebaseAuth.AuthStateListener कॉन्फ़िगर किया है।FirebaseAuthUserCollisionException?

मैं Activity पोस्ट कर रहा हूं, कृपया मुझे बताएं कि क्या मैं कुछ गलत कर रहा हूं।

public class MainActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener { 

    private static final String TAG = "MainActivity"; 
    private static final int GOOGLE_RC_SIGN_IN = 9001; 
    private static final int TWITTER_RC_SIGN_IN = 140; 

    private FirebaseAuth mAuth; 
    private FirebaseAuth.AuthStateListener mAuthStateListener; 

    private GoogleApiClient mGoogleApiClient; 
    CallbackManager callbackManager; 
    @BindView(R.id.google_signin_button) SignInButton mGoogleSigninButton; 
    @BindView(R.id.facebook_login_button) LoginButton mFacebookLoginButton; 
    @BindView(R.id.twitter_login_button) TwitterLoginButton mTwitterLoginButton; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     TwitterAuthConfig authConfig = new TwitterAuthConfig(getString(R.string.twitter_consumer_key), getString(R.string.twitter_consumer_secret)); 
     Fabric.with(this, new Twitter(authConfig)); 
     FacebookSdk.sdkInitialize(this); 
     setContentView(R.layout.activity_main); 

     ButterKnife.bind(MainActivity.this); 

     GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestIdToken(getString(R.string.default_web_client_id)) 
       .requestEmail() 
       .build(); 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .enableAutoManage(this,this) 
       .addApi(Auth.GOOGLE_SIGN_IN_API,gso) 
       .build(); 

     mAuth = FirebaseAuth.getInstance(); 
     mAuthStateListener = new FirebaseAuth.AuthStateListener(){ 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       FirebaseUser user = firebaseAuth.getCurrentUser(); 
       if (user != null) { 
        //User is signed in 
        Log.v(TAG, "Yo Baby"); 
        Log.d(TAG,"name"+user.getDisplayName()); 
        goToHome(); 
       } else { 
        //Do some logic 
       } 
      } 
     }; 

     mGoogleSigninButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent signinIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
       startActivityForResult(signinIntent, GOOGLE_RC_SIGN_IN); 
      } 
     }); 

     callbackManager = CallbackManager.Factory.create(); 
     mFacebookLoginButton.setReadPermissions("email", "public_profile"); 
     mFacebookLoginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
      @Override 
      public void onSuccess(LoginResult loginResult) { 
       handleFacebookAuthentication(loginResult.getAccessToken()); 
      } 

      @Override 
      public void onCancel() { 

      } 

      @Override 
      public void onError(FacebookException error) { 

      } 
     }); 

     mTwitterLoginButton.setCallback(new Callback<TwitterSession>() { 
      @Override 
      public void success(Result<TwitterSession> result) { 
       handleTwitterAuthentication(result.data); 
      } 

      @Override 
      public void failure(TwitterException exception) { 

      } 
     }); 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == GOOGLE_RC_SIGN_IN){ 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      if (result.isSuccess()) { 
       GoogleSignInAccount account = result.getSignInAccount(); 
       handleGoogleAuthentication(account); 
      } else { 
       //Google Login Failed 
      } 
     } else if (requestCode == TWITTER_RC_SIGN_IN) { 
      mTwitterLoginButton.onActivityResult(requestCode,resultCode,data); 
     } else { 
      callbackManager.onActivityResult(requestCode,resultCode,data); 
     } 
    } 

    private void handleGoogleAuthentication(GoogleSignInAccount account) { 
     AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null); 
     mAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
      @Override 
      public void onComplete(@NonNull Task<AuthResult> task) { 
       if (task.isSuccessful()) { 
        //Save Credentials in Google Smart Lock 
       } else { 
        // 
       } 
      } 
     }); 
    } 

    private void handleFacebookAuthentication(AccessToken accessToken) { 
     AuthCredential credential = FacebookAuthProvider.getCredential(accessToken.getToken()); 
     mAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
      @Override 
      public void onComplete(@NonNull Task<AuthResult> task) { 
       if (task.isSuccessful()) { 
        //Save Credentials in Google Smart Lock 
       } else { 

       } 
      } 
     }); 
    } 

    private void handleTwitterAuthentication(TwitterSession session) { 
     AuthCredential credential = TwitterAuthProvider.getCredential(session.getAuthToken().token, session.getAuthToken().secret); 
     mAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
      @Override 
      public void onComplete(@NonNull Task<AuthResult> task) { 
       if (task.isSuccessful()) { 
        //Save credentials in Google Smart lock 
       } else { 

       } 
      } 
     }); 
    } 
    private void goToHome() { 
     startActivity(new Intent(MainActivity.this, HomeActivity.class)); 
     finish(); 
     return; 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     mAuth.addAuthStateListener(mAuthStateListener); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     if (mAuthStateListener != null) { 
      mAuth.removeAuthStateListener(mAuthStateListener); 
     } 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 
} 

Update1

अंत में मैं कारण है कि फेसबुक लॉगिन काम नहीं कर रहा समझा। ऐसा इसलिए है क्योंकि मैंने Google साइनइन का उपयोग करके ऐप में पहले ही लॉग इन किया है। चूंकि Google और Facebook के लिए मेरा ईमेल समान है, इसलिए यह FirebaseAuthUserCollisionException दे रहा है। Stackoverflow में प्रश्न पोस्ट करने से पहले मुझे एप्लिकेशन को डीबग किया जाना चाहिए था।

Update2

मैं इस सवाल यह कोई है जो मुझे पसंद स्थिति का सामना करना पड़ा मदद मिल सकती है के रूप में बंद करने नहीं कर रहा हूँ। और मैं FirebaseAuthUserCollisionException के लिए समाधान भी अपडेट करूंगा, क्योंकि मैं इसमें अधिक खोदता हूं।

+0

कैसे आप टक्कर त्रुटि संभाल किया? क्या आप दोनों प्रदाताओं को एक फायरबेस खाते में विलय करने में सक्षम हैं? –

उत्तर

0

FirebaseAuthUserCollisionException के बारे में: विभिन्न प्रमाणीकरण प्रदाताओं के साथ एक ही ईमेल पते का उपयोग कर कई खाते बनाने से https://developers.google.com/android/reference/com/google/firebase/auth/FirebaseAuthUserCollisionException

रोकथाम उपयोगकर्ताओं। देखें https://support.google.com/firebase/answer/6400716

8

मुझे एक ही समस्या का सामना करना पड़ा और इस तरह मैं इसके साथ मिल गया।
यदि कार्य सफल नहीं है, तो मैं जांच कर रहा हूं कि अपवाद फेंक दिया गया है instanceof FirebaseAuthUserCollisionException। यदि हां, तो उपयोगकर्ता को एक टोस्ट प्रदर्शित किया जाता है जिसमें कहा गया है कि 'ईमेल वाला खाता पहले से मौजूद है!'।

private void handleFacebookAccessToken(final AccessToken token) { 
    Log.d(TAG, "handleFacebookAccessToken:" + token); 

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken()); 
    mAuth.signInWithCredential(credential) 
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 

        if (!task.isSuccessful()) { 
         Log.w(TAG, "signInWithCredential", task.getException()); 
         Toast.makeText(getApplicationContext(), "Firebase Facebook login failed", 
           Toast.LENGTH_SHORT).show(); 

         if(task.getException() instanceof FirebaseAuthUserCollisionException) { 
          Toast.makeText(getApplicationContext(), "User with Email id already exists", 
            Toast.LENGTH_SHORT).show(); 
         } 
         LoginManager.getInstance().logOut(); 
        } 
       } 
      }); 
} 

क्रेडिट: Check if given email exists

+0

वैसे भी एक अच्छा कामकाज। कुडोस! – sud007

संबंधित मुद्दे

 संबंधित मुद्दे